关于 GitHub 上的供应链安全性
在开发软件项目时,你可能会使用其他软件来构建和运行应用程序,例如开源库、框架或其他工具。 这些资源统称为你的“依赖项”,因为你的项目依赖它们正常运行。 你的项目可能依赖数百个此类依赖项,形成所谓的“供应链”。
你的供应链可能带来安全问题。 如果某个依赖项存在已知安全漏洞或缺陷,攻击者可能利用这些漏洞,例如插入恶意代码(“恶意软件”)、窃取敏感数据,或对项目造成其他类型的破坏。 这种威胁类型称为“供应链攻击”。 供应链中存在易受攻击的依赖项会削弱你自己项目的安全性,同时也会让用户面临风险。
保护供应链最重要的措施之一是修补易受攻击的依赖项并替换任何恶意软件。
当你在清单文件或锁定文件中指定依赖项时,可以直接将它们添加到供应链。 依赖项也可以通过可传递方式包含在内,也就是说,即使你没有指定某个特定的依赖项,但你的某个依赖项使用了它,那么你也会依赖于该依赖项。
GitHub 提供一系列功能,帮助你了解环境中的依赖项、掌握依赖项中的漏洞并进行修补。
GitHub 的供应链功能包括: * 依赖项关系图 * 依赖项检查 * Dependabot alerts
-
**Dependabot updates**-
**Dependabot security updates** -
**Dependabot version updates**
-
-
**不可变版本** -
**工件证明**
依赖项关系图是供应链安全性的核心。 依赖项关系图标识了存储库或包的所有上游依赖项和公共下游依赖项。 存储库的依赖项关系图会跟踪并显示它的依赖项及其部分属性,例如漏洞信息。
GitHub 上的以下软件供应链功能依赖于依赖关系图提供的信息。
- 依赖项审查使用依赖项关系图来标识依赖项更改,在你审查拉取请求时,可帮助你了解这些更改的安全影响。
- Dependabot 会将依赖图提供的依赖数据与 GitHub Advisory Database 中发布的公告列表交叉比对,扫描你的依赖项,并在检测到潜在漏洞时生成 Dependabot alerts。
- Dependabot security updates 利用依赖图和 Dependabot alerts,帮助你更新仓库中已知漏洞的依赖项。
Dependabot version updates不使用依赖项关系图,而是依赖于依赖项的语义版本控制。 Dependabot version updates可帮助你使依赖项保持最新,即使它们没有任何漏洞。
有关端到端供应链安全最佳实践指南,包括保护个人账户、代码和构建流程,请参阅 保护端到端供应链。
功能概述
什么是依赖项关系图?
为了生成依赖项关系图,GitHub 会查看清单和锁定文件中声明的存储库显式依赖项。 启用后,依赖项关系图会自动分析存储库中的所有已知包清单文件,并以此来构造一个包含已知依赖项名称和版本的关系图。
- 依赖图包含有关你的_直接_依赖项和_传递_依赖项的信息。
- 当你将提交推送到 GitHub 以更改受支持的清单或锁定文件或者将其添加到默认分支时,以及当任何人将更改推送到某个依赖项的存储库时,依赖项关系图会自动更新。
- 依赖项关系图还可以包含你在项目使用 GitHub Actions 生成时提供的信息。 某些包生态系统会在生成时提取其大部分可传递依赖项,因此如果在生成时提交依赖项信息,则可获得更完整的供应链视图。
- 可以通过打开 GitHub 上的仓库主页,并导航到“见解”选项卡来查看依赖项关系图。****
- 如果至少具有对存储库的读取访问权限,则可以通过 GitHub UI 或 GitHub REST API,将存储库的依赖项关系图导出为与 SPDX 兼容的软件物料清单 (SBOM)。 有关详细信息,请参阅“导出存储库的软件物料清单”。
你可以使用 依赖项提交 API 从所选的包管理器或生态系统提交依赖项,即使该生态系统不支持依赖项关系图的清单或锁定文件分析。 使用 依赖项提交 API 提交到项目的依赖项将显示用于提交的检测器以及提交时间。 有关 依赖项提交 API 的详细信息,请参阅 使用依赖项提交 API。
有关依赖项关系图的详细信息,请参阅 关于依赖关系图。
什么是依赖项审查?
依赖项审查可帮助审阅者和参与者了解每个拉取请求中的依赖项更改及其安全性影响。
- 依赖项审查会在拉取请求中告知你已经添加、移除或更新了哪些依赖项。 你可以使用发布日期、依赖项的受欢迎程度和漏洞信息来帮助决定是否接受更改。
- 你可以通过在“已更改文件”选项卡上显示丰富差异来查看拉取请求的依赖审查。
有关依赖项评审的详细信息,请参阅 关于依赖项评审。
什么是 Dependabot?
Dependabot 通过通知依赖项中的任何安全漏洞并自动打开拉取请求来升级依赖项,使依赖项保持最新。 触发 Dependabot 警报时,Dependabot 拉取请求会触发下一个可用的安全版本;发布版本时,这些请求会面向最新版本。
术语“Dependabot”包含了以下功能:
- Dependabot alerts:在仓库的“安全”选项卡以及仓库的依赖图中显示通知。 该警报包括指向项目中受影响的文件的链接,以及有关修复的版本的信息。
- Dependabot updates:
- Dependabot security updates:当触发警报时,会触发更新,将依赖项升级到安全版本。
- Dependabot version updates:计划性更新,以保持依赖项与最新版本同步。
由 Dependabot 打开的拉取请求可能会触发运行操作的工作流。 有关详细信息,请参阅“通过 GitHub Actions 自动化 Dependabot”。
默认情况下:
-
如果仓库启用了 GitHub Actions,GitHub 会在 GitHub Actions 上运行 Dependabot updates。
-
如果仓库未启用 GitHub Actions,GitHub 会使用其内置的 Dependabot 应用生成 Dependabot alerts。
有关详细信息,请参阅“关于 GitHub Actions 运行程序上的 Dependabot”。
Dependabot security updates 可以修复 GitHub Actions 中有漏洞的依赖项。 启用安全更新后,Dependabot 将自动提出拉取请求,以将工作流中使用的存在漏洞的 GitHub Actions 更新到最低的已修补版本。 有关详细信息,请参阅 关于 Dependabot 安全更新。
什么是 Dependabot 警报?
Dependabot alerts 基于依赖项关系图和 GitHub Advisory Database 突出显示了受新发现的漏洞影响的存储库,其中包含已知漏洞的公告。
- Dependabot 执行扫描以检测不安全的依赖项,并在以下情况下发送 Dependabot alerts:
- 新公告添加到 GitHub Advisory Database。
- 存储库的依赖关系图发生更改。
- Dependabot alerts 在存储库的“安全性”**** 选项卡上以及存储库的依赖项关系图中显示。 该警报包括指向项目中受影响的文件的链接,以及有关修复的版本的信息。
有关详细信息,请参阅“关于 Dependabot 警报”。
什么是 Dependabot 更新?
Dependabot updates 有两种类型:Dependabot _安全_更新和_版本_更新。 Dependabot 会生成自动拉取请求以在这两种情况下更新依赖项,但存在一些差异。
Dependabot security updates:
- 由 Dependabot 警报触发
- 将依赖项更新到可修复已知漏洞的最低版本
- 支持用于依赖项关系图支持的生态系统
- 不需要配置文件,但可使用配置文件来替代默认行为
Dependabot version updates:
- 需要配置文件
- 按配置的计划运行
- 将依赖项更新到与配置匹配的最新版本
- 支持用于不同类别的生态系统
有关 Dependabot updates 的更多信息,请参阅 关于 Dependabot 安全更新 和 关于 Dependabot 版本更新。
什么是不可变发行版?
存储库可以启用不可变版本,以防止发布后更改发布的资产和关联的 Git 标记。 这可以通过阻止攻击者将漏洞注入到你使用的版本中来降低供应链攻击的风险。 这也意味着依赖特定版本的项目不太可能中断。
创建不可变版本会自动为发布生成证明。 可以使用此认证来确保发布及其制品与已发布的信息匹配。
什么是工件声明?
软件提供商可以为使用 GitHub Actions 构建的软件生成证明。 证明是经过加密签名的声明,用于确立构建的来源(用于构建的软件源代码和工作流运行)或相关的软件物料清单 (SBOM)。
可以通过验证依赖项的证明来提高供应链安全性。 尽管证明不能保证安全性,但它们提供了有关软件生成位置和方式的信息,因此可以更确信依赖项未被篡改。 可以使用 Kubernetes 准入控制器之类的工具来限制部署,以防止部署未经验证的构建。
当你使用 GitHub Actions 为组织自身的构建生成证明时,构建生成的工件会自动上传到 linked artifacts page。 此平台允许查看所有链接项目的存储和部署记录,以便找到用于基于部署上下文生成项目或筛选安全警报的源代码和工作流运行。
功能可用性
公共存储库: * 依赖关系图: 默认启用,且无法禁用。 * 依赖关系审查: 默认启用,且无法禁用。 * Dependabot alerts: 默认未启用。 GitHub 检测不安全的依赖项,并在依赖项关系图中显示信息,但默认情况下不会生成 Dependabot alerts。 存储库所有者或具有管理员访问权限的人员可以启用 Dependabot alerts。 你也可以为用户帐户或组织拥有的所有存储库启用或禁用 Dependabot 警报。 有关详细信息,请参阅“管理安全和分析功能”或“管理组织的安全和分析设置”。 * 制品验证: 在所有公共仓库中可用,但必须在构建工作流中显式生成验证。 请参阅“使用项目证明确立生成的来源”。
专用存储库: * 依赖关系图: 默认未启用。 存储库管理员可以启用该功能。 有关详细信息,请参阅“探索仓库的依赖项”。 * 依赖关系审查: 适用于使用 GitHub Team 或 GitHub Enterprise Cloud 且拥有 GitHub Code Security or GitHub Advanced Security 许可证的组织所拥有的私有存储库。 有关详细信息,请参阅 关于 GitHub 高级安全性 和 探索仓库的依赖项。 * Dependabot alerts: 默认未启用。 私有仓库的所有者或具有管理员权限的人员可以通过为其仓库启用依赖关系图和 Dependabot alerts 来启用 Dependabot alerts。 你也可以为用户帐户或组织拥有的所有存储库启用或禁用 Dependabot 警报。 有关详细信息,请参阅“管理安全和分析功能”或“管理组织的安全和分析设置”。
-
**工件证明:** 仅在 GitHub Enterprise Cloud 上的私有存储库中可用。
任意存储库类型: * Dependabot security updates: 默认未启用。 您可以为任何使用 Dependabot alerts 和依赖关系图的仓库启用 Dependabot security updates。 有关启用安全更新的信息,请参阅 配置 Dependabot 安全更新。 * Dependabot version updates: 默认未启用。 拥有存储库写入权限的用户可以启用 Dependabot version updates。 有关启用版本更新的信息,请参阅 配置 Dependabot 版本更新。 * 不可变版本:* 默认情况下未启用。 可以为存储库或组织启用版本不可变性。 请参阅“阻止对版本进行更改”。