4. RBAC核心对象:RoleBinding与ClusterRoleBinding的定义、绑定机制与作用范围

在Kubernetes RBAC体系中,RoleBinding和ClusterRoleBinding是连接“主体”(User/Group/ServiceAccount)与“权限”(Role/ClusterRole)的桥梁。审计控制平面RBAC时,这两个对象的配置直接决定了权限是否被正确、安全地授予。

4.1 定义与核心区别

特性 RoleBinding ClusterRoleBinding
作用范围 仅作用于单个命名空间 作用于整个集群(所有命名空间)
绑定的Role类型 只能绑定同命名空间的Role,或引用ClusterRole(但权限仍限制在该命名空间内) 只能绑定ClusterRole
典型用途 为特定命名空间内的应用或团队授权 为集群管理员、集群范围的监控或控制器授权
审计关注点 是否授予了超出命名空间范围的权限 是否将敏感权限授予了非管理员主体
审计要点:RoleBinding引用ClusterRole时,虽然权限被限制在命名空间内,但该ClusterRole定义的规则(如get pods --all-namespaces)在绑定后仅对当前命名空间生效。审计时需检查这种“降级绑定”是否与预期一致。

4.2 绑定机制与YAML结构

两种Binding的YAML结构高度相似,核心差异在于 roleRef 的 kind 字段和 subjects 的配置。

4.2.1 RoleBinding示例(命名空间级)

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-reader-binding
  namespace: development
subjects:
- kind: User
  name: "alice@example.com"
  apiGroup: rbac.authorization.k8s.io
- kind: ServiceAccount
  name: dev-sa
  namespace: development
roleRef:
  kind: ClusterRole      # 引用集群级别的ClusterRole
  name: view             # 但权限被限制在development命名空间
  apiGroup: rbac.authorization.k8s.io

4.2.2 ClusterRoleBinding示例(集群级)

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admin-binding
subjects:
- kind: User
  name: "ops-admin@company.com"
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin    # 授予整个集群的管理员权限
  apiGroup: rbac.authorization.k8s.io
安全风险:ClusterRoleBinding的subjects中如果包含system:anonymous或system:unauthenticated,将导致未认证用户获得集群权限,这是严重的安全漏洞。

4.3 作用范围与权限传播机制

下图展示了RoleBinding与ClusterRoleBinding在集群中的权限作用范围差异:

RoleBinding 与 ClusterRoleBinding 作用范围对比 Kubernetes 集群 Namespace: development RoleBinding: dev-reader-binding User: alice SA: dev-sa Namespace: production 无 RoleBinding → 无权限 RoleBinding 仅作用于本命名空间 ClusterRoleBinding: 集群范围 ClusterRoleBinding: cluster-admin-binding User: ops-admin@company.com 权限传播到所有 Namespace 包括 kube-system、default 等 ⚠️ 审计重点:高危权限扩散 ClusterRoleBinding 无视命名空间隔离

4.4 审计检查清单

  • 检查ClusterRoleBinding的subjects:确认没有将cluster-admin或其他高危ClusterRole绑定到非管理员用户、组或ServiceAccount。
  • 检查RoleBinding引用的ClusterRole:当RoleBinding引用ClusterRole时,确认该ClusterRole的规则不会因“降级绑定”而产生意外效果(例如,包含get secrets的ClusterRole被绑定到开发命名空间)。
  • 检查跨命名空间的ServiceAccount绑定:RoleBinding的subjects中如果引用其他命名空间的ServiceAccount,需确认该跨命名空间访问是否经过审批。
  • 检查聚合ClusterRole的绑定:通过aggregationRule聚合的ClusterRole被绑定时,其权限会动态变化,审计时需结合当前集群中所有匹配的ClusterRole进行综合评估。
审计命令示例:使用kubectl快速列出所有ClusterRoleBinding及其绑定的主体:
# 列出所有ClusterRoleBinding
kubectl get clusterrolebindings.rbac.authorization.k8s.io -o wide

# 查看特定ClusterRoleBinding的详细YAML
kubectl get clusterrolebinding cluster-admin-binding -o yaml

# 检查所有绑定到cluster-admin的ClusterRoleBinding
kubectl get clusterrolebindings.rbac.authorization.k8s.io -o json | jq '.items[] | select(.roleRef.name=="cluster-admin") | {name: .metadata.name, subjects: .subjects}'

4.5 安全基线建议

场景 推荐做法 禁止做法
集群管理员授权 使用ClusterRoleBinding绑定cluster-admin,并限制主体数量 将cluster-admin绑定到ServiceAccount或组
命名空间级只读权限 使用RoleBinding引用ClusterRole view 使用ClusterRoleBinding授予view权限
跨命名空间访问 在每个目标命名空间创建独立的RoleBinding 使用ClusterRoleBinding绕过命名空间隔离
自动化工具授权 为每个工具创建专用的ServiceAccount和RoleBinding 复用或共享ServiceAccount的ClusterRoleBinding
审计红线:任何将cluster-admin、system:master或包含*通配符的ClusterRole通过ClusterRoleBinding授予给system:serviceaccounts组的操作,都应视为高危配置,需立即整改。