安全模型及注意事项
由于证明是用于断言有关某个软件包的某些事实的框架,因此证明的安全模型取决于断言的事实类型。
最基本的证明类型(默认启用的类型
pypa/gh-action-pypi-publish)断言该项目是由授权发布者(例如特定的 CI 提供商)在特定的代码存储库中发布的。
这种类型的证明有两个主要目的:
- 它可以防止项目构建完成后被修改,例如在项目存储在软件包索引或镜像中时。
- 它允许验证方观察项目受信任发布者的变更。例如,验证方可能会发现项目的新版本来自不同的受信任发布者,这表明项目的控制权可能已被恶意转移。
更高级的证明类型可以断言软件包的更多信息,例如在构建之前是否被篡改过,但这些证明需要专门的构建流程,因此比较少见。请参阅SLSA 常见问题解答中的“可复现构建怎么办? ”。
一般性考虑
PyPI 对认证的支持建立在可信发布和Sigstore 的“无密钥签名”功能之上。下文将分别介绍各自的安全注意事项。
可信度
笔记
TL;DR:证明会告诉你PyPI 包的来源,但不会告诉你是否应该信任它。
与所有签名方案一样,人们很容易将证明文件的存在视为包裹可信度的证明。
然而,这并非证明(或任何类型的签名)所传达的含义。本质上,软件包上身份的有效签名表明在软件包构建过程中,该身份拥有访问权限。
换句话说:有效的签名并不能告诉验证方(例如,从 PyPI 安装软件包的用户)是否应该信任持有密钥的身份,或者是否应该信任恶意/易受攻击的代码是在构建之前或构建期间添加的。
举个具体的例子:PyPI 提供由GitHub 上的pypa/sampleproject 项目认证的sampleproject-4.0.0.tar.gz源代码
。这是一个
未经修改的来自该身份的证明,但它并
不能告诉用户是否应该信任pypa/sampleproject。要确定是否信任,用户必须自行决定是否信任
pypa/sampleproject。sampleproject-4.0.0.tar.gz
这种信任决策可能具有时间维度:用户可能
因为pypa/sampleproject是
sampleprojectPyPI 上该名称的第一个标识而决定信任它。然后,如果新版本sampleproject由新的标识(“”)认证pypa/evil-sampleproject,或者根本没有认证,用户可以自动观察到差异并开始进行修复。
可信出版
由于证明与受信任的发布者身份相关联,因此受信任的发布者 - 安全模型和注意事项中的所有注意事项 也适用于证明。
总的来说:虽然可信发布和证明比密码或长期有效的 API 令牌更安全、更不易被滥用,但它们并不能替代必要的安全措施,例如限制谁可以触发您的发布工作流。
使用 Sigstore 进行“无钥匙”签名
提示
Fulcio 的《证书颁发概述》更详细地记录了“无密钥”签名的颁发方面。
PyPI 对认证的支持是围绕“无密钥”(也称为“基于身份的”)签名构建的。
PyPI 项目不使用长期有效的签名密钥,而是通过与其受信任发布者之一匹配的身份进行签名。该身份通过类似于受信任发布所使用的 OpenID Connect (OIDC) 操作,以加密方式绑定到一个短期有效的签名密钥,但绑定对象是Sigstore:
-
受信任的发布/证明参与者(例如 GitHub Actions 工作流)由其身份提供商颁发 OIDC 令牌。
-
该 OIDC 令牌将与临时密钥对的公钥部分一起发送到 Sigstore 的公共证书颁发机构 (CA) Fulcio 。
如果 OIDC 令牌有效(即未过期且由其声称的身份提供商颁发),Fulcio 将以 X.509 签名证书进行响应,该证书将 OIDC 令牌的声明与公钥绑定。
-
认证方现在可以用其临时密钥对的私钥部分进行签名。签名完成后,临时私钥即可丢弃,因为 X.509 签名证书会将公钥部分永久绑定到验证过程中使用的身份上。
这种“无密钥”方法体现了可用性和信任之间的权衡:与传统的长期签名密钥不同,它需要一个可信第三方 (Sigstore 的 Fulcio CA)来充当签名密钥与其关联身份之间的桥梁。作为对这个可信第三方的回报,Sigstore 提供与可验证身份绑定的、防滥用的短期签名密钥。
这与HTTPS中的权衡类似,其中 CA 作为可信第三方,将网站的身份(其域名)与其公钥绑定在一起。
与 HTTPS 生态系统类似,Sigstore 也采取措施减少对 Fulcio CA 的不必要信任:
-
Sigstore 运行着一个证书透明度(CT) 日志,可以对其进行监控和审计,以确认 Fulcio 不会为给定的身份颁发证书,除非获得该身份的真实凭证。
-
Sigstore 还运营着Rekor,作为“证书透明度”日志,有效地记录了使用 Fulcio 颁发的证书进行的每一次签名事件。与 CT 日志类似,Rekor 可以被监控和审计,以确认 Fulcio 颁发的证书没有被使用。
综合来看,这些透明机制通过使 Fulcio 的诚信可以通过加密方式进行审计和验证,从而削弱了人们对 Fulcio 的信任。
PyPI 的证明功能充分利用了这些信任缩减技术:除非证明中包含来自 Rekor 的包含证明以及来自 Fulcio 的 CT 日志的包含证明,否则证明不被视为已验证。