RubyGems 导航菜单

博客

返回博客文章

RubyGems.org 上宣布可信发布功能

大家好!

我迫切想与各位分享一项新功能,它不仅可以增强 RubyGems.org 的安全性,还能够让宝石发布自动化变得更加容易。我们受到 Python 包索引的启发,将该功能称作 可信发布

背景故事

在过去几年中,我们为拥有热门宝石的帐户 提高了多重身份验证 (MFA) 的最低要求。我们强烈建议要求对 RubyGems.org 上的所有交互(包括通过 API)均进行 MFA 身份验证。这是我们增强 Ruby 供应链安全性的策略的一部分,具体而言,我们希望借此对抗帐户劫持问题——该问题是第二常见的软件供应链攻击手段。

另一方面,我们希望鼓励宝石作者根据公共存储库的状态从可信环境中推送他们的宝石。对许多人来说,这意味着对存储库托管在 GitHub.com 上的宝石使用 GitHub Actions(作为 CI/CD 平台)。

到目前为止,MFA 与自动宝石推送不兼容。你需要一个已禁用 MFA 的 API 密钥,由 GitHub 作为长期机密存储并提供给每个 CI 作业。更糟糕的是,鉴于这是一个笨重的多步骤流程,许多宝石作者干脆从他们的笔记本电脑推送宝石,而不是按照要求完成这些步骤。

可信发布

这就是今天公告主题的由来:可信发布。在深入了解详情前,我想要感谢我们在 PyPI 的朋友们,感谢他们开创了这条道路,提供了有益的指导,并编写了一些非常棒的 文档

可信发布是指利用 OpenID Connect (OIDC) 在可信第三方服务和 RubyGems.org 之间交换短期身份令牌。这样就可以在自动化环境(比如 CI)中获取短期 API 令牌,而无需存储长期 API 令牌或者用户名/密码凭据。

为你的宝石填写四个表单字段(存储库所有者、存储库名称、GitHub Actions 工作流文件名以及可选的 GitHub 环境)之后,你就可以 利用一个简短、简单、可复制/粘贴的工作流通过 GitHub Actions 自动化发布

jobs:
  push:
    runs-on: ubuntu-latest

    permissions:
      contents: write
      id-token: write

    steps:
      # Set up
      - uses: actions/checkout@v4
      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
          ruby-version: ruby

      # Release
      - uses: rubygems/release-gem@v1

好处

与传统验证机制相比,这种机制具有显著的安全性与实用性优势

  • 实用性:受信颁发不需要要求手动创建与存储来自 RubyGems.org 的 API 令牌。唯一的手动步骤是一次性表单以告知 RubyGems.org 可信赖的发布者。
  • 安全性:受信颁发令牌的存留时间很短,意味着在短时间内只能使用一次。与 RubyGems.org 的长期 API 令牌相比,这是一个很大改动,如果 RubyGems.org 的长期 API 令牌被窃取,攻击者可以保留并重复使用它。
  • 信任:推送是通过受信任环境完成的,对宝石用户而言透明,导致对发布内容与代码库中内容相匹配的信心更高。

接下来

  • 支持其他受信任发布平台
  • 全面 GitHub Actions 工作流,可处理构建宝石、生成溯源、使用 sigstore 对其签名并推送宝石。

敬请期待更多!

这项工作由Ruby Central组织,并通过 Ruby Central 成员、Sovereign Tech FundAWS Security Residency 的资金支持得以实现。

Samuel Giddins