policy-as-code

策略即代码的准入控制与流水线门禁

补充说明

策略即代码把安全、合规和资源规范写成可测试、可版本化的规则,在 CI 和集群准入两个层面执行。CI 层反馈快,准入层是最后防线;只做其中一层都会漏。

上线顺序必须是 audit → warn → deny,每阶段至少观察一到两周。例外必须有 owner、范围和到期日。

常用示例

Gatekeeper ConstraintTemplate:

apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8srequiredresources
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredResources
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredresources

        violation[{"msg": msg}] {
          c := input.review.object.spec.containers[_]
          not c.resources.limits.memory
          msg := sprintf("container %v missing memory limit", [c.name])
        }

对应 Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredResources
metadata:
  name: require-memory-limit
spec:
  enforcementAction: deny
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces: ["kube-system"]

CI 层检查:

conftest test manifests/ --policy policy/ --output table
conftest verify --policy policy/
kyverno apply policy.yaml --resource deployment.yaml
kyverno test .

推广阶段与退出条件:

阶段 模式 最短观察期 进入下一阶段条件
1 audit 2 周 违规类型稳定,无新增误报
2 warn 1 周 业务已知晓并完成高风险修复
3 deny 长期 例外全部有 owner 和到期日

例外规则:

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. 为什么策略要先 audit 再 deny?
  2. CI 层和准入层各自解决什么问题?
  3. 一个合格的策略例外至少包含哪些信息?
答案
  1. 先观察规则会不会误伤存量工作负载,积累违规清单并让业务修复,再强制拦截。
  2. CI 层反馈快、能在合并前发现问题;准入层是最后防线,防止绕过流水线的直接部署。
  3. 原因、影响范围、owner、到期日和审批记录;到期后自动失效。

相关条目