启用RBAC后新用户未绑定角色却能查看K8s所有资源,求助排查
我帮你找到了问题的核心:你创建nonadmin用户时生成的证书,其Subject里的Organization(O字段)应该被设置成了system:masters——这个是Kubernetes内置的超级管理员组,任何属于该组的用户都会自动被绑定cluster-admin权限,所以哪怕你没手动给用户加角色绑定,它也能直接查看(甚至操作)所有集群资源。
1. 先确认问题根源
先验证下这个用户的权限范围,执行这条命令:
kubectl auth can-i '*' '*' --as nonadmin
如果返回yes,就坐实了这个用户确实拥有全局最高权限,问题肯定出在证书的O字段上。
2. 重新生成正确的用户证书
要创建一个受RBAC管控的普通用户,必须在生成CSR时指定非system:masters的组织字段,具体步骤如下:
第一步:创建正确的CSR配置文件
新建(或修改)nonadmin-csr.json,注意O字段不要用system:masters:
{ "CN": "nonadmin", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", // 替换成你的国家代码 "L": "Beijing", // 替换成你的城市 "O": "nonadmin-users", // 自定义组名,不要用system:masters "OU": "dev-team" // 自定义组织单元 } ] }
第二步:重新生成证书
用cfssl重新签发证书:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes nonadmin-csr.json | cfssljson -bare nonadmin
第三步:更新kubectl配置里的用户证书
把新生成的证书同步到kubectl的配置中:
kubectl config set-credentials nonadmin --client-certificate=nonadmin.pem --client-key=nonadmin-key.pem
3. 验证RBAC是否生效
切换回nonadmin上下文,尝试查看资源:
kubectl config use-context nonadmin kubectl get pods --all-namespaces
这时候应该会返回Forbidden错误,说明RBAC已经开始生效,用户没有默认权限了。
4. 给用户绑定所需权限
现在你可以根据业务需求给nonadmin绑定合适的角色,举两个常见例子:
例子1:仅允许查看default命名空间的资源
kubectl create rolebinding nonadmin-default-view --clusterrole=view --user=nonadmin -n default
例子2:允许查看所有命名空间的资源
先创建一个ClusterRoleBinding配置文件crb-nonadmin-view.yml:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: nonadmin-cluster-view subjects: - kind: User name: nonadmin apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: view apiGroup: rbac.authorization.k8s.io
然后执行创建命令:
kubectl create -f crb-nonadmin-view.yml
再次验证:
kubectl get pods --all-namespaces
这时候就能正常查看资源,但无法执行创建、删除等修改类操作,符合RBAC的管控预期。
额外说明
Kubernetes的RBAC会优先识别证书里的O(用户组)和CN(用户名),其中system:masters是内置的超级管理员组,K8s默认给这个组绑定了cluster-admin的ClusterRoleBinding,这也是你之前明明启用了RBAC,但用户仍能无限制访问资源的根本原因。
内容的提问来源于stack exchange,提问作者papu




