4. 验证策略实战:强制Pod必须包含资源限制、禁止特权容器

本章进入策略验证的实战环节。我们将编写两条核心的Kyverno ClusterPolicy:一条强制Pod必须声明resources.limits,另一条禁止任何容器以特权模式运行。这两条策略是生产环境中最基础、最常用的安全与资源管控护栏。

4.1 策略一:强制资源限制(resources.limits)

在Kubernetes集群中,未设置资源限制的Pod可能导致节点资源被单个工作负载耗尽,引发“吵闹邻居”问题。Kyverno可以通过Mutate或Validate模式来强制资源限制。本实战采用Validate + Mutate组合:先验证是否已设置,若未设置则通过Mutate自动注入默认值。

4.1.1 策略YAML定义

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-resources-limits
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-resources-limits
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "Pod必须包含resources.limits配置。"
      pattern:
        spec:
          containers:
          - resources:
              limits:
                memory: "?*"
                cpu: "?*"
  - name: mutate-default-limits
    match:
      any:
      - resources:
          kinds:
          - Pod
    mutate:
      patchStrategicMerge:
        spec:
          containers:
          - (name): "*"
            resources:
              limits:
                memory: "512Mi"
                cpu: "500m"
              requests:
                memory: "256Mi"
                cpu: "250m"
关键参数说明:
  • validationFailureAction: Enforce:拒绝不符合策略的Pod创建请求。
  • pattern中的?*:表示该字段必须存在且值非空。
  • mutate规则:当验证失败时,自动注入默认资源限制,避免Pod被直接拒绝。

4.1.2 验证流程

部署策略后,通过以下步骤验证效果:

  1. 创建测试Pod(无资源限制)
kubectl run test-pod --image=nginx

预期结果:Pod创建被拒绝,返回Kyverno策略违规消息。

  1. 创建合规Pod(包含资源限制)
kubectl run compliant-pod --image=nginx --limits='cpu=500m,memory=512Mi'

预期结果:Pod成功创建。

  1. 查看策略审计日志
kubectl get policyreport -A
kubectl describe policyreport -n default

4.2 策略二:禁止特权容器

特权容器拥有宿主机内核级别的访问权限,是容器逃逸攻击的主要入口。Kyverno通过验证securityContext.privileged字段来禁止特权模式。

4.2.1 策略YAML定义

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-privileged-containers
spec:
  validationFailureAction: Enforce
  background: true
  rules:
  - name: check-privileged
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "禁止运行特权容器。"
      anyPattern:
      - spec:
          containers:
          - securityContext:
              privileged: false
      - spec:
          containers:
          - securityContext:
              privileged: "false"
      - spec:
          containers:
          - (securityContext):
              (privileged): null
      - spec:
          containers:
          - (securityContext): null
避坑指南:
  • anyPattern用于匹配多种合法情况:显式设为false、字符串false、未设置securityContext、未设置privileged字段。
  • 必须同时处理initContainers和ephemeralContainers,否则攻击者可通过init容器绕过。
  • 建议配合background: true开启后台扫描,发现已存在的违规Pod。

4.2.2 扩展:禁止特权提升与只读根文件系统

在实际生产环境中,通常将特权容器策略与以下安全上下文约束组合使用:

安全字段 策略值 说明
privileged false 禁止特权模式
allowPrivilegeEscalation false 禁止特权提升
readOnlyRootFilesystem true 强制只读根文件系统
runAsNonRoot true 禁止以root用户运行
capabilities.drop ["ALL"] 删除所有Linux Capability

4.3 策略验证流程图

下图展示了Kyverno在Pod创建请求到达API Server时的验证与变异流程:

Kyverno 策略验证与变异流程 用户提交Pod YAML API Server 接收请求 Kyverno Webhook 拦截(Mutating + Validating) 策略引擎:匹配规则 → 执行动作 Mutate:注入默认资源限制 Validate:检查特权/资源限制 Mutate先执行,注入默认值后再执行Validate;若Validate失败则拒绝请求

4.4 流水线集成验证

在CI/CD流水线中,建议将策略验证分为两个阶段:

阶段 工具/命令 验证内容 失败处理
代码提交前 kyverno apply 本地YAML静态检查 阻止PR合并
部署到测试集群 kubectl dry-run 集群端动态验证 阻断部署流水线
生产环境 Kyverno Enforce模式 实时准入控制 拒绝违规Pod创建

4.4.1 本地静态检查命令

# 安装Kyverno CLI
curl -sLO https://github.com/kyverno/kyverno/releases/download/v1.12.0/kyverno-cli_v1.12.0_linux_amd64.tar.gz
tar -xzf kyverno-cli_v1.12.0_linux_amd64.tar.gz
sudo mv kyverno /usr/local/bin/

# 对部署YAML执行策略检查
kyverno apply ./policies/ --resource ./deploy/pod.yaml --policy-report

4.4.2 GitLab CI集成示例

kyverno-policy-check:
  stage: validate
  image: kyverno/kyverno-cli:latest
  script:
    - kyverno apply policies/ --resource manifests/ --policy-report
  only:
    - merge_requests
    - main
实战要点:
  • 资源限制策略建议同时设置requests和limits,避免调度器因缺乏requests信息而做出错误调度决策。
  • 特权容器策略应配合Pod Security Admission(PSA)使用,形成双层防护。
  • 在流水线中,建议将策略检查放在单元测试之后、镜像构建之前,尽早发现配置问题。