LinuxKubernetes安全机制教程_RBAC权限控制实践

8次阅读

RBAC 是 Kubernetes 最核心的安全机制,通过 Role/ClusterRole 定义权限、RoleBinding/ClusterRoleBinding 关联主体与角色、Subject 标识请求者、Resource 指定操作对象,实现最小权限控制。

LinuxKubernetes 安全机制教程_RBAC 权限控制实践

RBAC(基于角色的访问控制)是 Kubernetes 中最核心、最常用的安全机制,它通过定义角色(Role/ClusterRole)和角色绑定(RoleBinding/ClusterRoleBinding),精细控制用户或服务账户对集群资源的操作权限。

理解 RBAC 的四个关键对象

Kubernetes RBAC 体系围绕四个基础对象构建,缺一不可:

  • Subject(主体):请求操作的“谁”,可以是用户(如 alice)、组(如 system:authenticated)或服务账户(如 default);
  • Role / ClusterRole(角色):定义“能做什么”,即一组 API 权限规则。Role 作用于单个命名空间,ClusterRole 是集群范围的;
  • RoleBinding / ClusterRoleBinding(角色绑定):把 Subject 和 Role/ClusterRole 关联起来,明确“谁在什么范围内拥有哪些权限”;
  • Resource(资源):权限作用的对象,例如 podsdeploymentssecrets,支持子资源(如 pods/log)。

创建最小权限的服务账户并授权

生产环境中应避免使用默认 serviceaccount 或高权限用户。推荐为每个应用或运维任务单独建服务账户,并按需授予权限:

1. 创建专用服务账户:

kubectl create serviceaccount app-reader -n myapp

2. 定义只读 Role(仅限 myapp 命名空间):

apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata:   namespace: myapp   name: pod-reader rules: - apiGroups: [""]   resources: ["pods","pods/log"]   verbs: ["get","list","watch"]

3. 绑定服务账户到该 Role:

apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata:   name: read-pods   namespace: myapp subjects: - kind: ServiceAccount   name: app-reader   namespace: myapp roleRef:   kind: Role   name: pod-reader   apiGroup: rbac.authorization.k8s.io

4. 在 Pod 中引用该服务账户:

spec:   serviceAccountName: app-reader

区分 RoleBinding 与 ClusterRoleBinding 的使用场景

权限范围决定绑定方式,选错会导致权限失效或过度开放:

  • 若只需访问某命名空间内的资源(如开发人员管理自己项目的 Deployment),用 Role + RoleBinding
  • 若需跨命名空间操作(如监控系统读取所有命名空间的 Pods),必须用 ClusterRole + ClusterRoleBinding
  • 注意:ClusterRole 本身不等于“超级权限”,它只是 作用域 更广;实际权限仍取决于 rules 中定义的 verbs 和 resources;
  • 内置 ClusterRole(如 vieweditcluster-admin)可直接复用,但 cluster-admin 等同于 root,禁止随意绑定。

验证与调试 RBAC 权限问题

权限配置后常遇到 Forbidden 错误,可通过以下方式快速定位:

  • kubectl auth can-i 模拟检查(支持 –as 指定用户或服务账户):
# 检查当前用户能否在 default 命名空间列出 pods kubectl auth can-i list pods 

检查服务账户 app-reader 是否能获取 logs

kubectl auth can-i get pods/log -n myapp --as=system:serviceaccount:myapp:app-reader

  • 查看绑定关系:kubectl get rolebindings,clusterrolebindings --all-namespaces
  • 检查服务账户的 token 是否被正确挂载到 Pod 中(ls /var/run/secrets/kubernetes.io/serviceaccount/);
  • 注意:API server 日志中会记录拒绝详情(需开启 audit log),但日常排查优先用 can-i

text=ZqhQzanResources