Skip to main content

保护生成系统的最佳做法

关于如何保护供应链末端(用于构建和分发工件的系统)的指南。

关于本指南

本指南介绍为提高生成系统的安全性而做出的影响最大的更改。 每个部分都概述了可以对流程进行的更改,以提高安全性。 影响最大的更改列在前面。

风险是什么?

对软件供应链的一些攻击直接面向生成系统。 如果攻击者可以修改生成过程,则他们可以利用你的系统,而无需破坏个人帐户或代码。 请务必确保不要忘记保护生成系统以及个人帐户和代码。

保护生成系统

生成系统应具有以下几种安全功能:

  1. 生成步骤应清晰且可重复。

  2. 应确切地知道在生成过程中运行的内容。

  3. 每个生成都应在新的环境中启动,因此泄露的生成不会持久影响将来的生成。

GitHub Actions 可以帮助你满足这些功能。 生成说明与代码一起存储在存储库中。 选择生成在哪些环境中运行,包括 Windows、Mac、Linux 或自己托管的运行程序。 每次生成都从一个新的运行器映像开始,这使得攻击很难在生成环境中持续存在。

除了安全优势之外,GitHub Actions 还允许你手动、定期或针对存储库中的 git 事件触发生成,以实现频繁快速的生成。

GitHub Actions 是一个广泛的主题,但入门的好地方是 了解 GitHub ActionsGitHub Actions 的工作流语法 以及 触发工作流程

为生成生成项目证明

关于工件认证

项目证明包含对生成的项目的签名,以及指向源代码和生成说明的链接。 如果使用项目证明对生成进行签名,则无需管理自己的签名密钥内容。 GitHub 使用我们运营的签名机构为你处理此问题。

有关详细信息,请参阅“使用项目证明确立生成的来源”。

对生成进行签名

生成过程安全后,需要防止有人篡改生成过程的最终结果。 一种很好的方法是对生成进行签名。 公开分发软件时,这通常是使用加密公钥/私钥对完成的。 使用私钥对生成进行签名,并发布公钥,以便软件用户在使用生成之前验证其签名。 如果修改生成的字节,则不会验证签名。

具体如何签名取决于所编写的代码类型以及用户是谁。 通常很难知道如何安全地存储私钥。 此处的一个基本选项是使用 GitHub Actions 加密的机密,但需要谨慎限制谁有权访问这些 GitHub Actions 工作流。 如果私钥存储在另一个可以通过公共 Internet 访问的系统中(例如 Microsoft Azure 或 HashiCorp Vault),则更高级的选项是使用 OpenID Connect 进行身份验证,因此无需跨系统共享机密。 如果私钥只能通过专用网络访问,另一个选项是为 GitHub Actions 使用自托管运行程序。

有关详细信息,请参阅 在 GitHub Actions 中使用机密OpenID Connect自托管运行程序

使用不可变版本

如果你在生成系统中使用其他项目的发布资产,或为自己的工作创建发布版本,应通过确保这些发布版本具备不可变性以降低安全风险,这意味着发布版本在发布后无法被更改。 具备不可变性的发布版本有助于防范供应链攻击,并避免意外的中断性变更。 有关详细信息,请参阅“不可变版本”。

强化 GitHub Actions 的安全性

可以采取许多进一步的步骤来确保 GitHub Actions 的安全。 具体而言,请谨慎评估第三方工作流,并考虑使用 CODEOWNERS 限制谁可以对工作流进行更改。

有关详细信息,请参阅 安全使用参考安全使用参考

后续步骤

  •         [AUTOTITLE](/code-security/supply-chain-security/end-to-end-supply-chain/end-to-end-supply-chain-overview)
    
  •         [AUTOTITLE](/code-security/supply-chain-security/end-to-end-supply-chain/securing-accounts)
    
  •         [AUTOTITLE](/code-security/supply-chain-security/end-to-end-supply-chain/securing-code)