1. 课程导论:云原生安全挑战、为什么需要准入策略、Kyverno 在 Kubernetes 生态中的定位

1.1 云原生安全面临的核心挑战

随着企业加速向云原生架构迁移,Kubernetes 已成为事实上的容器编排标准。然而,这种动态、声明式的基础设施也引入了传统安全模型难以应对的新威胁面。以下是云原生环境中最突出的安全挑战:

挑战维度 具体风险 传统安全手段的局限
配置漂移与错误 特权容器、hostPath 挂载、容器以 root 运行、资源限制缺失 静态扫描无法拦截运行时变更;人工 Code Review 效率低且易遗漏
供应链攻击 镜像漏洞、恶意基础镜像、未签名的第三方组件 镜像仓库扫描滞后于部署;缺乏对镜像来源的强制校验
权限过度授予 ClusterRole 绑定范围过大、ServiceAccount 滥用、RBAC 配置错误 审计日志被动告警,无法在权限生效前阻止
多租户隔离不足 命名空间边界被绕过、NetworkPolicy 未配置、Pod 安全标准未实施 网络层隔离无法覆盖 API 层面的越权操作
运行时不可预测性 Sidecar 注入、突变 Webhook 篡改、自定义控制器引入非预期行为 基于签名的检测无法应对未知的配置变更
关键洞察: 云原生安全的核心矛盾在于“声明式期望状态”与“实际运行时状态”之间的偏差。Kubernetes 的 API 驱动特性使得任何具有写权限的实体(用户、CI/CD、控制器)都能直接修改集群状态,而传统安全工具往往在变更发生后才进行检测。

1.2 为什么需要准入策略

Kubernetes 提供了 准入控制器(Admission Controller) 机制,作为 API 请求处理链中的一道关键闸门。它在请求被持久化到 etcd 之前介入,能够拦截、验证或修改资源对象。准入策略正是基于这一机制,将安全控制左移到“变更发生前”。

准入策略的核心价值体现在以下三个层面:

  1. 预防性控制(Preventive Control):在 Pod、Deployment、Service 等资源创建或更新时,实时检查其配置是否符合安全基线。例如,拒绝任何未设置 securityContext.runAsNonRoot: true 的 Pod。
  2. 强制合规(Enforce Compliance):将组织级的安全策略(如 PCI-DSS、SOC2、CIS Benchmark)编码为可执行的规则,确保所有工作负载自动满足合规要求,无需人工逐项核对。
  3. 变更审计与阻断(Change Audit & Block):对 RBAC 权限变更、ClusterRole 绑定、网络策略修改等敏感操作进行实时审计,并在违反策略时直接拒绝,防止权限滥用或横向移动。
实践建议: 准入策略不应仅用于“拦截”,更应作为“标准化”工具。通过突变(Mutating)策略自动注入 Sidecar、添加标签、设置默认资源限制,可以大幅降低开发者的安全认知负担,实现“安全默认”的运维模式。

1.3 Kyverno 在 Kubernetes 生态中的定位

Kyverno 是一个为 Kubernetes 设计的 云原生策略引擎,由 Nirmata 开源,目前是 CNCF 的孵化项目。与传统的策略工具(如 OPA/Gatekeeper)不同,Kyverno 采用 Kubernetes 原生的资源定义方式来编写策略,无需学习专用的策略语言(如 Rego)。

下图展示了 Kyverno 在 Kubernetes 控制平面中的位置及其与核心组件的交互关系:

Kyverno 在 Kubernetes 控制平面中的定位 Kyverno 在 Kubernetes 控制平面中的定位 用户 / CI/CD 系统 kube-apiserver 准入控制链(Admission Chain) Kyverno 策略引擎 Mutating / Validating Webhook etcd(持久化存储) Kyverno 作为动态准入 Webhook 注册到 API Server,在请求写入 etcd 之前执行策略检查

Kyverno 与其他策略引擎的关键差异如下表所示:

特性维度 Kyverno OPA / Gatekeeper 原生 Admission Webhook
策略语言 YAML 资源定义(Kubernetes 原生) Rego(专用声明式语言) 任意编程语言(需自行开发)
学习曲线 低(熟悉 K8s YAML 即可) 中高(需学习 Rego 语法) 高(需掌握 Webhook 开发与部署)
策略类型 Validate / Mutate / Generate / VerifyImages Validate / Mutate(通过 ConstraintTemplate) 完全自定义
集群内安装 Helm Chart / YAML 一键部署 需部署 Gatekeeper 及其 CRD 需自行编写 Webhook 服务与证书管理
策略分发 ClusterPolicy / Policy 资源,支持 GitOps ConstraintTemplate + Constraint,支持 GitOps 需自行实现策略加载逻辑
社区与生态 CNCF 孵化项目,社区活跃,策略市场丰富 CNCF 毕业项目,生态成熟,但策略编写门槛高 无统一社区,依赖内部团队维护
注意: 选择策略引擎时,需综合考虑团队技术栈、策略复杂度、运维成本。Kyverno 特别适合以 Kubernetes 为中心、希望降低策略编写门槛、快速实现安全基线的团队。对于已有大量 Rego 投资或需要极高性能策略评估的场景,OPA/Gatekeeper 仍是合理选择。

1.4 本课程聚焦:权限变更风险与配置管理

本课程将重点围绕 权限变更风险 和 配置管理准入策略 两个核心主题展开。权限变更风险是指对 RBAC 资源(Role、ClusterRole、RoleBinding、ClusterRoleBinding)的创建、更新或删除操作可能导致的权限过度授予或权限滥用。配置管理准入策略则关注工作负载配置(PodSpec、SecurityContext、ResourceQuota 等)是否符合安全基线。

通过 Kyverno,我们可以实现:

  • 自动拦截:禁止创建绑定到 cluster-admin 的 ClusterRoleBinding,除非有特定审批标签。
  • 强制约束:确保所有 Pod 都设置 readOnlyRootFilesystem: true 和 runAsNonRoot: true。
  • 变更审计:记录所有对 system:authenticated 组的 RBAC 绑定变更,并发送告警。
  • 自动修复:为缺少资源限制的 Deployment 自动注入默认的 CPU/Memory 请求与限制。

下图展示了 Kyverno 策略在权限变更风险场景下的典型工作流程:

Kyverno 策略处理权限变更请求的流程 Kyverno 策略处理权限变更请求的流程 1. 发起 RBAC 变更 kubectl apply -f rolebinding.yaml 2. API Server 接收 触发准入 Webhook 3. Kyverno 策略评估 匹配 ClusterPolicy / Policy 4. 拒绝请求(Deny) 返回错误信息,请求不写入 etcd 4. 允许请求(Allow) 请求继续写入 etcd,变更生效 策略评估结果决定请求是否被允许。Kyverno 支持同时配置多个策略,按优先级顺序执行。 对于权限变更场景,建议将“拒绝”策略的优先级设置为最高,确保敏感操作被严格管控。