1. 供应链安全概述

1.1 软件供应链攻击案例

软件供应链攻击是指攻击者通过污染软件开发、构建、分发或部署环节中的任意一个节点,将恶意代码植入合法软件中,从而向下游用户传播。近年来,此类攻击呈爆发式增长,以下为三个标志性案例:

案例 攻击方式 影响范围 关键教训
SolarWinds Orion (2020) 入侵构建系统,向合法更新包注入后门 18,000+ 客户,包括美国政府机构 构建环境必须隔离,签名密钥必须硬件保护
Codecov Bash Uploader (2021) 篡改 Docker 镜像中的脚本,窃取 CI 环境变量 29,000+ 客户,泄露大量 CI/CD 凭据 镜像完整性校验不可缺失,依赖链需持续审计
Log4j (2021) 利用开源库远程代码执行漏洞 全球数百万应用,CVSS 10.0 开源依赖的版本锁定与 SBOM 管理是刚需
核心警示: 上述案例表明,攻击者不再直接攻击应用层,而是转向攻击开发工具、基础镜像、开源依赖和 CI/CD 管道。传统“边界防护”模型已无法应对此类供应链级威胁。

1.2 镜像供应链安全的重要性

容器镜像已成为现代应用交付的标准载体。一个镜像从构建到运行,会经历多个环节,每个环节都可能成为攻击面:

  • 基础镜像层: 使用来自公共仓库的未知来源镜像,可能包含恶意软件或已知漏洞。
  • 依赖引入层: 通过 apt、pip、npm 等包管理器引入的第三方库,可能被投毒。
  • 构建过程层: CI/CD 环境中的构建工具或缓存被篡改,导致输出镜像不可信。
  • 分发与部署层: 镜像在传输或存储过程中被替换,或注册表被攻破。

镜像供应链安全的核心目标是确保:“你运行的镜像,确实是你构建的镜像,且未被任何人篡改。” 这需要从构建到运行建立完整的可验证信任链。

关键指标: 根据 CNCF 调查报告,超过 60% 的受访组织在生产环境中遇到过与镜像相关的事故。实施镜像签名和验证的组织,平均事故响应时间缩短 70%。

1.3 SLSA 框架简介

SLSA(Supply-chain Levels for Software Artifacts,发音为“salsa”)是由 Google 主导、OpenSSF 推动的软件供应链安全框架。它定义了一套从低到高的安全等级,帮助组织评估和提升其软件制品的安全性。

SLSA 框架包含四个等级,每个等级对应一组必须满足的安全要求:

等级 名称 核心要求 典型实践
SLSA 1 可构建 构建过程可追溯,生成出处元数据 记录构建命令、来源仓库、构建时间
SLSA 2 防篡改 构建过程在隔离环境中运行,出处元数据签名 使用 CI/CD 托管构建器,对出处进行数字签名
SLSA 3 可审计 构建过程可重复,无外部网络依赖,防篡改 构建环境标准化,依赖锁定,禁止非预期网络访问
SLSA 4 最高级 构建过程完全可审计,双人审查,硬件密钥保护 双人代码审查 + 双人构建审批,HSM 签名

SLSA 框架与镜像供应链安全的关系非常紧密:Cosign 签名验证是实现 SLSA 2 及以上等级中“出处元数据签名”和“制品完整性验证”的关键技术工具。本课程后续章节将围绕 Cosign 展开,帮助你将镜像供应链安全从 SLSA 1 逐步提升至 SLSA 4。

SLSA 与 Cosign 的映射: 在 SLSA 2 中,要求对构建出处(Provenance)进行签名。Cosign 可以签名镜像本身,也可以签名 attestation(证明文件),从而满足 SLSA 2 的签名要求。在 SLSA 3 和 4 中,Cosign 结合硬件密钥和策略引擎,可提供更强的防篡改保证。
软件供应链攻击面与 SLSA 等级映射 基础镜像投毒 依赖库篡改 构建环境入侵 镜像替换/劫持 SLSA 1:可构建 SLSA 2:防篡改 SLSA 3:可审计 SLSA 4:最高级 Cosign 签名验证的作用 • 对镜像进行数字签名 • 验证镜像完整性与来源 • 签名构建出处元数据 • 支持硬件密钥(HSM) • 实现策略驱动的部署 对应 SLSA 2 ~ 4 等级 是镜像供应链安全的核心工具

1.4 镜像供应链安全的关键实践

结合 SLSA 框架和实际攻击案例,镜像供应链安全需要从以下四个维度建立纵深防御:

  1. 来源验证: 只使用经过签名的、来源可追溯的基础镜像。通过 Cosign 验证镜像签名,确保镜像来自可信的发布者。
  2. 完整性校验: 在构建、分发和部署的每个环节,对镜像进行完整性校验(如 SHA256 摘要比对),防止镜像被篡改。
  3. 出处记录: 生成并签名镜像的构建出处(Provenance),记录构建时间、构建工具、依赖列表等信息,满足 SLSA 2+ 的审计要求。
  4. 策略执行: 在部署阶段,通过策略引擎(如 Kyverno、OPA)强制要求镜像必须经过签名验证,拒绝未签名或签名无效的镜像。
快速入门建议: 从 SLSA 1 开始,先为你的镜像生成出处元数据(如使用 Docker BuildKit 的 --attest 参数),然后使用 Cosign 对镜像进行签名,即可达到 SLSA 2 的基本要求。后续再逐步引入硬件密钥和策略引擎,向 SLSA 3/4 迈进。
镜像供应链安全纵深防御架构 来源验证 • 签名验证 • 可信仓库 • 发布者身份 完整性校验 • SHA256 摘要 • Cosign 验证 • 防篡改校验 出处记录 • 构建元数据 • 依赖清单 • SLSA 出处 策略执行 • 强制验证 • 拒绝未签名 • 审计告警 纵深防御流程 1. 开发阶段:使用 Cosign 对构建的镜像进行签名,并生成出处元数据。 2. 分发阶段:将签名和出处信息一同推送到镜像仓库,确保可验证。 3. 部署阶段:通过策略引擎强制验证签名,未通过验证的镜像拒绝部署。 4. 运行时:持续审计镜像使用情况,发现异常立即告警并触发回滚。

1.5 本章小结