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

Nir*_*jan 6 rbac kubernetes

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

服务帐号

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dev-team
Run Code Online (Sandbox Code Playgroud)

集群角色

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"]
Run Code Online (Sandbox Code Playgroud)

集群角色绑定

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
Run Code Online (Sandbox Code Playgroud)

当我尝试验证访问权限时 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
Run Code Online (Sandbox Code Playgroud)

我期待只看到devqa命名空间出现。我在这里错过了什么吗?

wei*_*eld 13

名单是因为您所使用的操作失败resourceNames的ClusterRole领域限制的命名空间对象授予访问权限太多,但名单将返回所有的命名空间对象。

但我猜你真正想要的是限制访问的资源一个命名空间,而不是命名空间对象本身(包含超过命名空间的名称没有更多的信息)。

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

下面介绍了如何授予dev-team用户访问devqa命名空间中的所有资源但拒绝访问任何其他命名空间中的任何资源的方法。

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

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: dev-team-users
rules:
- apiGroups:
    - '*'
  resources:
  - '*'
  verbs:
  - '*'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

测试访问:

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
Run Code Online (Sandbox Code Playgroud)

请参阅Kubernetes RBAC 文档

编辑

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

不能用 RBAC 做到这一点。您将需要某种形式的审计

2. 确定用户有权访问的命名空间

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

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: dev-team-users
rules:
- apiGroups:
    - '*'
  resources:
  - '*'
  verbs:
  - '*'
Run Code Online (Sandbox Code Playgroud)

您可以根据需要更改动词/资源部分(例如get pods)。