可信发布:软件包安全的新标杆——基于OpenID Connect的无密钥认证机制

本文深入解析PyPI引入的可信发布机制,该技术通过OpenID Connect实现无长期API密钥的自动化发布流程,有效防范供应链攻击和凭证泄露风险,同时提升CI/CD工作流的安全性。

可信发布:软件包安全的新标杆

作者:William Woodruff
日期:2023年5月23日

技术背景

过去一年,我们与Python包索引(PyPI)合作开发了名为"可信发布"的新型认证机制。该技术通过消除长期API令牌和密码的使用,在降低供应链攻击和凭证泄露风险的同时,简化了发布工作流。目前PyPI上关键软件包已采用该技术强化发布安全。

OpenID Connect与"环境凭证"

可信发布的核心是建立在OpenID Connect(OIDC)标准之上的认证方案。OIDC身份提供者(IdP)能生成可验证的JWT凭证,其中包含如GitHub仓库、工作流名称等声明信息。与传统的API令牌不同,这些凭证具有以下特性:

  1. 动态生成:由CI平台(如GitHub Actions)在运行时自动提供
  2. 细粒度控制:可精确绑定到特定代码库、工作流文件甚至CI环境
  3. 密码学验证:通过IdP的公钥进行签名验证

典型的工作流凭证声明示例如下:

1
2
3
4
5
{
  "repository": "hamilcar/cartago",
  "workflow": "release.yml",
  "environment": "production"
}

零密钥发布流程

完整的可信发布流程包含七个关键步骤:

  1. 开发者触发GitHub Actions发布工作流
  2. 执行常规构建过程(python -m build等)
  3. 工作流从GitHub OIDC IdP获取身份凭证
  4. 将OIDC令牌提交至PyPI
  5. PyPI验证后颁发短期API令牌
  6. 返回令牌至工作流
  7. 使用twine等工具完成发布

实际配置仅需在PyPI项目设置中建立信任关系:

1
2
3
4
trusted_publishers:
  - identity_provider: "github"
    repository: "hamilcar/cartago"
    workflow: "release.yml"

安全优势分析

与传统API令牌相比,可信发布在三个维度实现突破:

  1. 使用便捷性

    • 无需手动管理令牌
    • 支持未创建项目的预配置
    • 消除凭证传递风险
  2. 事前防护

    • 攻击者需同时控制CI环境和发布流程
    • 细粒度的环境隔离(通过GitHub Environments)
  3. 事后恢复

    • 凭证有效期仅数分钟
    • 自动失效无需人工干预
    • 防止持久化威胁

新型威胁应对

技术设计时特别考虑了两种新型攻击场景:

  1. 账户复活攻击

    • 通过绑定GitHub用户唯一ID而非用户名
    • 防止攻击者接管废弃用户名
  2. 恶意提交者风险

    • 可选环境限制实现"提交≠发布"的权限分离
    • 示例:仅main分支的production环境可发布

跨生态应用前景

该技术框架具有语言无关性,可应用于:

  • Rust的Crates.io
  • Ruby的RubyGems
  • JavaScript的NPM

我们预见这类技术将如同2019年的双因素认证,成为开源软件供应链的基础安全组件。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计