2. 镜像供应链安全基础:镜像分层原理、基础镜像来源与SBOM概念

在K8s集群升级前,镜像供应链安全是必须优先评估的环节。镜像不仅是应用运行时的载体,更是操作系统依赖、第三方库、配置文件的集合体。一旦镜像供应链被污染,升级后的集群将面临从底层到应用层的全面风险。本节从镜像分层原理、基础镜像来源、软件物料清单(SBOM)三个核心维度建立安全基础认知。

2.1 镜像分层原理与安全影响

Docker/OCI镜像由多个只读层(Layer)堆叠而成,每一层对应Dockerfile中的一条指令。分层机制实现了存储复用与增量传输,但也引入了供应链安全风险:每一层都可能引入漏洞、恶意文件或配置漂移。

关键安全认知: 镜像的最终安全水位取决于最薄弱的一层。即使应用层完全安全,只要基础层或中间层存在已知漏洞(CVE),整个镜像即视为不安全。
镜像分层结构示意图(自底向上构建) Layer 1: 基础操作系统层(Ubuntu 22.04 / Alpine 3.18) Layer 2: 系统依赖与包管理器更新(apt/yum/apk) Layer 3: 运行时环境(Python 3.11 / Node.js 20 / JRE 17) Layer 4: 应用依赖库(pip install / npm install / maven) Layer 5: 应用代码与配置文件(COPY / ADD) Container Layer: 容器运行时可写层(临时) 基础镜像来源 第三方依赖 自研代码 每一层都是独立的文件系统差异集,层之间通过内容寻址(Content Hash)关联,任何一层的篡改都会破坏整体完整性
运维检查要点: 在升级前,应使用 docker history --no-trunc <image> 或 skopeo inspect 查看镜像分层历史,确认每一层的大小、创建指令和基础镜像来源。异常大的层或非预期的 ADD 指令往往是供应链攻击的入口。

2.2 基础镜像来源与可信度分级

基础镜像是镜像供应链的根。根据来源的可信度与维护水平,可将基础镜像分为四个等级。K8s集群升级前,必须对集群中所有工作负载的基础镜像来源进行审计。

等级 来源类型 典型示例 安全风险 升级前建议
L1 官方发行版 + 官方签名 ubuntu:22.04, alpine:3.18, registry.k8s.io/pause:3.9 低(有CVE跟踪和及时修复) 优先使用,锁定摘要(digest)
L2 官方认证镜像(Red Hat、SUSE、Chainguard) registry.access.redhat.com/ubi9, cgr.dev/chainguard/static 低-中(经过安全扫描,但版本可能滞后) 验证签名与SBOM
L3 社区维护镜像(Docker Hub、GitHub Container Registry) node:20-slim, python:3.11-slim 中-高(维护者水平参差,更新不及时) 必须扫描CVE,重建最小化镜像
L4 第三方或个人构建镜像 任意非官方仓库中的镜像 高(无审计、无签名、可能植入后门) 禁止直接使用,必须从源码重建
升级前红线: 集群中若存在L4级基础镜像,必须立即标记并替换。L3级镜像必须通过CVE扫描且高危漏洞清零后方可进入升级流程。L1/L2级镜像建议锁定至具体摘要(digest),避免使用可变标签(如 :latest)。

2.3 软件物料清单(SBOM)概念与生成

SBOM(Software Bill of Materials)是镜像中所有软件组件的结构化清单,包含组件名称、版本、许可证、依赖关系及来源信息。在K8s升级前,SBOM是判断镜像是否包含已知漏洞、许可证冲突或恶意组件的核心依据。

2.3.1 SBOM的核心字段

字段 说明 示例值
组件名称 软件包或库的标识 openssl, requests, log4j-core
版本号 精确版本,含补丁级别 3.0.8, 2.31.0, 2.17.1
许可证 开源许可证类型 Apache-2.0, MIT, GPL-3.0
来源URL 组件下载或仓库地址 https://pypi.org/project/requests/
依赖关系 该组件依赖的其他组件 cryptography, idna, certifi
哈希值 组件文件的完整性校验 sha256:abc123...

2.3.2 SBOM生成工具与格式

目前业界主流使用 SPDX 和 CycloneDX 两种标准格式。推荐在CI/CD流水线中集成SBOM生成,并在镜像仓库中与镜像一同存储。

# 使用 syft 生成 CycloneDX 格式的 SBOM
syft packages your-image:tag -o cyclonedx-json > sbom.cyclonedx.json

# 使用 trivy 生成 SPDX 格式的 SBOM
trivy image --format spdx-json --output sbom.spdx.json your-image:tag

# 验证 SBOM 与镜像的一致性(cosign)
cosign verify-attestation --type spdx your-image:tag
升级前SBOM检查清单:
  • 每个即将升级的节点上运行的镜像是否都有对应的SBOM?
  • SBOM中是否存在已知的高危/严重CVE(CVSS ≥ 7.0)?
  • SBOM中是否包含已被标记为恶意或废弃的组件?
  • SBOM中的许可证是否与组织合规策略冲突(如GPL-3.0在商业闭源产品中)?
  • SBOM的生成时间是否在镜像构建后的合理窗口内(建议不超过24小时)?
镜像供应链安全:从构建到SBOM的闭环流程 源码仓库 CI/CD构建 容器镜像 SBOM生成 CVE扫描 策略引擎 K8s准入控制 SBOM是连接构建、扫描、策略与准入控制的核心数据资产,升级前必须确保SBOM已生成且通过策略校验

2.4 镜像供应链安全水位评估指标

在K8s集群升级前,建议使用以下量化指标评估镜像供应链安全水位,并设定最低准入阈值。

指标 计算公式 安全阈值(升级前必须满足)
SBOM覆盖率 有SBOM的镜像数 / 总镜像数 × 100% ≥ 95%
基础镜像可信率 L1+L2级基础镜像数 / 总镜像数 × 100% ≥ 90%
高危CVE清零率 无高危CVE的镜像数 / 总镜像数 × 100% 100%
镜像签名率 已签名的镜像数 / 总镜像数 × 100% ≥ 80%(建议100%)
镜像年龄(天) 当前时间 - 镜像构建时间 ≤ 30天(生产环境)
实操建议: 使用 oras 或 crane 工具批量拉取镜像的SBOM和签名信息,结合 grype 或 trivy 进行离线CVE扫描。将扫描结果汇总为JSON报告,导入到集群的 策略引擎(如OPA/Gatekeeper) 中,实现升级前的自动化准入校验。