【问题标题】:Limit listed Kubernetes namespaces by access通过访问限制列出的 Kubernetes 命名空间
【发布时间】:2019-11-27 18:57:29
【问题描述】:

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

服务帐号

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

我希望只看到 devqa 命名空间出现。我在这里遗漏了什么吗?

【问题讨论】:

    标签: kubernetes rbac


    【解决方案1】:

    list 操作失败,因为您使用 ClusterRole 中的 resourceNames 字段来限制命名空间对象也授予访问权限,但 list 将返回 all 命名空间对象。

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

    要实现这一点,您必须在要授予用户访问权限的命名空间中创建角色(或 ClusterRole)和 RoleBindings。

    您可以通过以下方式为 dev-team 用户授予对 devqa 命名空间中所有资源的访问权限,但拒绝访问任何其他命名空间中的任何资源。

    创建一个 ClusterRole(您也可以在 devqa 命名空间中创建一个角色,但是使用 ClusterRole 允许您只定义一次权限,然后从多个 RoleBindings 中引用它):

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

    devqa 命名空间中创建 RoleBinding:

    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
    

    Kubernetes RBAC documentation

    编辑

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

    无法使用 RBAC 执行此操作。你需要某种形式的auditing

    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)。

    【讨论】:

    • 感谢您的详细解释。我需要识别用户创建或有权访问的所有命名空间。有没有办法根据 RBAC 规则列出它?
    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2021-01-29
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多