PEP 449 – 移除 PyPI 镜像自动发现和命名方案
- 作者:
- Donald Stufft <donald at stufft.io>
- BDFL 委托:
- Richard Jones <richard at python.org>
- 讨论至:
- Distutils-SIG 邮件列表
- 状态:
- 最终版
- 类型:
- 流程
- 主题:
- 打包
- 创建日期:
- 2013年8月4日
- 发布历史:
- 2013年8月4日
- 取代:
- 381
- 决议:
- Distutils-SIG 消息
摘要
本PEP提供了一条路径,用于弃用并最终移除PyPI镜像的自动发现以及硬编码的命名方案,该方案要求将pypi.python.org下的域名委托给第三方。
基本原理
PyPI镜像基础设施(定义在PEP 381中)提供了一种镜像自动安装程序所使用的PyPI内容的方法。它还提供了一种镜像自动发现和统一命名方案的方法。
自动发现协议和命名方案存在许多问题
- 它们将对 *.python.org 域名的控制权交给第三方,允许该第三方在 pypi.python.org 和 python.org 域名上设置或读取 cookie。
- 使用 pypi.python.org 的子域名意味着镜像运营商将永远无法获得自己的SSL证书,而为他们提供一个 python.org 域名的证书不太可能实现。
- 自动发现使用未经验证的协议(DNS)。
- 这些域名缺乏TLS证书意味着客户端无法确定自己是否未成为DNS投毒或中间人攻击的受害者。
- 自动发现协议旨在使客户端能够自动选择要使用的镜像。这已不再是必需的,因为PyPI现在使用的CDN是一个全球分布的服务器网络,它将自动选择一个靠近客户端的服务器,而无需客户端付出任何努力。
- 自动发现协议和统一命名方案仅由一个安装程序(pip)实现过,其实现除了不安全之外,还存在严重的性能问题,并计划在其下一版本(1.5)中移除。
- 尽管 PEP 381 中规定了一些条款,可以为专用客户端解决*一些*这些问题,但它无法解决影响用户浏览器的问题。此外,这些条款迄今为止尚未被任何安装程序实现。
由于存在诸多问题,其中一些非常严重,并且CDN提供了自动发现和统一命名方案的大部分好处,本PEP提议首先弃用然后移除镜像的 [a..z].pypi.python.org 名称以及自动发现协议的 last.pypi.python.org 名称。镜像能力和镜像方法将不受影响,并将继续按照PEP 381中的规定存在。鼓励现有镜像的运营商获取自己的域名和证书以用于其镜像,如果他们希望继续托管它们。
弃用和移除计划
本PEP一旦获得批准,PyPI上的文档将立即更新,以反映官方公共镜像的弃用性质,并将引导用户访问外部资源,例如http://www.pypi-mirrors.org/,以发现非官方公共镜像(如果他们希望使用)。
镜像运营商,如果希望继续运营其镜像,应为其镜像获取一个域名,如果可能,还应获取TLS证书。一旦他们获得了域名,他们应将其分配的N.pypi.python.org域名重定向到他们的新域名。在2014年2月15日,[a..z].pypi.python.org和last.pypi.python.org的DNS条目将被移除。在2014年2月15日之前的任何时间,镜像运营商都可以请求PyPI收回其域名并将其指向主服务器。
为何选择2014年2月15日
本PEP最关键的决定是最终截止日期。如果日期过早,将不必要地惩罚人们,迫使他们放下一切来更新部署脚本。如果日期过远,则延长的期限无助于迁移工作,只是将迁移推迟到以后。
选择2014年2月15日这个日期是因为它大约是PEP发布日期起的6个月。这应该确保有足够长的时间让人们更新其部署过程以指向新的域名,而不仅仅是拖延截止日期。
为何必须移除DNS条目
虽然可以将镜像中使用的域名简单地收回并将其指向PyPI,以避免用户需要更新配置以不再指向这些域名,但这会带来一些问题。
- 目前在配置中硬编码了这些名称的任何人,都将它们硬编码为HTTP。这意味着,通过允许这些名称继续解析,我们使中间人运营商能够通过在将其提供给客户端之前将重定向重写为HTTPS来轻易地攻击用户。
- 维护多个指向PyPI的域名的开销已证明对于少量已被收回的N.pypi.python.org域名来说是麻烦的。当服务发生变化时,它们经常被错误配置,导致它们长时间(有时长达数月)无法正常工作,直到有人注意到。通过保留它们,我们让这些域名的用户面临随机故障的风险,而这些故障不太可能被发现或注意到。
- 使用这些域名的人出于某种原因明确选择了使用它们。其中一个原因可能是他们不希望从特定国家的主机进行部署。如果这些域名继续解析但不再指向其现有位置,我们就悄悄地取消了这些域名现有用户的选择权。
尽管如此,移除这些条目*将*要求已修改其配置的用户要么指向主服务器 (PyPI),要么选择一个新的镜像名称进行指向。这被视为一项令人遗憾的要求,旨在保护PyPI本身和镜像用户免受上述攻击,或者至少要求他们就其不安全性做出明智的决定。
公共或私人镜像
镜像协议将继续按照PEP 381中的定义存在,并鼓励人们根据需要托管公共和私人镜像。推荐的镜像客户端是Bandersnatch。
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0449.rst