3. 镜像安全水位定义:漏洞等级划分、安全基线策略与水位阈值设定

在云原生安全体系中,镜像安全水位是变更门禁与回滚判断的核心基准。它并非一个单一数值,而是由漏洞等级划分、安全基线策略和水位阈值设定三层结构共同构成的量化模型。只有将这三级定义清晰,Kyverno 策略引擎才能准确判定“允许部署”、“拒绝部署”或“触发回滚”。

核心原则:安全水位必须可量化、可比较、可审计。任何模糊的“尽量修复高危漏洞”都无法转化为策略代码。

3.1 漏洞等级划分:CVSS 与容器化适配

业界通用的漏洞严重性分级基于 CVSS(Common Vulnerability Scoring System,通用漏洞评分系统)。在容器镜像场景中,我们通常将 CVSS v3 基础分映射为四个等级,并针对容器运行时特性做微调:

等级 CVSS 分数范围 容器场景典型特征 示例
Critical(严重) 9.0 – 10.0 远程代码执行、无需认证即可利用、影响整个集群 Log4Shell (CVE-2021-44228)
High(高危) 7.0 – 8.9 权限提升、敏感信息泄露、可被低权限用户触发 Dirty Pipe (CVE-2022-0847)
Medium(中危) 4.0 – 6.9 需要特定条件或本地访问、影响有限 部分 DoS 漏洞、配置不当
Low(低危) 0.1 – 3.9 信息泄露风险极低、无实际利用路径 非关键 banner 信息泄露
实践建议:在容器镜像扫描中,建议将 Critical 和 High 漏洞视为“阻断级”,Medium 视为“告警级”,Low 视为“记录级”。这构成了水位阈值的基础粒度。

3.2 安全基线策略:从扫描结果到策略输入

安全基线策略定义了“什么样的镜像被认为是安全的”。它通常包含以下三个维度的约束:

  1. 漏洞数量上限: 针对每个等级设定允许的最大漏洞数量。例如:Critical = 0,High ≤ 3,Medium ≤ 10。
  2. 漏洞修复状态: 是否存在已知修复版本但镜像未更新(即“可修复漏洞”)。通常可修复漏洞的权重高于不可修复漏洞。
  3. 基础镜像合规: 基础镜像是否来自受信仓库、是否包含最小化操作系统、是否使用 Distroless 镜像。

以下是一个典型的安全基线策略 JSON 示例,该策略将作为 Kyverno 策略的输入参数:

{
  "securityBaseline": {
    "vulnerabilityThresholds": {
      "critical": { "maxCount": 0, "action": "block" },
      "high":    { "maxCount": 3, "action": "warn" },
      "medium":  { "maxCount": 10, "action": "allow" },
      "low":     { "maxCount": -1, "action": "allow" }  // -1 表示不限制
    },
    "fixableOnly": {
      "enabled": true,
      "weightMultiplier": 2.0  // 可修复漏洞权重翻倍
    },
    "baseImagePolicy": {
      "allowedRegistries": ["docker.io/library/*", "gcr.io/distroless/*"],
      "minimalBaseRequired": true
    }
  }
}
避坑提示:不要将“允许 Medium 漏洞”等同于“忽略 Medium 漏洞”。在回滚判断场景中,如果新镜像的 Medium 漏洞数量比当前运行版本增加了 50%,即使未超过阈值,也应触发告警或人工审批。

3.3 水位阈值设定:阈值与相对阈值

水位阈值是安全基线策略在具体环境中的落地数值。我们将其分为两类:

  • 阈值: 直接限制漏洞数量。例如:生产环境 Critical = 0,预发环境 Critical ≤ 1。
  • 相对阈值: 对比当前运行版本与待部署版本的漏洞变化。例如:新版本 High 漏洞数量不得超过当前版本的 20%。

下表展示了不同环境下的典型阈值配置:

环境 Critical 阈值 High 阈值 High 相对阈值(增量) 回滚触发条件
生产 (prod) 0 0 不允许增加 任何 Critical 或 High 新增
预发 (staging) 0 ≤ 2 增量 ≤ 1 Critical 新增 或 High 增量 > 1
测试 (testing) ≤ 1 ≤ 5 增量 ≤ 3 Critical 增量 > 1 或 High 增量 > 3
开发 (dev) ≤ 3 ≤ 10 不限制 仅记录,不自动回滚

3.4 水位定义与门禁联动架构

下图展示了从镜像扫描、水位计算到 Kyverno 策略执行的整体数据流:

镜像安全水位定义与门禁联动架构 镜像扫描器 Trivy / Grype / Snyk 漏洞等级划分 Critical / High / Medium / Low 安全基线策略 数量上限 + 修复状态 水位阈值计算 阈值 + 相对阈值 Kyverno 策略引擎 变更门禁 / 回滚判断 允许 / 拒绝 / 回滚 关键输入 • 当前运行版本漏洞清单 • 待部署版本漏洞清单

3.5 水位定义在 Kyverno 策略中的表达

最终,上述水位定义需要转化为 Kyverno 策略中的 validate 或 mutate 规则。以下是一个简化的策略片段,演示如何将水位阈值写入策略:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: check-image-security-watermark
spec:
  validationFailureAction: Enforce
  rules:
  - name: block-critical-and-high-overflow
    match:
      any:
      - resources:
          kinds:
          - Pod
    preconditions:
      all:
      - key: "{{ request.object.spec.containers[].image }}"
        operator: IsNotNil
    validate:
      message: "镜像安全水位检查失败:Critical 漏洞必须为 0,High 漏洞不得超过 3 个。"
      deny:
        conditions:
          any:
          - key: "{{ image_scan_results.vulnerabilities.critical.count }}"
            operator: GreaterThan
            value: 0
          - key: "{{ image_scan_results.vulnerabilities.high.count }}"
            operator: GreaterThan
            value: 3
关键设计点:上述策略中的 image_scan_results 数据通常由准入控制器 webhook 在请求中注入,或由外部扫描器通过 ConfigMap 更新。在实际生产环境中,建议将阈值参数化,通过 Kyverno 的 values.yaml 或外部配置中心动态调整,避免频繁修改策略本身。

通过以上定义,我们完成了从漏洞等级到基线策略再到水位阈值的完整建模。下一环节将基于此模型,设计具体的 Kyverno 策略来实现变更门禁与回滚判断。