The list操作失败,因为您正在使用resourceNames
ClusterRole 中的字段来限制命名空间对象也授予访问权限,但是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
) 如所须。