简介
工件证明是为构建的软件创建不可伪造的来源和完整性保证的好方法。
但请记住,工件证明本身只提供链接,例如构建工件所使用的构建说明,满足 SLSA v1.0 构建级别 2。要做出明智的风险决策,您需要遵循这些链接并评估这些构建说明。
您可以更进一步,要求构建使用已知且经过验证的构建说明。一种很好的方法是让您的构建在一个可重用的工作流中进行,该工作流由组织中的许多存储库共享。可重用工作流可以在构建过程和调用工作流之间提供隔离,以满足 SLSA v1.0 构建级别 3。
在开始本指南之前,您应该熟悉以下内容:
- 生成工件证明。请参阅“使用工件证明为构建建立来源”。
- 编写和使用可重用工作流。请参阅“重用工作流”。
步骤 1:配置构建
首先,我们需要使用工件证明和可重用工作流进行构建。
使用可重用工作流构建
如果您尚未使用可重用工作流构建软件,则需要将构建步骤移动到可重用工作流中。有关如何编写和调用可重用工作流的更多信息,请参阅“重用工作流”。
使用工件证明构建
用于构建软件的可重用工作流还必须生成工件证明以建立构建来源。有关更多信息,请参阅“使用工件证明为构建建立来源”。
当您使用可重用工作流生成工件证明时,调用工作流和可重用工作流都需要具有以下权限。
permissions: attestations: write contents: read id-token: write
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
,您可以执行以下操作:
gh attestation verify -o ORGANIZATION_NAME --signer-repo REUSABLE_ORGANIZATION_NAME/REUSABLE_REPOSITORY_NAME PATH/TO/YOUR/BUILD/ARTIFACT-BINARY
gh attestation verify -o ORGANIZATION_NAME --signer-repo REUSABLE_ORGANIZATION_NAME/REUSABLE_REPOSITORY_NAME PATH/TO/YOUR/BUILD/ARTIFACT-BINARY
或者,如果您想指定确切的工作流
gh attestation verify -o ORGANIZATION_NAME --signer-workflow REUSABLE_ORGANIZATION_NAME/REUSABLE_REPOSITORY_NAME/.github/workflows/reusable.yml PATH/TO/YOUR/BUILD/ARTIFACT-BINARY
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 所需的隔离。您可以通过要求工件是使用特定工作流(可重用或不可重用)构建的来验证工件是否使用已知、经过验证的构建指令构建。