3. 策略即代码(Policy as Code)概述

策略即代码(Policy as Code, PaC)是将传统安全策略、合规规则与治理约束,以机器可读的代码形式进行声明、版本化、测试、自动化部署与持续执行的一种工程实践。在云原生与 Kubernetes 生态中,PaC 是构建“安全左移”与“合规自动化”的核心技术支柱。

3.1 什么是策略即代码

传统策略管理依赖人工编写文档、邮件审批或手动配置,存在版本混乱、执行不一致、审计困难等问题。策略即代码将策略从“静态文档”转变为“可执行的代码资产”,具备以下特征:

  • 声明式:策略描述“期望状态”,而非“如何执行”。
  • 版本化:策略文件存储在 Git 等版本控制系统中,支持变更追踪、回滚与代码审查。
  • 自动化执行:策略在 CI/CD 流水线或 Admission Controller 中自动触发校验,无需人工干预。
  • 可测试:策略可以像软件代码一样编写单元测试与集成测试。
  • 可审计:每次策略评估结果均可记录为结构化日志,满足合规审计要求。
核心公式: 策略即代码 = 策略逻辑(Rego/CUE/Opaque) + 版本控制(Git) + 自动化引擎(OPA/Gatekeeper/Kyverno)

3.2 策略即代码与 RBAC / OPA / Gatekeeper 的关系

策略即代码并非孤立的技术,它与 Kubernetes 现有的授权与准入控制体系紧密协作。下表清晰展示了四者的定位与差异:

组件 定位 作用层 策略表达方式 典型场景
RBAC 身份与访问控制 API 授权层 Role / ClusterRole + RoleBinding 控制“谁”可以“做什么”操作
OPA 通用策略引擎 策略决策层 Rego 语言 任意结构化数据的策略评估
Gatekeeper Kubernetes 专用 Admission Webhook 准入控制层 ConstraintTemplate + Constraint K8s 资源创建/更新时的策略校验
策略即代码 工程实践方法论 全生命周期 代码化、版本化、自动化 将上述组件纳入 DevOps 流程
  • RBAC 解决“谁有权操作”,但不解决“操作的内容是否合规”。
  • OPA 提供通用的策略评估能力,但本身不绑定 Kubernetes。
  • Gatekeeper 是 OPA 在 Kubernetes 上的原生集成实现,通过 Admission Webhook 拦截请求并调用 OPA 引擎。
  • 策略即代码 是将上述所有能力以代码化、自动化、可测试的方式组织起来的工程方法论。
实践建议: 在 Kubernetes 集群中,推荐使用 RBAC + Gatekeeper + 策略即代码 的组合。RBAC 控制操作权限,Gatekeeper 执行合规校验,策略即代码确保所有策略可追溯、可测试、可自动部署。

3.3 策略即代码的优势与挑战

优势

  • 一致性:同一套策略代码在开发、测试、生产环境执行相同逻辑,消除环境差异。
  • 可追溯:每次策略变更都有 Git 提交记录,配合 CI/CD 流水线实现全链路审计。
  • 自动化:策略校验嵌入 Admission Controller,拒绝不合规资源创建,实现“安全左移”。
  • 可复用:策略模板(如 ConstraintTemplate)可跨团队、跨集群共享,降低重复开发成本。
  • 快速响应:发现新漏洞或合规要求时,只需修改策略代码并重新部署,分钟级生效。

挑战

  • 学习曲线:Rego 语言、CUE 等策略语言与传统编程语言差异较大,团队需要专项培训。
  • 性能开销:复杂的策略规则在 Admission Webhook 中可能增加 API 请求延迟,需要合理设计缓存与超时。
  • 策略爆炸:随着业务增长,策略数量可能快速膨胀,缺乏有效的策略组织与命名规范会导致管理混乱。
  • 调试困难:策略执行失败时,错误信息可能不够直观,需要结合 OPA 的 trace 功能进行排查。
  • 版本兼容:Kubernetes API 版本升级可能导致策略模板失效,需要持续维护策略与集群版本的兼容性。
避坑提示: 不要试图用策略即代码覆盖所有安全场景。对于高频、低风险的校验(如标签格式),优先使用 Kubernetes 原生的 ValidatingAdmissionPolicy(CEL 表达式),将 OPA/Gatekeeper 留给复杂业务逻辑场景。

3.4 策略即代码在资源配额模型中的角色

在“资源配额模型发布包完整性”校验场景中,策略即代码承担以下关键职责:

  1. 校验资源配额声明:确保发布包中的 ResourceQuota、LimitRange 等对象符合组织定义的配额模板。
  2. 验证完整性签名:通过策略代码调用签名验证逻辑,确保发布包未被篡改。
  3. 关联依赖检查:校验发布包中声明的配额与底层节点容量、命名空间限制是否一致。
  4. 自动化准入拦截:在资源创建或更新时,由 Gatekeeper 自动执行上述校验,拒绝不合规请求。
策略即代码在资源配额模型发布包完整性校验中的执行流程 发布包提交 Admission Webhook 拦截 策略引擎评估(OPA) 通过 → 允许创建 拒绝 → 返回错误 策略即代码确保每次资源配额发布包在进入集群前都经过完整性校验,实现“不安全不部署”

3.5 策略即代码的典型工具链

工具 类型 策略语言 Kubernetes 集成方式 适用场景
OPA 通用策略引擎 Rego Sidecar / 独立服务 任意数据源策略评估
Gatekeeper K8s Admission Webhook Rego(ConstraintTemplate) 原生 Admission Controller K8s 资源准入校验
Kyverno K8s 原生策略引擎 YAML 声明式 动态 Admission Webhook 无需学习 Rego 的团队
jsPolicy JavaScript 策略引擎 JavaScript / TypeScript Admission Webhook 前端团队主导的策略开发
CUE 数据约束语言 CUE 配合 KubeVela / 自定义控制器 配置校验与模板化
选型建议: 如果团队已有 Rego 经验或需要复杂逻辑校验,优先选择 Gatekeeper;如果希望降低学习成本且策略以简单约束为主,Kyverno 的 YAML 声明式风格更友好。本课程后续章节将基于 Gatekeeper + Rego 展开,因为它在资源配额模型的复杂校验场景中表现最佳。