跳至主要内容

使用工件证明和可重用工作流实现 SLSA v1 构建级别 3

使用可重用工作流和工件证明构建软件可以简化您的供应链安全,并帮助您实现 SLSA v1.0 构建级别 3。

简介

工件证明是为构建的软件创建不可伪造的来源和完整性保证的好方法。

但请记住,工件证明本身只提供链接,例如构建工件所使用的构建说明,满足 SLSA v1.0 构建级别 2。要做出明智的风险决策,您需要遵循这些链接并评估这些构建说明。

您可以更进一步,要求构建使用已知且经过验证的构建说明。一种很好的方法是让您的构建在一个可重用的工作流中进行,该工作流由组织中的许多存储库共享。可重用工作流可以在构建过程和调用工作流之间提供隔离,以满足 SLSA v1.0 构建级别 3。

在开始本指南之前,您应该熟悉以下内容:

步骤 1:配置构建

首先,我们需要使用工件证明和可重用工作流进行构建。

使用可重用工作流构建

如果您尚未使用可重用工作流构建软件,则需要将构建步骤移动到可重用工作流中。有关如何编写和调用可重用工作流的更多信息,请参阅“重用工作流”。

使用工件证明构建

用于构建软件的可重用工作流还必须生成工件证明以建立构建来源。有关更多信息,请参阅“使用工件证明为构建建立来源”。

当您使用可重用工作流生成工件证明时,调用工作流和可重用工作流都需要具有以下权限。

YAML
permissions:
  attestations: write
  contents: read
  id-token: write

如果您正在构建容器镜像,则还需要包含 packages: write 权限。

步骤 2:验证使用可重用工作流构建的工件证明

要验证使用构建生成的工件证明,您可以使用 GitHub CLI 中的 gh attestation verify

gh attestation verify 命令需要与之一起使用 --owner--repo 标志。这些标志执行两项操作。

  • 它们告诉 gh attestation verify 从哪里获取证明。这将始终是您的调用工作流。
  • 它们告诉 gh attestation verify 进行签名的工作流来自哪里。这将始终是使用 attest-build-provenance 操作 的工作流,这可能是一个可重用的工作流。

您可以使用 gh attestation verify 命令的可选标志。

  • 如果您的可重用工作流不在与调用工作流相同的存储库中,请使用 --signer-repo 标志指定包含可重用工作流的存储库。

  • 如果您希望要求工件证明必须使用特定的工作流进行签名,请使用--signer-workflow标志指示应使用的工作流文件。

例如,如果您的调用工作流是ORGANIZATION_NAME/REPOSITORY_NAME/.github/workflows/calling.yml并且它使用了REUSABLE_ORGANIZATION_NAME/REUSABLE_REPOSITORY_NAME/.github/workflows/reusable.yml,您可以执行以下操作:

Bash
gh attestation verify -o ORGANIZATION_NAME --signer-repo REUSABLE_ORGANIZATION_NAME/REUSABLE_REPOSITORY_NAME PATH/TO/YOUR/BUILD/ARTIFACT-BINARY

或者,如果您想指定确切的工作流

Bash
gh attestation verify -o ORGANIZATION_NAME --signer-workflow REUSABLE_ORGANIZATION_NAME/REUSABLE_REPOSITORY_NAME/.github/workflows/reusable.yml PATH/TO/YOUR/BUILD/ARTIFACT-BINARY

结论

您现在正在可重用的工作流中构建和签名工件,这可以提供 SLSA v1.0 构建级别 3 所需的隔离。您可以通过要求工件是使用特定工作流(可重用或不可重用)构建的来验证工件是否使用已知、经过验证的构建指令构建。