# 保护生成系统的最佳做法

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

## 关于本指南

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

## 风险是什么？

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

## 保护生成系统

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

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

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

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

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

除了安全优势之外，GitHub Actions 还可以手动、定期或基于存储库中的 git 事件触发构建，以实现频繁和快速的构建。

```
          GitHub Actions 是一个大话题，但一个很好的开始位置是 [AUTOTITLE](/actions/learn-github-actions/understanding-github-actions)，以及 [AUTOTITLE](/actions/using-workflows/workflow-syntax-for-github-actions#choosing-github-hosted-runners) 和 [AUTOTITLE](/actions/using-workflows/triggering-a-workflow)。
```

## 为生成生成项目证明

项目证明使你能够为自己构建的软件创建不可伪造的来源和完整性保证。 反过来，使用软件的人员可以验证软件是在哪里以及如何构建的。

使用软件生成项目证明时，将创建加密签名的声明用于确立生成的来源，并包含以下信息：

* 指向与项目关联的工作流的链接
* 项目的仓库、组织、环境、提交 SHA 以及触发事件
* OIDC 令牌中用于确立来源的其他信息。 有关详细信息，请参阅“[OpenID Connect](/zh/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)”。

还可以生成包含关联的软件物料清单 (SBOM) 的项目证明。 将你的版本与它们中使用的开放源代码依赖项列表相关联可提供透明度，并使使用者能够遵守数据保护标准。

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

有关详细信息，请参阅“[使用项目证明确立生成的来源](/zh/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds)”。

## 对生成进行签名

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

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

有关详细信息，请参阅 [在 GitHub Actions 中使用机密](/zh/actions/security-guides/encrypted-secrets)、[OpenID Connect](/zh/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect) 和 [](/zh/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners)。

## 使用不可变版本

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

## 强化安全性 GitHub Actions

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

有关详细信息，请参阅 [安全使用指南](/zh/actions/security-guides/security-hardening-for-github-actions) 和 [安全使用指南](/zh/actions/security-guides/using-githubs-security-features-to-secure-your-use-of-github-actions)。

## 后续步骤

* [保护端到端供应链](/zh/code-security/supply-chain-security/end-to-end-supply-chain/end-to-end-supply-chain-overview)

* [确保帐户安全的最佳做法](/zh/code-security/supply-chain-security/end-to-end-supply-chain/securing-accounts)

* [保护供应链中的代码的最佳做法](/zh/code-security/supply-chain-security/end-to-end-supply-chain/securing-code)