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、原因和有效期
- 高可用部署准入服务并设置延迟预算
收尾清单
强制执行后监控拒绝率、延迟和豁免数量。每条策略关联控制目标与负责人,过时规则按版本流程删除。