Gradle 与 GitHub 合作加强供应链安全
引言
Gradle 很高兴地宣布与 GitHub 建立技术合作伙伴关系,重点关注多个领域,首先是供应链安全和开发者体验。通过此次合作,我们建立了组织间的直接联系,并计划在 GitHub 和 Gradle 之间进行集成合作,以促进 Gradle 用户遵循最佳安全实践。
作为此次合作的一部分,首个发布的功能是 Gradle 的依赖项提交 GitHub Action,它可以配置为自动向 GitHub 的依赖图提交依赖项,帮助用户更好地理解其应用程序并接收 Dependabot 警报。
此次合作将改善共享 Gradle 和 GitHub 生态系统中许多用户的使用体验。GitHub 是全球领先的由 AI 驱动的开发者平台,用于构建、扩展和交付安全软件,拥有超过 2.84 亿个公共仓库。Gradle 构建工具是 Android 应用程序开发的默认构建系统,是 GitHub 上使用最多的 JVM 构建系统,也是 GitHub 平台上公共和私有仓库中使用最多的构建系统之一。
“Gradle 是 GitHub 用户中最常用的构建工具之一,我们很高兴能继续与他们合作,为 Gradle 社区改进供应链安全。这些对 Gradle 构建 Action 的更新将通过让数百万 GitHub 用户更好地了解他们的依赖项,从而帮助他们提高应用程序的安全性。”- Jon Janego,GitHub 高级产品经理
易受攻击的依赖项问题 #
易受攻击的项目依赖项是软件生态系统面临的主要风险。对于开发者来说,快速检测源自直接和间接依赖项的潜在漏洞至关重要。包括 Gradle 在内的许多现代构建系统都将帮助开发者管理其依赖项并保护供应链和最终用户作为优先事项。
Gradle 构建工具提供了高级安全功能,例如依赖项验证以及其他工具,以保护项目完整性。GitHub 提供了许多安全功能来解决这个问题,包括Dependabot 警报,它能检测仓库是否使用了已知漏洞的依赖项,并通知维护者。然而,直到最近,Dependabot 警报和 Gradle 构建工具之间一直缺乏一流的集成。
依赖项管理是一个难题。一些朴素的依赖项报告方法试图解析构建文件以确定依赖项版本;然而,这只适用于最简单的情况,因为依赖项版本可能受到许多因素的影响。例如,冲突解决可能导致使用与构建源中声明的版本不同的版本。对于 Gradle,插件和各种依赖项管理功能也可能影响依赖项版本。此外,依赖项还可以声明在不同的“桶”中以及许多子项目中。今天的公告引入了一种解决这一挑战的新方法。
宣布新的依赖项提交 Action #
Gradle 的依赖项提交 Action 现已准备好供使用 GitHub 或 GitHub Enterprise 实例的用户广泛采用。您可以在 GitHub Actions Marketplace 上找到它。
Gradle 的依赖项提交 Action 是一个官方的开源 GitHub Action,它生成 Gradle 项目中依赖项的完整且准确的信息,并将其上传到 GitHub。这些信息允许维护者在 GitHub 中查看其项目的依赖项,并在检测到易受攻击的依赖项时收到通知。
启用 Action 后,依赖项可在项目的依赖图视图中可见。
当检测到易受攻击的依赖项时,项目管理员和维护者可以通过 Dependabot 警报自动收到通知。易受攻击的依赖项也会显示在项目的 Security > Vulnerability alerts > Dependabot 视图中。
Gradle 的依赖项提交 Action 提供了一种可靠的方式来检查 Gradle 项目中的依赖项,并获取有关发现漏洞的警报。我们强烈建议您在项目中启用它。由于这只需要一个简单的 GitHub Actions 配置,让我们看看如何操作……
如何使用依赖项提交 Action #
依赖项提交 Action 已准备好广泛采用,我们建议 GitHub 上的所有 Gradle 项目都使用它。要使用依赖项提交 Action,请按照 readme 中的步骤操作。
对于基本用法,您需要在仓库的 .github/workflows/ 目录中有一个简单的 YAML 文件,例如 .github/workflows/dependency-submission.yml。
name: Dependency Submission
on:
push:
branches: [ "main" ]
permissions:
contents: write
jobs:
dependency-submission:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
# change if your project requires a different Java version
java-version: '17'
- name: Generate and submit dependency graph
uses: gradle/actions/dependency-submission@v3
您可以在此处查看此 GitHub 工作流的实时示例。GitHub 定义的源文件可以在.github/workflows/dependency-submission.yml中找到。一旦第一次推送执行或您手动触发依赖提交,您将能够看到以下构建输出:
您可以在依赖项提交 Action 文档中找到更高级的配置和设置。
依赖项提交 Action 的工作原理 #
将 Gradle 构建工具、GitHub 依赖图和 Dependabot 警报集成起来的关键挑战在于,要提供项目中使用的所有依赖项及其正确的版本,同时考虑底层依赖项管理引擎的所有复杂性。
为了提供完整准确的依赖项版本,Gradle 的依赖项提交 Action 应用了一个专门的插件并运行了一个小型 Gradle 构建,该构建解决了所有项目依赖项。这意味着提交的依赖项版本与项目实际使用的版本完全相同。该 Action 在单独的工作流步骤中调用,但仍将受益于Setup Gradle Action提供的优化,并且还可以使用构建缓存。
无论何时运行 dependency-submission 工作流,GitHub 依赖图都会更新项目的最新依赖项版本。这使得依赖项数据在仓库的“洞察”>“依赖图”选项卡中可见,并使 Dependabot 安全警报可见,同时为任何新漏洞发送相关通知。
获取帮助并分享反馈 #
我们为问答和讨论创建了一个专用频道。加入我们的 Gradle 社区 Slack,在 #github-integrations
频道获取启用依赖项提交 Action 和修复项目中漏洞的帮助。我们也欢迎在此频道提出任何反馈!
如果您想报告缺陷,请使用 Gradle actions 仓库上的 GitHub Issues。在那里,您还可以订阅新版本发布通知。
下一步是什么 #
通过此次 GitHub 集成,Gradle 将帮助开发者处理易受攻击的依赖项,但我们的目标不止于此。我们计划继续扩展功能,并增加更多功能和用户体验改进。
为加速采用,Gradle 构建工具工程团队将向选定的开源项目提交拉取请求,以启用该 Action,首先是 Gradle 社区插件。
我们还希望帮助维护者更快地集成依赖项修复——包括对传递依赖项的修复——我们正在为通过 Dependabot 安全更新 使其更容易做出贡献。
了解更多 #
- gradle/actions - Gradle 的官方 GitHub Actions,包括依赖项提交 action。
- gradle/github-dependency-submission-demo - 处理易受攻击依赖项的工作示例和教程。
- 关于供应链安全 - 了解更多关于 GitHub 依赖图、Dependabot 警报和依赖项审查的信息。