4. 准入权限模型:Kubernetes RBAC 与 Kyverno 策略的交互关系

Kubernetes 的准入控制链中,RBAC(基于角色的访问控制)与 Kyverno 策略引擎 分别承担不同层级的权限校验。RBAC 决定“谁可以执行操作”,而 Kyverno 决定“操作是否符合安全与合规要求”。两者在 API 请求处理流程中按顺序执行,形成互补的权限防线。

4.1 准入控制链中的执行顺序

当 API 请求到达 kube-apiserver 时,经过认证 → 授权(RBAC) → 准入控制(含 Kyverno)三个阶段。Kyverno 作为动态准入 Webhook,在 RBAC 授权通过后介入,因此 Kyverno 策略无法绕过 RBAC 的权限检查,但可以补充 RBAC 无法覆盖的细粒度约束。

关键理解: RBAC 是“门禁”,Kyverno 是“安检”。门禁放行后,安检仍可拦截违规物品。
Kubernetes API 请求准入控制链 阶段 1:认证 TLS / / 证书 阶段 2:RBAC 授权 Role / ClusterRole / Binding 阶段 3:准入控制 Mutating / Validating Webhook Kyverno 策略引擎 请求允许 / 拒绝 / 变更 RBAC 通过 + Kyverno 通过 → 写入 etcd

4.2 RBAC 与 Kyverno 的职责边界

维度 Kubernetes RBAC Kyverno 策略
控制对象 用户 / ServiceAccount / Group API 请求的 object(资源内容)
决策依据 动词(get/list/create/update/delete)+ 资源类型 + 命名空间 资源字段值、标签、注解、镜像来源、Pod 安全上下文等
粒度 粗粒度(资源级别) 细粒度(字段级别、跨资源关联)
变更能力 无(仅授权判断) 支持 Mutating Webhook 自动注入/修改资源
执行时机 认证后、准入前 RBAC 授权通过后、etcd 写入前
典型场景 限制某用户只能读取 default 命名空间的 Pod 强制所有 Pod 必须设置 readOnlyRootFilesystem: true

4.3 交互风险:权限提升与绕过

RBAC 与 Kyverno 的交互存在三类典型风险,策略评审时需要重点关注:

  1. RBAC 放行但 Kyverno 未覆盖: 用户拥有 create Pod 权限,但 Kyverno 未对 privileged 容器做限制,导致提权。
  2. Kyverno 变更导致 RBAC 失效: Kyverno 自动注入 sidecar 或修改资源标签,可能使原本匹配的 RBAC 规则失效(例如变更命名空间标签导致 RoleBinding 不匹配)。
  3. ServiceAccount 提权链: 用户通过 RBAC 创建 ServiceAccount 并绑定高权限 Role,Kyverno 若未限制 ServiceAccount 的创建或绑定,可绕过原有权限控制。
⚠️ 风险提示: 当 Kyverno 策略使用 mutate 修改资源的 metadata.labels 或 metadata.annotations 时,务必评估是否会影响现有 RBAC 绑定的选择器匹配。建议在策略中添加 preconditions 避免意外覆盖。

4.4 策略评审中的权限检查清单

在评审 Kyverno 策略时,应同步检查以下 RBAC 相关项:

  • 策略作用范围: 策略是否匹配了超出预期命名空间的资源?是否与 RBAC 的命名空间隔离设计冲突?
  • 变更影响: Mutating 策略修改了哪些字段?这些字段是否被 RBAC 的 resourceNames 或标签选择器引用?
  • ServiceAccount 管控: 是否有策略限制 ServiceAccount 的创建或 RoleBinding/ClusterRoleBinding 的绑定?
  • 特权容器: 是否通过策略禁止 privileged: true、hostPID、hostNetwork 等危险配置?
  • 匿名访问: 策略是否对 system:anonymous 或 system:unauthenticated 用户生效?

4.5 最佳实践:分层防御模型

推荐采用“RBAC + Kyverno + OPA/Gatekeeper”三层防御,但至少确保 RBAC 与 Kyverno 形成互补:

分层防御模型:RBAC + Kyverno RBAC 授权层(谁可以操作) Kyverno 策略层(操作是否合规) 镜像来源校验 安全上下文强制 标签/注解审计 两层均通过 → 资源写入 etcd;任一层拒绝 → 请求被拦截
💡 评审建议: 在 Kyverno 策略的 background: true 模式下,策略引擎会扫描已有资源。此时需注意:RBAC 已放行的存量资源可能被 Kyverno 标记为违规,但不会自动删除——需要人工或自动化工具处理。