Gradle 与 GitHub 合作,提升供应链安全性

Gradle 公司已与 GitHub 合作,通过增加对从 Gradle 构建工具提交依赖关系图数据的支持,来提高供应链安全性

目录

简介

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 市场上找到它。

Gradle 的依赖项提交 Action 是一个官方且开源的 GitHub action,它可以生成关于 Gradle 项目中依赖项的完整且准确的信息,并将其上传到 GitHub。这些信息允许维护者在 GitHub 中查看他们项目的依赖项,并在检测到脆弱依赖项时收到通知。

一旦启用该 Action,依赖项将显示在项目的依赖关系图视图中。

Dependency Tree Graph in the GitHub Repository Insights

当检测到脆弱依赖项时,项目管理员和维护者可以自动通过 Dependabot 警报收到通知。脆弱依赖项也会显示在项目的安全 > 漏洞警报 > Dependabot 视图中

Dependabot vulnerability alerts

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中找到。一旦执行第一次推送或手动触发依赖项提交,您将能够看到以下构建输出

Dependency Submission Action - Execution Log

您可以在依赖项提交 Action 文档中找到更多高级配置和设置。

依赖项提交 Action 的工作原理 #

集成 Gradle 构建工具、GitHub 依赖关系图和 Dependabot 警报的关键挑战是提供项目中使用的所有依赖项的正确版本,同时考虑到底层依赖项管理引擎的所有复杂性。

为了提供完整且准确的依赖项版本,Gradle 的依赖项提交 Action 应用了一个专门的插件并运行一个小的 Gradle 构建,以解析所有项目依赖项。这意味着提交的依赖项版本与项目实际使用的版本完全相同。该 Action 在一个单独的工作流程步骤中调用,但仍将受益于Setup Gradle Action提供的优化,并且还可以使用构建缓存

每当 dependency-submission 工作流程运行时,GitHub 依赖关系图都会更新为项目的最新依赖项版本。这使得依赖项数据在仓库的Insights > 依赖关系图选项卡中可见,并使 Dependabot 安全警报可见,并为任何新漏洞发送相关通知。

获取帮助并分享反馈 #

我们创建了一个专门的频道用于问答和讨论。加入我们的 Gradle 社区 Slack 中的 #github-integrations 频道,以获得启用依赖项提交 Action 和修复项目中漏洞的帮助。我们也欢迎在该频道上提供任何反馈!

如果您想报告缺陷,请使用 Gradle actions 仓库上的 GitHub Issues。在那里,您还可以订阅新的版本发布公告。

下一步是什么 #

通过此 GitHub 集成,Gradle 将帮助开发者处理脆弱的依赖项,但我们的目标不止于此。我们计划继续扩展功能并添加更多功能和用户体验改进。

为了加速采用,Gradle 构建工具工程团队将向选定的开源项目提交启用该 Action 的拉取请求,首先从 Gradle 社区插件开始。

我们还希望帮助维护者更快地集成依赖项修复程序(包括传递依赖项的修复程序),并且我们正在为此做出贡献,以使 Dependabot 安全更新更容易实现。

了解更多 #

讨论