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在集群中的权限作用范围差异:
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组的操作,都应视为高危配置,需立即整改。