减少 PyPI 中存储的 IP 数据
大家好!我是 Mike,PyPI 管理团队的最新成员。很高兴认识你!
TL;DR
我们一直在努力减少存储的 IP 地址数据量,并且取得了进展。
这是什么?
如果你读过这里的一些其他博客,你可能已经注意到我们一直在进行一系列的安全和隐私改进。
几个月前,我们开始探索从我们的堆栈中删除 IP 地址的概念,同时保留安全管理平台的能力。
历史上 IP 数据使用的一些地方
- 网页访问日志
- 用户事件(登录、注销、密码重置等)
- 项目事件(创建、新版本、新文件上传、撤回等)
- 组织/团队成员资格事件(新!)
- 日志条目(对 PyPI 管理员私有)
安全是一个频谱 - 在一个极端,它是狂野的西部,没有安全。在另一个极端,一切都锁定,无法使用。我们必须不断平衡用户的需求和愿望与运行可持续、可信赖的平台的需求。
类似的心态可以应用于隐私 - 我们必须在提供可管理的服务和保护用户隐私之间取得平衡。
我们短期内采取的两种主要方法是
- 评估我们是否需要存储 IP 数据
- 尽可能使用 IP 数据的替代方案
我将提供几个示例来演示上述内容。
我们需要 IP 数据吗?
当我们评估存储 IP 数据的不同位置时,我们了解到我们的日志条目(类似于只追加的事务日志)从未暴露在管理员用户之外,即使那样,也仅用于管理员显示。
我们从未通过 API 共享它,或将其用于操作目的。因此,我们审计了代码,删除了停止写入该列的调用,并将其删除了。
太好了!
我们目前仍然需要 IP 数据的其他地方包括速率限制,以及在使用哈希和地理数据填充 IP 数据之前进行回填。我们的现代方法已经从在显示时使用 IP 数据查找相关地理数据,演变为直接在数据库中存储地理数据。
另一个用例是处理滥用 - 我们需要能够识别滥用来源,并采取措施阻止其发生。我们正在考虑如何管理,而无需存储 IP 数据,但我们还没有做到。
IP 数据的替代方案
对于我们存储 IP 数据的其他地方,我们问自己 - 我们能使用替代方案吗?
我们不能存储我们看不到的东西,因此我们探索了可以做些什么来减少我们看到的 IP 数据量。
几乎所有对 PyPI 的请求都是通过我们的 CDN 合作伙伴 Fastly 提供的。他们提供许多功能,包括添加自定义标头的能力。我们已经利用了这种能力来做许多事情,例如将请求的传入编码或语言通知仓库代码。
我们探索了是否可以使用它来添加 IP 地址的哈希值,并使用它来代替 IP 地址本身。Fastly 还可以提供有关 IP 地址的一些基本地理信息,这符合我们的目的,即向用户显示他们从何处连接。
使用这种方法,我们让 Fastly 将已经哈希的 IP 地址以及地理数据传递给我们的后端,并将其存储起来以备后用。
我们发现的另一个地方是网页访问日志。我们不需要真正的 IP 地址,因为我们很少将它们用于除低级调试之外的任何其他目的,因此稳定的哈希值可以用于关联请求。
对于 Fastly 未提供服务的请求,我们已经在存储之前自己对 IP 地址进行哈希处理,因此我们可以“看到” IP 地址,但我们尽量避免存储它。我们不会获得这些请求的地理数据,我们正在考虑现有的创造性和可持续解决方案。
问答
我试图想出你可能提出的一些问题,并在这里回答它们。如果你还有更多问题,请随时与我们联系!
问:哈希的 IP 地址安全吗?
答:它比普通的 IP 地址更安全,这是肯定的。我们在对 IP 地址进行哈希处理之前,会应用一个盐(已知值)。这不是一个完美的解决方案,但它是一个朝着正确方向迈出的一步。
哈希是不可逆的,但由于已知地址空间相对较小,因此可以对哈希进行暴力破解以确定原始 IP 地址。通过应用盐,我们需要有人同时拥有盐和哈希的 IP 地址才能暴力破解该值。我们的盐不会存储在数据库中,而哈希的 IP 地址会存储在数据库中,我们防止泄露会泄露此信息。
问:这是对传票的回应吗?
答:不,我们早在2020 年就开始了这方面的探索,长期目标是提高最终用户安全,同时保留有效引导平台的能力。当我们探索 CDN 合作伙伴的地理 IP 数据选项时,我们最近重新开始了这项工作。
问:我们做完了吗?
答:不!安全是一个持续的过程,我们正在为实现这个目标而努力。我们仍然有一些工作要做,以替换模型中的 IP 数据,在我们使用哈希的 IP 数据和相关地理数据填充完模型后,以及清理一些代码。
问:接下来是什么?
答:我无法预测我们可能会采取的每一步,但我们正在考虑的一些事情
- 重新评估事件历史记录中 IP 数据的需要永远,在一段时间后将其删除
- 探索我们是否可以使用 CDN 来处理所有请求
- 确定是否有比日志条目更好的机制,并替换它们
我们相信我们正在采取的措施朝着正确的方向发展,我们很高兴与您分享我们的进展。希望这能加深您对我们正在进行的工作的理解,以支持维护安全、可信的平台。
感谢您的阅读!
Mike Fiedler 自 2022 年以来一直是 PyPI 管理员和 Python 包索引的维护者。