跳至主要内容

保护供应链中代码的最佳实践

有关如何保护供应链中心(您编写的代码和您依赖的代码)的指南。

关于本指南

本指南介绍了您可以为提高代码安全性而做出的影响最大的更改。每个部分都概述了您可以对流程进行的更改以提高安全性。影响最大的更改将首先列出。

风险是什么?

开发过程中的主要风险包括

  • 使用具有安全漏洞的依赖项,攻击者可能会利用这些漏洞。
  • 泄露身份验证凭据或令牌,攻击者可能会使用这些凭据或令牌访问您的资源。
  • 将漏洞引入您自己的代码,攻击者可能会利用这些漏洞。

这些风险使您的资源和项目容易受到攻击,并且这些风险会直接传递给使用您创建的软件包的任何人。以下部分说明了如何保护您自己和您的用户免受这些风险的影响。

为依赖项创建漏洞管理程序

您可以通过为依赖项创建漏洞管理程序来保护您依赖的代码。从高层次来看,这应该包括确保您执行以下流程:

  1. 创建依赖项清单。

  2. 了解何时依赖项中存在安全漏洞。

  3. 在您的拉取请求中强制执行依赖项审查。

  4. 评估该漏洞对您的代码的影响,并决定采取何种措施。

自动清单生成

第一步,您需要创建依赖项的完整清单。存储库的依赖关系图显示了受支持生态系统的依赖关系。如果您签入依赖项或使用其他生态系统,则需要使用来自第三方工具的数据或手动列出依赖项来补充此数据。如果您至少具有对存储库的读取访问权限,则可以通过 GitHub UI 或 GitHub REST API 将存储库的依赖关系图导出为与 SPDX 兼容的软件物料清单 (SBOM)。有关更多信息,请参阅“为您的存储库导出软件物料清单”。

自动检测依赖项中的漏洞

Dependabot 可以通过监视您的依赖项并在其中包含已知漏洞时通知您来帮助您。您甚至可以启用 Dependabot 自动发出拉取请求,以将依赖项更新到安全版本。有关更多信息,请参阅“关于 Dependabot 警报”和“关于 Dependabot 安全更新”。

自动检测拉取请求中的漏洞

依赖项审查操作会在您的拉取请求中强制执行依赖项审查,使您可以轻松查看拉取请求是否会将依赖项的易受攻击版本引入您的存储库。当检测到漏洞时,依赖项审查操作可以阻止拉取请求合并。有关更多信息,请参阅“关于依赖项审查”。

评估易受攻击的依赖项带来的风险敞口

当您发现正在使用易受攻击的依赖项(例如库或框架)时,必须评估项目的风险敞口级别并确定要采取的措施。漏洞通常会报告严重性分数以显示其影响的严重程度。严重性分数是一个有用的指南,但无法告诉您漏洞对您的代码的全部影响。

要评估漏洞对代码的影响,您还需要考虑如何使用库并确定这实际上对系统构成了多大的风险。也许漏洞是您不使用的功能的一部分,您可以更新受影响的库并继续正常的发布周期。或者,您的代码可能严重暴露于风险之中,您需要更新受影响的库并立即发布更新的构建。此决定取决于您在系统中如何使用库,并且只有您才能做出此决定。

保护您的通信令牌

代码经常需要通过网络与其他系统通信,并且需要使用密钥(例如密码或 API 密钥)进行身份验证。您的系统需要访问这些密钥才能运行,但最佳实践是不将它们包含在源代码中。这对于可能有很多用户可以访问的代码库尤其重要,对于公共代码库更是至关重要。

自动检测提交到代码库的密钥

注意

密钥扫描适用于以下代码库

  • 公共代码库(免费)

  • 使用启用了 GitHub 高级安全功能 的 GitHub Enterprise Cloud 中的私有和内部代码库

GitHub 与许多提供商合作,自动检测何时将密钥提交到或存储在您的公共代码库和您依赖的公共 npm 包中,并将通知提供商,以便他们可以采取适当的措施来确保您的帐户安全。有关更多信息,请参阅“关于密钥扫描警报”。

如果您拥有以下内容,则可以启用和配置其他扫描,这些扫描将在您意外泄露 GitHub 上的密钥时向您发出警报

  • GitHub 上的公共代码库。
  • 使用具有 GitHub 高级安全功能许可证的 GitHub Enterprise Cloud 的组织。密钥扫描还将分析您的私有代码库。

安全存储您在 GitHub 中使用的密钥

除了您的代码之外,您可能还需要在其他地方使用密钥。例如,允许 GitHub Actions 工作流、Dependabot 或您的 GitHub Codespaces 开发环境与其他系统通信。有关如何安全存储和使用密钥的更多信息,请参阅“在 GitHub Actions 中使用密钥”、“为 Dependabot 配置对私有注册表的访问权限”和“管理您针对 GitHub Codespaces 的帐户特定密钥”。

避免在您的代码库中使用存在漏洞的编码模式

注意

代码扫描适用于以下代码库类型

  • GitHub.com 上的公共代码库

  • 启用了 GitHub 高级安全功能 的 GitHub Enterprise Cloud 上的组织拥有的代码库

创建拉取请求审查流程

您可以通过确保所有拉取请求在合并之前都经过审查和测试来提高代码的质量和安全性。GitHub 具有许多可用于控制审查和合并流程的功能。要开始使用,请参阅“关于受保护分支”。

扫描您的代码以查找存在漏洞的模式

不安全的代码模式通常难以供审查人员单独发现。除了扫描代码中的密钥之外,您还可以检查与安全漏洞相关的模式。例如,不是内存安全的函数,或者未能转义可能导致注入漏洞的用户输入。GitHub 提供了几种不同的方法来处理如何以及何时扫描代码。要开始使用,请参阅“关于代码扫描”。

后续步骤