3. RBAC 策略设计原则:最小权限、职责分离与默认拒绝

在 Kubernetes 平台的生命周期运维中,RBAC(基于角色的访问控制)是保障集群安全的第一道防线。错误的 RBAC 配置可能导致权限泄露、越权操作甚至集群瘫痪。本章围绕三个核心设计原则展开:最小权限原则、职责分离与默认拒绝策略。这三者共同构成了生产级 RBAC 策略的基石。

3.1 最小权限原则(Least Privilege)

最小权限原则要求每个用户、服务账户或组件只获得完成其任务所必需的最小权限集合。在 K8s 中,这意味着:

  • 粒度控制:优先使用 Role(命名空间级别)而非 ClusterRole(集群级别)。
  • 资源限定:明确指定可操作的资源类型(如 pods、deployments、secrets)和操作动词(get、list、create、update、delete)。
  • 避免通配符:禁止使用 * 通配符授予所有资源或所有操作的权限。
实践案例: 为 CI/CD 流水线服务账户仅授予 get、list、watch 权限,而非 create 或 delete,除非明确需要。

3.2 职责分离(Separation of Duties)

职责分离通过将敏感操作拆分为多个独立角色,防止单个用户或组件拥有过度集中的权限。在 K8s 平台运维中,常见的分离模型包括:

角色 典型权限范围 说明
集群管理员 节点管理、RBAC 策略配置、集群证书轮换 拥有最高权限,但操作受审计
命名空间管理员 命名空间内资源管理(Deployment、Service、ConfigMap) 不能跨命名空间操作,不能修改 RBAC
只读审计员 所有资源的 get、list、watch 用于安全审计与合规检查
应用开发者 仅特定命名空间内的 Pod 日志查看、应用部署 不能访问 Secrets 或修改网络策略
设计建议: 在集群初始化阶段就定义好角色模板,避免后期临时创建导致权限混乱。每个角色应只对应一个明确的运维职责。

3.3 默认拒绝策略(Default Deny)

默认拒绝策略是 RBAC 的底层安全模型:任何未显式授予的权限,默认都是拒绝的。这意味着:

  • 新建的用户或服务账户在绑定角色之前,没有任何操作权限。
  • 删除或解绑某个 RoleBinding 后,对应的权限立即失效。
  • 不需要像防火墙一样配置“拒绝规则”,只需管理“允许规则”。
常见误区: 不要创建“拒绝所有”的 ClusterRole 或 Role,因为 K8s RBAC 本身已经是默认拒绝。创建多余的拒绝规则只会增加策略复杂度,且可能因规则顺序导致意外放行。

3.4 三原则协同架构

下图展示了三个原则在 K8s RBAC 策略设计中的协同关系:

RBAC 策略设计三原则协同架构 最小权限原则 仅授予必需权限 职责分离 拆分敏感操作 默认拒绝策略 未授权即拒绝 安全 RBAC 策略 可审计 · 可追溯 · 最小化攻击面 输出效果 降低横向移动风险 · 满足合规要求 · 简化审计

3.5 策略设计检查清单

在编写 RBAC 策略时,建议逐项核对以下清单:

  1. 角色定义:是否只使用了必要的资源和动词?是否避免了 * 通配符?
  2. 绑定范围:是否优先使用 RoleBinding 而非 ClusterRoleBinding?
  3. 职责拆分:创建、更新、删除操作是否由不同角色承担?
  4. 默认拒绝验证:删除所有绑定后,用户是否确实失去所有权限?
  5. 审计准备:是否开启了 Kubernetes 审计日志?RBAC 变更是否可追溯?
生产建议: 使用 kubectl auth can-i --list --as=system:serviceaccount:namespace:sa-name 命令定期验证服务账户的实际权限,确保与设计意图一致。

3.6 常见 RBAC 设计反模式

反模式 风险描述 正确做法
使用 cluster-admin 绑定所有服务账户 任何被攻破的服务账户都能控制整个集群 为每个服务账户创建最小权限的 Role
在 Role 中使用 resources: ["*"] 意外授予对 Secrets、RBAC 等敏感资源的访问 明确列出所需资源类型
多个用户共享同一个服务账户 无法区分操作者,审计失效 每个用户或应用使用独立的 ServiceAccount
未及时清理废弃的 RoleBinding 离职人员或退役应用仍持有权限 定期审计并删除无效绑定

遵循最小权限、职责分离和默认拒绝三大原则,能够显著降低 K8s 集群的权限滥用风险,为后续的集群生命周期运维和发布包校验奠定坚实的安全基础。