软件供应链安全基础:SLSA框架、SBOM与镜像签名验签

现代云原生应用的交付链条高度自动化,从代码提交、构建、测试、打包到部署,任何一个环节被篡改或植入恶意组件,都会导致整个生产环境面临严重风险。本章围绕软件供应链安全的三个核心支柱——SLSA框架、软件物料清单(SBOM)、镜像签名与验签——展开讲解,为后续使用 Cosign 进行镜像安全通信打下理论基础。

2.1 软件供应链安全威胁模型

在深入具体技术之前,先明确软件供应链面临的主要攻击向量:

  • 上游依赖投毒:攻击者向公共仓库(如 npm、PyPI、Docker Hub)上传包含后门的恶意包。
  • 构建环境篡改:CI/CD 流水线被入侵,构建过程中被注入恶意代码或替换制品。
  • 镜像仓库劫持:攻击者获得仓库凭证,将合法镜像替换为恶意镜像。
  • 中间人攻击:拉取镜像时,传输链路被拦截并替换内容。
  • 运行时投毒:已部署的容器被植入后门,或利用漏洞从外部篡改镜像层。
关键认知: 传统安全模型只关注“边界防御”和“运行时扫描”,但无法防御“合法镜像被篡改后重新签名”或“构建时被植入后门”这类供应链攻击。SLSA、SBOM 和签名验签正是为了解决这些盲区而设计。

2.2 SLSA框架:供应链安全成熟度模型

SLSA(Supply-chain Levels for Software Artifacts) 由 Google 发起,现为 OpenSSF 下的开放标准。它定义了一套从低到高的安全等级,帮助组织评估并提升软件制品的供应链安全水平。

SLSA 等级 核心要求 典型实践
SLSA 1 构建过程可追溯 构建日志、版本控制、自动化构建
SLSA 2 构建过程防篡改 隔离构建环境、签名构建产物、生成来源证明
SLSA 3 构建过程可审计且防旁路 无特权构建、硬件信任根、不可变构建日志
SLSA 4 构建过程完全可验证 双人审查、可重现构建、完整来源链

在 Kubernetes 镜像安全场景中,达到 SLSA 2 是最低可接受门槛:必须对镜像进行签名,并生成可验证的来源证明(Provenance)。SLSA 3 和 SLSA 4 则适用于金融、医疗等强监管行业。

实践建议: 在搭建镜像签名流水线时,优先确保 CI/CD 构建环境本身满足 SLSA 2 要求(如使用隔离 runner、签名构建产物),再对镜像进行 Cosign 签名。不要跳过构建环境安全直接签名,否则签名本身可能被伪造。

2.3 软件物料清单(SBOM)

SBOM(Software Bill of Materials) 是软件制品中包含的所有组件、依赖项、版本号、许可证和来源的清单。它相当于软件的“成分表”。

SBOM 的核心价值:

  • 漏洞管理:当某个依赖(如 Log4j)爆出高危漏洞时,通过 SBOM 可以快速定位哪些镜像受影响。
  • 许可证合规:自动检查镜像中是否包含 GPL、AGPL 等传染性许可证。
  • 供应链审计:追溯每个组件的来源,验证是否来自可信仓库。

常见的 SBOM 格式包括 CycloneDX(OWASP 维护,容器生态首选)和 SPDX(Linux 基金会维护,法律合规场景常用)。

常见误区: SBOM 本身不保证安全。它只是“清单”,如果清单中的组件来自恶意源,SBOM 只会如实记录恶意组件。SBOM 必须与签名验签结合使用——先验证镜像签名可信,再解析 SBOM 进行漏洞扫描。
SLSA 等级与容器镜像安全成熟度 SLSA 1 可追溯构建 镜像有构建日志 无签名要求 SLSA 2 防篡改构建 镜像签名 来源证明 SLSA 3 可审计构建 硬件信任根 不可变日志 SLSA 4 完全可验证 可重现构建 完整来源链 K8s 镜像安全基线 • 最低要求:SLSA 2(镜像签名 + 来源证明) • 推荐目标:SLSA 3(硬件信任根 + 不可变构建日志) • 高级场景:SLSA 4(可重现构建 + 双人审查) 镜像安全交付流水线 代码 + SBOM 构建 + 签名 推送仓库 部署验签

2.4 镜像签名与验签的基本概念

镜像签名是一种密码学保证,用于证明镜像的发布者身份以及镜像内容未被篡改。其核心流程如下:

  1. 签名(Sign):发布者使用自己的私钥对镜像的摘要(Digest)进行签名,生成签名文件。
  2. 存储(Store):签名文件通常存储在镜像仓库中(如 OCI 仓库的 tag 或 referrers API),或独立的公证服务(如 Rekor 透明日志)。
  3. 验签(Verify):消费者(如 kubelet、准入控制器)使用发布者的公钥验证签名是否匹配镜像摘要。
核心原则: 签名的是“镜像摘要”(sha256:...),而不是“镜像标签”(:latest)。因为标签可变,摘要不可变。验签时先计算本地镜像的摘要,再验证签名是否对该摘要有效。

下表对比了常见的镜像签名工具与机制:

工具/机制 密钥管理 透明日志 K8s 集成 适用场景
Cosign 密钥对 / KMS / 密钥链 Rekor(默认) 原生(k8s 验证 webhook) 云原生首选,轻量,社区活跃
Notation 证书 + 私钥 可选(Rekor 或自建) 通过 Ratify 准入控制器 企业 PKI 环境,与 Notary 生态兼容
Docker Content Trust (DCT) Notary 服务 Notary 服务 有限(需额外配置) 遗留 Docker 环境,已逐渐被 Cosign 取代
Sigstore 无密钥(OIDC 身份) Rekor(强制) 通过 Cosign 集成 开源项目、CI/CD 自动化签名
镜像签名与验签流程 签名方(发布者) 1. 计算镜像摘要 2. 使用私钥签名 3. 推送签名到仓库 4. 记录到 Rekor 日志 OCI 镜像仓库 镜像层 (blobs) 镜像清单 (manifest) 签名对象 SBOM 对象 (通过 referrers API 关联) 验签方(消费者) 1. 拉取镜像 + 签名 2. 计算本地摘要 3. 使用公钥验签 4. 通过 → 允许部署 Rekor 透明日志

2.5 签名与验签在 Kubernetes 中的落地形态

在 K8s 环境中,镜像验签通常通过 准入控制器(Admission Controller) 实现。当用户提交 Pod 或 Deployment 时,准入控制器拦截请求,执行以下步骤:

  1. 解析 Pod 中引用的所有镜像。
  2. 从镜像仓库拉取对应的签名对象。
  3. 使用预先配置的公钥(或通过 Sigstore 的 Fulcio 证书链)验证签名。
  4. 如果验签失败,拒绝创建 Pod;如果成功,允许继续调度。
推荐工具链: Cosign + Kyverno 或 Cosign + OPA Gatekeeper。Kyverno 内置了 verifyImages 规则,可以直接调用 Cosign 进行验签,无需额外编写 Webhook 代码。

2.6 本章小结

  • SLSA 框架 提供了供应链安全的分级标准,镜像签名是达到 SLSA 2 的必要条件。
  • SBOM 是镜像的“成分表”,与签名结合才能实现可信的漏洞管理。
  • 镜像签名 使用私钥对镜像摘要签名,验签使用公钥验证,确保镜像发布者身份和内容完整性。
  • K8s 环境 通过准入控制器自动执行验签,拒绝未签名或签名无效的镜像。