跳到内容

第 8 卷 / 第 10 章 / 第 2 课

10.2 构建 Provenance 与 SLSA 1.2 ​

Provenance 描述制品怎样产生:哪个 builder、使用什么 build definition、哪些顶层输入、输出 digest 是什么。它与 SBOM 互补:SBOM 是“里面有什么”,provenance 是“从哪里、怎样构建”。

Attestation 把声明绑定到制品 ​

text
subject: artifact sha256:abc...
predicateType: SLSA provenance
predicate:
  builder identity
  build type and parameters
  source revision and dependencies
  invocation/environment metadata
signature / transparency evidence

这段是概念结构,不是完整 in-toto JSON。subject 指被声明的制品;签署者身份来自签名及其信任配置,两者不能混淆。消费者必须验证签署者和声明内容,而不是只确认“有一个 attestation”。攻击者给恶意制品生成自己的合法签名毫无困难,关键是策略是否信任这个 builder 为这个 repository/build type 生产该制品。

SLSA 1.2 采用多个 Track ​

旧版资料常写单一 SLSA L1–L4;本课采用已批准的 SLSA 1.2,其 Build 与 Source 是独立 tracks。

Build track:

text
L0:无保证
L1:构建过程记录 provenance,并提供给消费者
L2:由 hosted build platform 生成并签名 provenance
L3:hardened build platform,进一步抵抗构建中篡改

Source track 关注源码 revision 的产生与控制:Source L1 是版本控制,L2 增加历史与来源记录,L3 强制组织的持续技术控制,L4 要求双人评审。一个 artifact 的 Build level 不会自动证明依赖同等级,也不自动证明源码没有恶意逻辑。

不要继续引用旧的“Build L4 必须可复现/两人评审”作为现行 1.2 要求;这些性质仍有价值,但应按当前 track 和组织策略单独表达。

Builder 是信任根的一部分 ​

如果项目构建脚本能取得平台的 provenance 签名密钥,或让平台为任意伪造声明签名,消费者就不能把声明当成独立平台证据。高等级构建要求 provenance 由平台控制面产生,build job 无法任意伪造,并在不同租户/构建间隔离。

Self-hosted runner 是否满足要求取决于谁生成 provenance、谁持有签名能力,以及 runner 是否能影响这些声明。不能因为界面显示“hosted CI”就自动宣称某级别。

构建平台应:

  • 临时、隔离、任务后销毁;
  • 固定并验证 build image 与工具链;
  • 对网络依赖、缓存和 secret 有明确策略;
  • 平台生成构建任务无法伪造的 provenance;
  • 将 source revision 与 build definition 固定;
  • 记录平台与策略版本并支持审计。

Hermetic 与 Reproducible 回答不同问题 ​

Hermetic build 的输入全部声明并受控,构建时不从未知网络/主机状态获取材料。Reproducible build 指相同输入可独立得到相同输出。前者改善输入完整性,后者提供交叉验证能力;可复现不保证源码无恶意,hermetic 也不自动得到字节一致。

时间戳、路径、随机种子、压缩顺序和工具链差异都会破坏可复现。应从关键制品开始消除非确定性,并由独立 builder 比较 digest。

消费端必须形成期望 ​

验证策略示例:

text
artifact digest matches attestation subject
AND source repository == expected repo
AND source revision is protected and reviewed
AND builder identity in approved builders
AND build type/parameters match release workflow
AND provenance signature/transparency evidence valid

例如声明中的输出 digest 与下载文件一致,但 builder 来自个人 fork,仍应拒绝;builder 正确却使用未批准的 release 参数,也应拒绝。“源码经过评审”还需可信源码控制证据或外部策略查询,不能仅凭 provenance 里写了一个 commit 就推断。

只存 provenance 而不在发布/部署时验证,不能在该边界阻止不符预期的制品。下一课把签名、透明日志与准入策略接成接受决策。

参考资料 ​

Built with VitePress | Software Systems Atlas