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 安全基线策略:从扫描结果到策略输入
安全基线策略定义了“什么样的镜像被认为是安全的”。它通常包含以下三个维度的约束:
- 漏洞数量上限: 针对每个等级设定允许的最大漏洞数量。例如:Critical = 0,High ≤ 3,Medium ≤ 10。
- 漏洞修复状态: 是否存在已知修复版本但镜像未更新(即“可修复漏洞”)。通常可修复漏洞的权重高于不可修复漏洞。
- 基础镜像合规: 基础镜像是否来自受信仓库、是否包含最小化操作系统、是否使用 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 策略执行的整体数据流:
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 策略来实现变更门禁与回滚判断。