3. 镜像供应链安全全景:全链路风险点与 Kyverno 介入环节
容器镜像供应链安全是云原生安全体系中最具挑战性的领域之一。一个镜像从代码提交到生产运行,会经历构建、仓库存储、部署运行三个阶段,每个阶段都存在独特的安全风险。Kyverno 作为 Kubernetes 原生的策略引擎,能够在多个环节提供自动化的安全准入控制与审计能力。
3.1 镜像供应链全链路风险图谱
下表系统梳理了镜像供应链三个主要阶段的风险点,以及 Kyverno 可介入的策略控制环节:
| 阶段 | 风险点 | 风险描述 | Kyverno 介入环节 |
|---|---|---|---|
| 镜像构建 | 基础镜像来源不可信 | 使用来自公共仓库的未知或恶意基础镜像 | 验证镜像来源(Registry 白名单) |
| 构建过程引入漏洞 | 依赖包、库存在已知 CVE 漏洞 | 检查镜像签名与 SBOM 元数据 | |
| 构建产物篡改 | CI/CD 管道被攻击,镜像被注入恶意代码 | 强制镜像签名验证(Cosign) | |
| 仓库存储 | 镜像标签覆盖 | 使用 :latest 标签导致不可复现部署 |
禁止可变标签,强制使用摘要引用 |
| 仓库访问控制薄弱 | 未授权用户推送或删除镜像 | (仓库侧策略,Kyverno 可审计拉取来源) | |
| 镜像过期未清理 | 大量陈旧镜像占用存储,增加攻击面 | 策略标记过期镜像,阻止其被部署 | |
| 部署运行 | 镜像拉取策略不当 | imagePullPolicy: Always 导致运行时拉取非预期版本 |
强制 IfNotPresent 或 Never |
| 特权容器运行 | 容器以 root 或特权模式运行,突破隔离 | 禁止 privileged: true 与 allowPrivilegeEscalation: true |
|
| 镜像运行时篡改 | 容器启动后文件系统被挂载修改 | 只读根文件系统策略(readOnlyRootFilesystem: true) |
|
| 非预期镜像来源 | 从非授权仓库拉取镜像 | Registry 白名单 + 镜像摘要验证 |
关键洞察: 镜像供应链安全的核心原则是“不可变与可验证”。Kyverno 在部署运行阶段拥有最强的控制力,但最佳实践要求将安全左移至构建阶段,通过签名与元数据验证建立信任链。
3.2 全链路风险可视化:镜像供应链安全架构
下图展示了镜像从构建到运行的全链路风险分布,以及 Kyverno 策略引擎在各环节的介入点:
3.3 冷启动场景下的镜像供应链风险
在集群冷启动(从零恢复或新建集群)场景下,镜像供应链风险会被急剧放大。此时大量 Pod 同时调度,镜像拉取并发量激增,攻击者可能利用以下薄弱环节:
- 镜像缓存缺失: 冷启动时本地节点无缓存,所有镜像需从远程仓库拉取,增加了中间人攻击窗口。
- 拉取策略失控: 大量 Pod 使用
imagePullPolicy: Always导致仓库负载飙升,可能触发限流或返回过时镜像。 - 签名验证跳过: 为加速冷启动,运维人员可能临时关闭镜像签名验证,引入安全缺口。
- 临时仓库信任: 冷启动期间可能临时添加非可信镜像仓库以获取依赖,事后忘记移除。
冷启动安全红线: 绝不为加速冷启动而降低镜像安全标准。应通过预热节点缓存、使用 P2P 分发(如 Dragonfly)、提前准备镜像列表等工程手段解决性能问题,而非牺牲安全策略。
3.4 Kyverno 策略介入优先级矩阵
根据风险影响与实施难度,建议按以下优先级部署 Kyverno 镜像供应链策略:
| 优先级 | 策略名称 | 风险缓解 | 实施难度 |
|---|---|---|---|
| P0 | 禁止特权容器 + 禁止特权提升 | 防止容器逃逸与主机访问 | 低 |
| P0 | 强制镜像摘要引用(禁止可变标签) | 确保部署可复现,防止标签覆盖攻击 | 低 |
| P1 | Registry 白名单 | 限制镜像来源,防止恶意仓库 | 中 |
| P1 | 强制只读根文件系统 | 防止运行时文件篡改 | 中 |
| P2 | 镜像签名验证(Cosign) | 验证镜像完整性与发布者身份 | 高 |
| P2 | SBOM 与漏洞扫描结果校验 | 阻止含高危漏洞的镜像部署 | 高 |
3.5 权限变更风险与镜像供应链的交叉影响
镜像供应链安全与权限变更风险存在深度交叉。当集群角色或 ServiceAccount 权限发生变更时,可能间接影响镜像供应链安全:
- 权限提升导致镜像源篡改: 拥有
image资源写权限的账户可修改 Deployment 镜像地址,指向恶意仓库。 - RBAC 变更绕过策略: 新增的 ClusterRole 可能包含
images资源的豁免权限,绕过 Kyverno 的镜像验证策略。 - ServiceAccount 劫持: 被攻破的 ServiceAccount 可拉取私有仓库镜像,或推送恶意镜像到受信仓库。
最佳实践: 将镜像供应链策略与 RBAC 审计策略联动部署。每次权限变更触发镜像策略重新评估,确保权限变更不会意外打开镜像供应链的安全缺口。
3.6 镜像供应链策略的冷启动削峰设计
针对冷启动场景,Kyverno 策略需要做专门的削峰设计,避免策略引擎本身成为冷启动瓶颈:
3.7 典型 Kyverno 策略示例:镜像来源与签名验证
以下是一个完整的 Kyverno 策略示例,同时验证镜像来源(Registry 白名单)和镜像签名(Cosign):
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: secure-image-supply-chain
spec:
validationFailureAction: Enforce
background: true
rules:
- name: validate-registry-and-signature
match:
any:
- resources:
kinds:
- Pod
preconditions:
all:
- key: "{{ request.object.spec.containers[].image || '' }}"
operator: NotEquals
value: ""
validate:
message: "镜像必须来自受信仓库且包含有效 Cosign 签名"
foreach:
- list: "request.object.spec.containers"
deny:
conditions:
any:
# 条件 1:检查 Registry 白名单
- key: "{{ element.image }}"
operator: NotMatches
value: "harbor.internal.example.com/*|docker.io/verified-org/*"
# 条件 2:检查镜像是否包含签名注解
- key: "{{ element.image }}"
operator: NotMatches
value: ".*@sha256:.*"
mutate:
patchStrategicMerge:
metadata:
annotations:
kyverno.io/verified-at: "{{ time.now() }}"
策略要点: 该策略同时实现了三个安全目标——限制镜像来源(白名单)、强制使用摘要引用(
@sha256:)、以及通过注解记录验证时间戳。在冷启动场景下,建议配合缓存层使用,避免每次准入都触发远程签名验证。