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 策略即代码在资源配额模型中的角色
在“资源配额模型发布包完整性”校验场景中,策略即代码承担以下关键职责:
- 校验资源配额声明:确保发布包中的
ResourceQuota、LimitRange等对象符合组织定义的配额模板。 - 验证完整性签名:通过策略代码调用签名验证逻辑,确保发布包未被篡改。
- 关联依赖检查:校验发布包中声明的配额与底层节点容量、命名空间限制是否一致。
- 自动化准入拦截:在资源创建或更新时,由 Gatekeeper 自动执行上述校验,拒绝不合规请求。
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 展开,因为它在资源配额模型的复杂校验场景中表现最佳。