1. 课程导论:什么是 Policy as Code (PaC),为什么需要 PaC,PaC 在 DevOps 流水线中的价值与定位
1.1 什么是 Policy as Code (PaC)
Policy as Code(策略即代码,简称 PaC)是一种将组织中的安全策略、合规规则、治理约束和操作规范,以机器可读的代码形式进行声明、存储、版本化、测试和自动执行的工程实践。其核心思想是:将原本写在 PDF 文档、Wiki 页面或人工记忆中的“策略”,转化为可被 CI/CD 流水线自动校验的代码片段。
PaC 并非单一工具,而是一种方法论。它通常包含以下三个关键要素:
| 要素 | 说明 | 示例 |
|---|---|---|
| 策略定义 | 使用声明式语言(如 Rego、HCL、JSON/YAML Schema)描述“允许”与“禁止”的边界 | deny[msg] { input.cpu > 4 } |
| 策略引擎 | 负责解析策略定义,并对输入数据(如 Kubernetes 资源、Terraform 计划、API 请求)进行决策 | OPA (Open Policy Agent)、Kyverno、Sentinel |
| 策略执行点 | 在流水线或运行时中嵌入策略引擎的调用,阻断或告警不合规行为 | CI 阶段 opa eval、准入控制器 Webhook |
关键区分:PaC 不同于传统的“静态代码扫描”(SAST)。SAST 关注代码本身的漏洞(如 SQL 注入),而 PaC 关注的是部署配置、基础设施定义、访问权限、数据标签等是否符合组织策略。两者互补,不可替代。
1.2 为什么需要 PaC
传统策略管理方式存在三大痛点:
- 策略与实现脱节:安全团队编写 PDF 策略文档,开发团队在交付后才发现违规,返工成本极高。
- 人工审核瓶颈:依赖安全专家逐行 Review 配置变更,速度慢、易遗漏、无法应对大规模微服务部署。
- 策略版本混乱:不同环境(开发/测试/生产)策略不一致,缺乏审计追溯能力。
PaC 通过以下方式解决上述问题:
- 左移(Shift Left):在代码提交、构建、部署阶段即执行策略检查,将问题拦截在“上游”。
- 自动化与一致性:策略由机器执行,消除人为判断偏差,确保开发、测试、生产环境执行同一套规则。
- 版本化与审计:策略代码存储在 Git 仓库中,每次变更都有 Commit 记录,支持回滚和合规审计。
- 可测试性:策略可以像软件代码一样编写单元测试,验证规则逻辑的正确性。
行业数据参考:根据 Gartner 预测,到 2026 年,超过 60% 的大型企业将采用 PaC 来管理云基础设施的合规性,相比 2023 年的 20% 有显著增长。采用 PaC 的组织,平均策略违规修复时间(MTTR)可缩短 70% 以上。
1.3 PaC 在 DevOps 流水线中的价值与定位
在 DevOps 流水线中,PaC 扮演着“自动化合规门禁”的角色。它不是取代 CI/CD 工具(如 Jenkins、GitLab CI、GitHub Actions),而是作为流水线中的一个策略决策层,嵌入到各个关键阶段。
下图展示了 PaC 在典型 DevOps 流水线中的集成位置与价值:
PaC 在流水线中的具体定位可以总结为以下三个层次:
| 层次 | 定位 | 典型策略示例 |
|---|---|---|
| 基础设施层 | 确保 IaC(Terraform、CloudFormation)定义的资源符合安全基线 | 禁止 S3 存储桶公开读写;强制 RDS 开启加密 |
| 应用部署层 | 验证 Kubernetes 资源清单、容器镜像、Helm Chart 的合规性 | 容器必须设置 CPU/Memory Limits;禁止运行特权容器 |
| CI/CD 流程层 | 控制流水线本身的执行行为,如审批门、环境准入 | 仅允许已签名的镜像部署到生产环境;禁止直接合并到 main 分支 |
常见误区:PaC 不是“银弹”。它不能替代身份与访问管理(IAM)、网络防火墙或运行时入侵检测(IDS)。PaC 专注于配置与策略的合规性,是纵深防御体系中的“策略自动化”层,而非全部安全能力。
1.4 一个简单的 PaC 策略示例
以下是一个使用 OPA(Open Policy Agent)和 Rego 语言编写的策略示例,用于禁止 Kubernetes Deployment 使用 latest 标签:
# policy/deny_latest_tag.rego
package kubernetes.admission
deny[msg] {
input.request.kind.kind == "Deployment"
container := input.request.object.spec.template.spec.containers[_]
endswith(container.image, ":latest")
msg := sprintf("容器镜像 %v 使用了 'latest' 标签,请指定固定版本", [container.image])
}
在 CI 流水线中,可以通过以下命令执行策略检查:
# 使用 opa eval 命令在 CI 中执行策略
opa eval --data policy/deny_latest_tag.rego \
--input deployment.yaml \
"data.kubernetes.admission.deny"
如果 deployment.yaml 中包含 image: nginx:latest,OPA 将返回违规消息,流水线据此决定是否阻断构建。
本课程后续内容预告:在接下来的章节中,我们将深入讲解如何编写 Rego 策略、如何将 PaC 集成到 Jenkins/GitLab CI/GitHub Actions 中、如何调试策略执行失败、以及如何构建策略测试套件。本章作为导论,旨在帮助您建立 PaC 的整体认知框架。