You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

启用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

火山引擎 最新活动