2025 年,供应链攻击占比从 1% 跃升至 7%,Forrester 数据显示 30% 的外部攻击源于软件供应链漏洞。镜像扫描解决了“有没有漏洞”的问题,镜像签名解决了“从哪里来”的问题,但它们都无法回答一个更根本的问题:这个制品是怎么构建出来的?构建过程是否可信? 这就是 SLSA(Supply-chain Levels for Software Artifacts) 框架要解决的核心问题。本文从 SLSA 框架的四个安全等级讲起,深入讲解 SBOM(软件物料清单)的生成与格式、provenance(构建出处证明)的生成与验证,以及如何将供应链安全实践嵌入 CI/CD 流水线,帮你构建从“代码”到“部署”的全链路可信交付体系。
一、SLSA 框架:供应链安全的“成熟度模型”
SLSA(Supply-chain Levels for Software Artifacts,软件制品供应链级别)是由 OpenSSF(开源安全基金会)发起的一套行业标准,它为软件供应链安全定义了渐进式的安全等级,从 L0 到 L3。
1.1 SLSA 的四个安全等级
每一个更高等级都建立在之前等级的所有要求之上。SLSA 框架当前版本定义了对构建出处证明(provenance)、源代码完整性和构建环境安全等领域的重点关注。
💡 实践建议:从 L1 起步,先让 provenance 在 CI 中可追溯;达到 L2 后,签名 provenance 并上传到 Rekor 透明度日志;L3 需要加固构建基础设施,适合对安全性要求极高的生产环境。
二、SBOM:软件物料清单
SBOM(Software Bill of Materials,软件物料清单) 是一份正式记录,列出软件制品中包含的所有组件及其版本信息。在供应链攻击日益频繁的今天,SBOM 已成为安全合规的基本要求——没有 SBOM,就无法知道你的软件里到底有什么。
2.1 SBOM 的主流格式
2.2 使用 Syft 生成 SBOM
Syft 是 Anchore 开源的 SBOM 生成工具,支持从容器镜像和文件系统中生成软件物料清单。
安装 Syft:
# macOSbrewinstallsyft# Linuxcurl-sSfLhttps://raw.githubusercontent.com/anchore/syft/main/install.sh|sh-s---b/usr/local/bin生成 SBOM(CycloneDX JSON 格式) :
# 从容器镜像生成 SBOMsyft scan myapp:latest-ocyclonedx-json# 输出到文件syft scan myapp:latest-ocyclonedx-json=./sbom.cdx.json# 同时生成多种格式syft scan myapp:latest-ospdx-json=./sbom.spdx.json-ocyclonedx-json=./sbom.cdx.json[reference:10]2.3 在 CI 中集成 SBOM 生成
以下 GitHub Actions 工作流在镜像构建后自动生成 SBOM 并上传为 Artifact:
# .github/workflows/sbom-generate.ymlname:Generate SBOMon:push:branches:[main]jobs:build-and-sbom:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v4-name:Build Docker imagerun:docker build-t myapp:latest .-name:Generate SBOM with Syftrun:|syft scan myapp:latest -o cyclonedx-json=./sbom.cdx.json syft scan myapp:latest -o spdx-json=./sbom.spdx.json-name:Upload SBOM as Artifactuses:actions/upload-artifact@v4with:name:sbompath:./sbom.*.json三、Provenance:构建出处证明
Provenance(构建出处证明) 是一份可验证的元数据,记录了软件制品“由谁、如何、用什么输入”构建而成。它解决了“这个制品是怎么来的”这一核心问题。
SLSA 的每个等级对 provenance 的要求逐步提高:
L1:provenance 存在,记录构建过程
L2:provenance 由托管构建平台签名
L3:provenance 在加固的构建平台上生成,防止构建期间篡改
3.1 使用 in-toto 生成 provenance
in-toto 是一个用于保护软件供应链完整性的框架,通过在 CI/CD 流程的每个步骤创建加密签名的 attestation(证明)。
生成 SLSA Provenance 的基本流程:
# 1. 生成 provenance 谓词(predicate)文件# provenance.json 包含构建信息:构建器、输入材料、输出制品等# 2. 使用 Cosign 对 provenance 进行签名cosign attest-blob\--type=slsaprovenance\--predicate=provenance.json\myapp:latest[reference:15]3.2 使用 Sigstore 实现无密钥签名
Sigstore 项目提供了一套工具链(Cosign、Fulcio CA、Rekor 透明度日志),实现了“无密钥签名”——开发者无需管理私钥,通过 GitHub OIDC 即可完成签名和验证。
在 GitHub Actions 中签名镜像并生成 provenance:
-name:Sign image with Cosign (Keyless)run:|cosign sign --keyless \ --oidc-issuer "https://token.actions.githubusercontent.com" \ ghcr.io/${{ github.repository }}:${{ github.sha }}env:COSIGN_EXPERIMENTAL:"true"签名后,镜像的 provenance 信息会被记录到 Rekor 透明度日志中,任何人都可以公开验证。
四、实战:完整的供应链安全 CI 流水线
将 SBOM、镜像签名和 provenance 集成到一条完整的 CI 流水线中:
# .github/workflows/supply-chain-security.ymlname:Supply Chain Securityon:push:branches:[main]jobs:build-and-attest:runs-on:ubuntu-latestpermissions:contents:readid-token:write# 用于 OIDC 无密钥签名packages:write# 用于推送镜像到 GHCRsteps:-uses:actions/checkout@v4# 1. 构建镜像-name:Build Docker imagerun:docker build-t ghcr.io/${{github.repository}}:${{github.sha}}.# 2. 推送镜像-name:Push imagerun:docker push ghcr.io/${{github.repository}}:${{github.sha}}# 3. 生成 SBOM-name:Generate SBOMrun:|syft scan ghcr.io/${{ github.repository }}:${{ github.sha }} \ -o cyclonedx-json=./sbom.cdx.json# 4. 上传 SBOM 作为 Artifact-name:Upload SBOMuses:actions/upload-artifact@v4with:name:sbompath:./sbom.cdx.json# 5. 无密钥签名镜像-name:Sign image with Cosignrun:|cosign sign --keyless \ --oidc-issuer "https://token.actions.githubusercontent.com" \ ghcr.io/${{ github.repository }}:${{ github.sha }}env:COSIGN_EXPERIMENTAL:"true"# 6. 验证签名-name:Verify signaturerun:|cosign verify --keyless \ --oidc-issuer "https://token.actions.githubusercontent.com" \ ghcr.io/${{ github.repository }}:${{ github.sha }}五、在 Kubernetes 中验证供应链安全
通过 Kyverno 的 ImageVerificationPolicy,可以在 Pod 调度前强制验证镜像签名:
apiVersion:kyverno.io/v1kind:ClusterPolicymetadata:name:verify-image-signaturespec:validationFailureAction:Enforcerules:-name:verify-signaturematch:any:-resources:kinds:-PodverifyImages:-imageReferences:-"ghcr.io/myorg/*"attestors:-entries:-keyless:issuer:"https://token.actions.githubusercontent.com"rekor:url:"https://rekor.sigstore.dev"此策略会拒绝所有来自 ghcr.io/myorg/* 但未经签名验证的 Pod。
六、小结
SLSA 框架:从 L0 到 L3 的四个安全等级,L2 要求签名 provenance,L3 要求加固构建平台。
SBOM:使用 Syft 生成 CycloneDX/SPDX 格式的软件物料清单。
Provenance:使用 in-toto 生成构建出处证明,使用 Cosign 进行签名。
Sigstore 无密钥签名:通过 GitHub OIDC 自动签名,无需管理私钥。
Kubernetes 准入控制:通过 Kyverno ImageVerificationPolicy 强制验证镜像签名。