2. Kubernetes RBAC 基础:Role、ClusterRole、RoleBinding、ClusterRoleBinding

在 Helm Chart 接入集群的权限边界设计中,RBAC(基于角色的访问控制)是 Kubernetes 原生的授权机制。理解 Role、ClusterRole、RoleBinding、ClusterRoleBinding 四个核心资源,是构建最小权限原则和审计链路的基础。本节从资源作用域、绑定关系、权限聚合三个维度展开。

2.1 核心概念与作用域

Kubernetes RBAC 将权限分为两个维度:资源作用域(命名空间级 vs 集群级)和权限主体(User、Group、ServiceAccount)。四个资源的关系如下表:

资源类型 作用域 定义权限 绑定目标 典型用途
Role 命名空间(Namespace) 对特定命名空间内资源的操作规则 同一命名空间内的主体 限制 Chart 部署的 Pod 只能读写本命名空间的 ConfigMap
ClusterRole 集群全局 对集群范围资源(Node、PV、ClusterRole 等)或跨命名空间资源的操作规则 集群级别或通过 RoleBinding 限定命名空间 Helm 安装器需要读取所有命名空间的 StorageClass
RoleBinding 命名空间 将 Role 或 ClusterRole 绑定到主体,权限仅在该命名空间生效 User / Group / ServiceAccount 将只读 Role 授予 Chart 中的 ServiceAccount
ClusterRoleBinding 集群全局 将 ClusterRole 绑定到主体,权限在整个集群生效 User / Group / ServiceAccount 为集群管理员 ServiceAccount 授予超级权限
关键区别:RoleBinding 引用 ClusterRole 时,权限会被“裁剪”到该命名空间内——即主体只能操作该命名空间下的资源,即使 ClusterRole 定义了集群范围的权限。这是 Helm Chart 实现多租户隔离的常用模式。

2.2 权限对象关系图

下图展示了四种 RBAC 资源之间的绑定关系与作用域边界:

Kubernetes RBAC 四类资源关系图 RBAC 资源绑定关系与作用域 Role 作用域:命名空间 定义:get pods, list services ClusterRole 作用域:集群全局 定义:get nodes, list pv RoleBinding 作用域:命名空间 绑定:Role → ServiceAccount ClusterRoleBinding 作用域:集群全局 绑定:ClusterRole → User ServiceAccount 命名空间内主体 User / Group 集群外部身份 ClusterRole 通过 RoleBinding 引用时,权限被裁剪到命名空间 权限聚合规则: 1. RoleBinding 只能引用同一命名空间的 Role,或引用 ClusterRole(权限降级为命名空间级)。 2. ClusterRoleBinding 只能引用 ClusterRole,权限保持集群级。

2.3 权限规则定义语法

Role 和 ClusterRole 使用相同的 rules 字段结构,区别仅在于资源作用域。以下是一个 Helm Chart 中常见的只读 Role 定义:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: my-app
  name: my-app-reader
rules:
- apiGroups: [""]          # 核心 API 组
  resources: ["pods", "services", "configmaps"]
  verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
  resources: ["deployments", "statefulsets"]
  verbs: ["get", "list"]

ClusterRole 示例——允许读取集群范围的节点和存储类:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-storage-viewer
rules:
- apiGroups: [""]
  resources: ["nodes", "persistentvolumes"]
  verbs: ["get", "list"]
- apiGroups: ["storage.k8s.io"]
  resources: ["storageclasses"]
  verbs: ["get", "list"]

2.4 绑定关系与主体映射

RoleBinding 和 ClusterRoleBinding 将权限授予主体。主体可以是:

  • User:外部认证用户(如 OIDC 登录用户),通常用于集群管理员审计。
  • Group:用户组,用于批量授权。
  • ServiceAccount:Kubernetes 内部身份,是 Helm Chart 中最常用的主体类型。

以下是将只读 Role 绑定到 Chart 中 ServiceAccount 的 RoleBinding:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-app-read-binding
  namespace: my-app
subjects:
- kind: ServiceAccount
  name: my-app-sa
  namespace: my-app
roleRef:
  kind: Role
  name: my-app-reader
  apiGroup: rbac.authorization.k8s.io

使用 ClusterRoleBinding 将集群管理员权限授予外部用户:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-binding
subjects:
- kind: User
  name: "ops-admin@example.com"
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

2.5 权限聚合与 Helm Chart 最佳实践

在 Helm Chart 中,RBAC 资源通常放在 templates/ 目录下,通过 .Values.rbac 控制是否创建。以下是权限聚合的三种模式:

模式 适用场景 实现方式 审计要点
最小权限模式 普通应用 Chart 只创建 Role + RoleBinding,限定在 Chart 所在命名空间 检查 verbs 是否包含不必要的 create/delete
跨命名空间模式 监控、日志收集器 创建 ClusterRole + RoleBinding(在每个目标命名空间创建) 确认 RoleBinding 只绑定到需要的命名空间
集群管理模式 Operator、控制器 创建 ClusterRole + ClusterRoleBinding 严格限制主体为特定 ServiceAccount,避免使用 cluster-admin
安全警告:Helm Chart 中避免使用 cluster-admin 或包含 resources: ["*"]、verbs: ["*"] 的 ClusterRole。如果必须使用,应在 values.yaml 中显式声明并默认禁用,同时通过审计日志记录每次绑定操作。

2.6 审计链路中的 RBAC 关键字段

Kubernetes 审计日志会记录每次 RBAC 资源的创建、更新、删除操作。审计事件中的关键字段如下:

  • user.username:执行操作的用户或 ServiceAccount 名称。
  • objectRef.resource:操作的目标资源类型(如 roles、rolebindings)。
  • objectRef.namespace:目标资源所在的命名空间(ClusterRole/ClusterRoleBinding 为空)。
  • responseStatus.code:操作结果(201 创建成功,403 权限拒绝)。
  • requestObject:提交的 RBAC 资源定义,包含 rules 和 subjects 详情。

通过审计日志可以追溯:谁在何时、为哪个 ServiceAccount 授予了哪些权限。这是 Helm Chart 权限边界合规审计的核心数据源。