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 策略引擎在各环节的介入点:

镜像供应链安全全链路风险与 Kyverno 介入点 镜像供应链安全全链路风险与 Kyverno 介入点 阶段 1:镜像构建 风险:基础镜像不可信 风险:依赖包 CVE 漏洞 风险:构建产物被篡改 阶段 2:仓库存储 风险:标签覆盖不可复现 风险:访问控制薄弱 风险:镜像过期未清理 阶段 3:部署运行 风险:拉取策略不当 风险:特权容器运行 风险:运行时文件篡改 Kyverno 策略引擎介入层 构建阶段策略示例 • 强制镜像签名验证 • 基础镜像 Registry 白名单 • 检查 SBOM 元数据 • 禁止 :latest 标签 存储阶段策略示例 • 强制镜像摘要引用 • 镜像年龄审计策略 • 仓库来源白名单 • 标签命名规范校验 部署运行阶段策略示例 • 禁止特权容器 • 强制只读根文件系统 • 镜像拉取策略校验 • 非 root 用户运行

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 策略需要做专门的削峰设计,避免策略引擎本身成为冷启动瓶颈:

冷启动镜像策略削峰设计 冷启动镜像策略削峰设计 常规策略(高开销) 每次准入:全量签名验证 + SBOM 解析 每次准入:远程仓库元数据查询 冷启动时:队列积压,Pod 创建延迟 削峰策略(低开销) 缓存签名验证结果(TTL 控制) 异步 SBOM 扫描,不阻塞准入 预热策略缓存 + 批量验证 削峰核心:将阻塞式验证改为缓存+异步模式,降低冷启动准入延迟

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:)、以及通过注解记录验证时间戳。在冷启动场景下,建议配合缓存层使用,避免每次准入都触发远程签名验证。