通过访问限制列出的 Kubernetes 命名空间

2024-04-15

我有一套users(dev-team)谁只需要访问dev and qa命名空间。我创建了一个服务帐户、集群角色和集群角色绑定,如下所示。

服务帐号

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dev-team

集群角色

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: dev-team-users
rules:
  - apiGroups: ["rbac.authorization.k8s.io",""]
    resources: ["namespaces"]
    resourceNames: ["dev","qa"]
    verbs: ["get","list","create"]

集群角色绑定

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: dev-team-user-bindings
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: dev-team-users
subjects:
- kind: User
  name: dev-team
  namespace: kube-system
  apiGroup: rbac.authorization.k8s.io

当我尝试验证访问时kubectl get namespaces --as=dev-team

我收到以下错误消息

Error from server (Forbidden): namespaces is forbidden: User "dev-team" cannot list resource "namespaces" in API group "" at the cluster scope

我期待只看到dev and qa要显示的名称空间。我在这里错过了什么吗?


The list操作失败,因为您正在使用resourceNamesClusterRole 中的字段来限制命名空间对象也授予访问权限,但是list会回来all命名空间对象。

但我猜你真正想要的是限制对资源的访问in命名空间,而不是命名空间对象本身(它们包含的信息并不比命名空间的名称多)。

为此,您必须在要向用户授予访问权限的命名空间中创建角色(或 ClusterRole)和 RoleBinding。

以下是您如何授予对所有资源的访问权限dev-team用户在dev and qa名称空间,但拒绝访问任何其他名称空间中的任何资源。

创建 ClusterRole(您也可以在dev and qa命名空间,但使用 ClusterRole 允许您仅定义一次权限,然后从多个 RoleBinding 引用它):

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: dev-team-users
rules:
- apiGroups:
    - '*'
  resources:
  - '*'
  verbs:
  - '*'

在两者中创建 RoleBindingdev and qa命名空间:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: dev-team-user-bindings
  namespace: dev
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: dev-team-users
subjects:
- kind: User
  name: dev-team
  apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: dev-team-user-bindings
  namespace: qa
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: dev-team-users
subjects:
- kind: User
  name: dev-team
  apiGroup: rbac.authorization.k8s.io

测试访问:

kubectl get pods -n qa --as=dev-team           # Succeeds
kubectl get pods -n dev --as=dev-team          # Succeeds
kubectl get pods -n default --as=dev-team      # Fails
kubectl get pods -n kube-system --as=dev-team  # Fails

See Kubernetes RBAC 文档 https://kubernetes.io/docs/reference/access-authn-authz/rbac/.

EDIT

1. 识别用户创建的命名空间

使用 RBAC 无法做到这一点。你需要某种形式的auditing https://kubernetes.io/docs/tasks/debug-application-cluster/audit/.

2. 识别用户有权访问的命名空间

使用 RBAC 也无法轻松做到这一点。但是您可以迭代所有名称空间并测试给定用户是否具有访问权限:

for n in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do
  echo -n "$n: "
  kubectl auth can-i get pods -n "$n" --as=dev-team
done

您可以改变动词/资源部分(例如get pods) 如所须。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过访问限制列出的 Kubernetes 命名空间 的相关文章

随机推荐

  • 检查正在使用的应用程序版本[重复]

    这个问题在这里已经有答案了 可能的重复 如何向用户显示我的App当前的项目版本 https stackoverflow com questions 1492351 how to display the current project ver
  • Google 表格搜索值并返回存在该值的多行的某些列

    我正在寻找一个可以执行以下操作的公式 在 E I 列中查找一个值 并从该值所在的行中返回 B D 列中的所有值 示例 寻找S190202 它将从第 2 5 6 行返回 B D QUERY A1 I select B C D where E
  • 在持续集成中运行的测试中应如何设置功能切换?

    使用功能切换时如何进行测试 您希望您的开发计算机尽可能接近生产 从我观看的视频来看 功能切换的实现方式是允许某些人 使用 该功能 即 0 到 100 的用户或选定的用户等 为了正确进行持续集成 在测试时是否必须使用与生产服务器相同的功能切换
  • jquery 从 DOM 获取非唯一 ID

    假设我有这两个唯一 ID 的 div 其输入元素不是唯一 ID 的输入 div div
  • 列表视图中的多重绑定

    我有一个包含几列的 ListView 我可以将每个 GridViewColumn 绑定到一个属性 例如
  • 为什么align-end在vuetify中不起作用

    我使用 vuetify 布局 我想在右侧制作按钮 但我发现align end这是 vuetify 属性不起作用 我使用offset xs9使按钮位于右侧 但按钮位于中间v flex 怎样才能做到最后呢 帮助谢谢 代码如下 div div
  • 如何获取textView可以在Android中显示的数字线

    我想知道 textView 可以显示的数轴 我可以在一行中获取数字字符 int maxVisibleChars textView getPaint breakText text true textView getMeasuredWidth
  • Meteor Subscribe 不更新集合的排序顺序

    Snippet from Template div class post container each elements gt post element this each div Snippet from Client Meteor su
  • 哪个更高效?更多核心或更多 CPU

    我意识到这更多的是一个硬件问题 但这也与软件非常相关 特别是在多线程多核 CPU 环境编程时 哪个更好 为什么 无论是效率 速度 生产力 可用性等 1 具有 4 个四核 CPU 的计算机 服务器 or 2 具有 16 个单核 CPU 的计算
  • 取消指纹扫描仪

    我正在开发一个具有安全功能 包括 PIN 和指纹 的程序 但现在我在输入密码 PIN 或指纹 时遇到问题 加入正确的指纹没问题 但是当我输入 PIN 码时 在退出 PIN 和指纹活动后 机器会继续侦听指纹 我知道这一点 因为当我单击 主页
  • Laravel 选项选择 - 默认问题

    这是我的选择框 所有公司都将加载到这里 但我想将特定公司显示为默认选择我在会议上有这个 这是我的代码 sessioncompany ABCcompany comp Company foreach company list as row en
  • 如何通过 HTML 输入标签获取文件的引用? (角度2)

    我想在 Firebase 中上传图片 但要做到这一点 我必须先获取文件 例如 如何通过 HTML 获取我的计算机的图像 我正在尝试这样做 但我不知道这样做的回报是什么 帮帮我吧伙计们
  • 为什么 t-sql 的 LEN() 函数忽略尾随空格?

    MSDN上LEN 函数的说明 http msdn microsoft com en us library ms190329 aspx 返回指定字符串表达式的字符数 排除尾随空格 为什么 LEN 函数设计成这样工作 这种行为解决了什么问题 有
  • Android素材L图像过渡插值器

    这更多的是一个数学问题而不是编程问题 好吧 我想问一下你知道Material design中描述的插值器是什么 它看起来是一个AccelerateDecelerateInterpolator但减速效果衰减较慢 我最好的孵化是 public
  • 通过 Google Drive API 获取共享链接

    我正在使用 Google Drive 开发一个应用程序 我希望用户能够通过链接共享文件 将权限设置为anyone and withLink如中所述谷歌开发者文档 https developers google com drive v2 re
  • .cpp 文件中的模板专业化 + .h 文件中的主模板声明

    根据https eel is c draft temp expl spec 7 https eel is c draft temp expl spec 7 如果模板 成员模板或类模板的成员被显式特化 则在每个翻译单元中 该特化的声明应可从该
  • 使用 VBA 在 Excel 2010 中查询表 (QueryTables) 使用 VBA 创建许多连接

    我正在跟踪在另一个网站上找到的代码 这是我的代码的基础知识 Dim SQL As String Dim connString As String connString ODBC DSN DB01 UID PWD Database MyDat
  • jQuery 日期选择器不适用于 ajax 生成的输入字段

    我有一个输入字段 它是通过 Ajax 从服务器端生成的 并插入到当前页面中 我的问题是 当通过 Ajax 生成输入字段时 jQuery 日期选择器无法在输入字段上工作 但当字段直接放置在页面中时它可以工作 下面 我提供了代码的缩小版本 HT
  • 设置文件名并在新选项卡中打开 blob pdf 类型[重复]

    这个问题在这里已经有答案了 我正在尝试在浏览器的新选项卡中打开 blob 字节流 它是有效的 但我不确定如何设置文件名 以便每个文档在下载时都有唯一的名称 现在 文档在保存时默认为 document pdf var blob new Blo
  • 通过访问限制列出的 Kubernetes 命名空间

    我有一套users dev team 谁只需要访问dev and qa命名空间 我创建了一个服务帐户 集群角色和集群角色绑定 如下所示 服务帐号 apiVersion v1 kind ServiceAccount metadata name