可信发布:软件包安全的新标杆
作者:William Woodruff
日期:2023年5月23日
技术背景
过去一年,我们与Python包索引(PyPI)合作开发了名为"可信发布"的新型认证机制。该技术通过消除长期API令牌和密码的使用,在降低供应链攻击和凭证泄露风险的同时,简化了发布工作流。目前PyPI上关键软件包已采用该技术强化发布安全。
OpenID Connect与"环境凭证"
可信发布的核心是建立在OpenID Connect(OIDC)标准之上的认证方案。OIDC身份提供者(IdP)能生成可验证的JWT凭证,其中包含如GitHub仓库、工作流名称等声明信息。与传统的API令牌不同,这些凭证具有以下特性:
- 动态生成:由CI平台(如GitHub Actions)在运行时自动提供
- 细粒度控制:可精确绑定到特定代码库、工作流文件甚至CI环境
- 密码学验证:通过IdP的公钥进行签名验证
典型的工作流凭证声明示例如下:
|
|
零密钥发布流程
完整的可信发布流程包含七个关键步骤:
- 开发者触发GitHub Actions发布工作流
- 执行常规构建过程(python -m build等)
- 工作流从GitHub OIDC IdP获取身份凭证
- 将OIDC令牌提交至PyPI
- PyPI验证后颁发短期API令牌
- 返回令牌至工作流
- 使用twine等工具完成发布
实际配置仅需在PyPI项目设置中建立信任关系:
|
|
安全优势分析
与传统API令牌相比,可信发布在三个维度实现突破:
-
使用便捷性:
- 无需手动管理令牌
- 支持未创建项目的预配置
- 消除凭证传递风险
-
事前防护:
- 攻击者需同时控制CI环境和发布流程
- 细粒度的环境隔离(通过GitHub Environments)
-
事后恢复:
- 凭证有效期仅数分钟
- 自动失效无需人工干预
- 防止持久化威胁
新型威胁应对
技术设计时特别考虑了两种新型攻击场景:
-
账户复活攻击:
- 通过绑定GitHub用户唯一ID而非用户名
- 防止攻击者接管废弃用户名
-
恶意提交者风险:
- 可选环境限制实现"提交≠发布"的权限分离
- 示例:仅main分支的production环境可发布
跨生态应用前景
该技术框架具有语言无关性,可应用于:
- Rust的Crates.io
- Ruby的RubyGems
- JavaScript的NPM
我们预见这类技术将如同2019年的双因素认证,成为开源软件供应链的基础安全组件。