OPA Policy as Code:让合规检查可测试、可灰度

设计可解释的 Rego 策略、单元测试和审计模式,把安全要求安全地接入 CI 与准入控制。

文章目录 · 4 节

Policy as Code 的目标不是把所有规范变成一刀切拒绝,而是让规则有版本、可测试、可解释,并能按风险逐步执行。

写出明确的拒绝原因

package kubernetes.admission

deny contains msg if {
  input.review.kind.kind == "Deployment"
  container := input.review.object.spec.template.spec.containers[_]
  endswith(container.image, ":latest")
  msg := sprintf("container %s must use an immutable image", [container.name])
}

规则应指向具体对象和修复方法。共享函数负责镜像解析、豁免与标签读取,避免每条策略重复实现边界逻辑。

测试边界样例

opa fmt -w policies/
opa test policies/ tests/ -v
opa eval -d policies/ -i fixtures/deployment.json 'data.kubernetes.admission.deny'

测试至少覆盖允许、拒绝、缺失字段和合法豁免。固定 OPA 版本,避免升级后语义变化未被发现。

分阶段上线

  • 先在 CI 与审计模式统计命中率
  • 清理存量违规并公布截止日期
  • 为紧急豁免设置 owner、原因和有效期
  • 高可用部署准入服务并设置延迟预算

收尾清单

强制执行后监控拒绝率、延迟和豁免数量。每条策略关联控制目标与负责人,过时规则按版本流程删除。