跳至内容

PyPI 受到传票

2023 年 3 月和 4 月,Python 软件基金会 (PSF) 收到三 (3) 份关于 PyPI 用户数据的传票。所有三份传票均由美国司法部发出。PSF 未被告知有关这些传票的法律背景。总共要求与五 (5) 个 PyPI 用户名相关的用户数据。

数据请求为

  1. "姓名(包括订阅者姓名、用户名和屏幕名称);"
  2. "地址(包括邮寄地址、住宅地址、商业地址和电子邮件地址);"
  3. "连接记录;"
  4. "会话时间和持续时间的记录,以及与这些会话关联的临时分配的网络地址(如互联网协议地址);"
  5. "服务期限(包括开始日期)和所用服务类型;"
  6. "电话或仪器号码(包括注册互联网协议地址);"
  7. "任何此类服务的支付方式和来源(包括任何信用卡或银行帐号)和账单记录;"
  8. "由..." 给定用户名上传的所有 Python 包索引 (PyPI) 包的记录
  9. "由..." 给定用户名上传的任何 Python 包索引 (PyPI) 包的 IP 下载日志

PyPI 用户的隐私对 PSF 和 PyPI 管理员至关重要,我们致力于尽一切努力保护用户数据免遭泄露。然而,在这种情况下,PSF 在律师的建议下确定,我们唯一的行动方案是提供请求的数据。我作为 Python 软件基金会的基础设施主管,在与 PSF 的律师协商后履行了这些请求。

我们已经等待传票链条消退,尽管我们从一开始就承诺为了透明起见撰写和发布这篇文章,并且根据 2023 年 3 月和 4 月收到的传票没有相关保密协议的要求。

下一步

PyPI 和 PSF 致力于我们用户的自由、安全和隐私。

这个过程让我们有时间重新审视我们目前的微薄的数据和隐私标准,以确保它们考虑到 Python 社区的各种利益。虽然我们从 PyPI 用户那里收集的个人数据很少,但任何不必要地保存的数据仍然会受到这类请求的影响,此外还有数据因恶意或操作员错误而泄露的基本风险。

因此,我们目前正在制定新的数据保留和披露政策。这些政策将与我们对未来政府数据请求的程序有关,我们如何以及在何种期限内存储个人身份信息(如用户访问记录),以及明确为我们的用户和社区制定的政策。

请继续关注本博客,了解相关政策最终确定、发布和实施后的公告。


细节

为了尽可能提供透明度,以下将详细说明这些传票回复中包含的数据的形状和范围。

我们不会公开或向用户本身发布涉及的用户名。

1) 姓名(包括订阅者姓名、用户名和屏幕名称);

这些已通过我们的数据库记录确认

select id, username, name from users where username = '{USERNAME}';

返回

id       | UUID for USERNAME
username | PyPI username
name     | Display name for user

并且在 https://pypi.ac.cn/user/{USERNAME}/ 上公开可用。

PyPI 允许用户删除其帐户。

PyPI 不允许在没有管理员干预的情况下更改 用户名 字段,并且针对相关用户没有发生过任何此类干预。如果有,我们会提供这些更改的记录。

PyPI 允许用户更新其显示名称,并且不保留这些更改的记录。

2) 地址(包括邮寄地址、住宅地址、商业地址和电子邮件地址);

PyPI 仅为个人用户存储电子邮件地址。不存储任何物理地址。注册了账单(尚未启用)的组织帐户将需要提供与其付款方式相符的账单地址。

这些信息来自我们的数据库记录,对 PyPI 保密。

select email, user_id from user_emails where user_id ='{UUID for USERNAME}';

返回

email   | An email address
user_id | UUID for USERNAME

PyPI 允许用户在没有管理员干预的情况下添加和删除电子邮件地址。这些更改的记录会保留,并且在我们的记录中没有观察到针对相关用户名的任何此类更改。如果有,我们会提供这些更改的记录。

3. 连接记录

3a. 项目事件

PyPI 保留索引上所有项目更改的记录,并且自 2002-11-01 17:11:36 UTC 开始。

这些已通过我们的数据库记录确认

select * from journals where submitted_by='{USERNAME}' order by submitted_date;

返回

id             | An auto incrementing integer representing the "Serial"
name           | Name of a PyPI Project
version        | Version of a PyPI Release if relevant
action         | Description of the action taken against the Project/Release
submitted_date | ISO-8601 datetime in UTC
submitted_by   | PyPI Username
submitted_from | IP Address

除了 submitted_by (PyPI 用户名) 和 submitted_from (IP 地址) 列之外,这些信息可通过我们的 XMLRPC API 公开获取。

3b. 用户事件

PyPI 保留关键用户事件的记录,包括帐户创建、发送的电子邮件、电子邮件地址更改、登录和登录失败。有关记录的完整事件集,请参见 此列表

这些信息来自我们的数据库记录

select * from user_events where source_id = '{UUID for USERNAME}' order by time desc;

返回

id                | UUID of the event
source_id         | UUID for USERNAME
tag               | EventTag
time              | ISO-8601 datetime in UTC
ip_address_string | IP Address
additional        | JSONB metadata about the event
ip_address_id     | UUID of associated IPAddress object

并且对 PyPI 保密。

4. 会话时间和持续时间的记录,以及与这些会话关联的临时分配的网络地址(如互联网协议地址);

PyPI 不记录会话持续时间。

会话创建(登录)时间作为 3b 中数据的概要提供。

上传不会创建会话,但与项目上传相关的登录事件作为 3a 中数据的概要提供。

5. 服务期限(包括开始日期)和所用服务类型;

PyPI 保留用户帐户创建日期的记录,以及任何方法(网络 UI 或用于上传的命令行工具)最后一次成功登录的时间。

select date_joined, last_login from users where username =  {USERNAME}

返回

date_joined | ISO-8601 datetime in UTC
last_login  | ISO-8601 datetime in UTC

这些信息来自我们的数据库记录,并且对 PyPI 保密。

所用服务类型对 PyPI 来说是“标准的”,包括创建项目、发布和下载分发文件的能力。

6. 电话或仪器号码(包括注册互联网协议地址);

共享了之前记录中每个用户名的所有 IP 地址的概要。

这些信息来自我们的数据库记录,并且对 PyPI 保密。

7. 任何此类服务的支付方式和来源(包括任何信用卡或银行帐号)和账单记录;

PyPI 对个人用户没有使用费用,因此不存在此类付款记录或账单记录。

8. 由给定用户名上传的所有 Python 包索引 (PyPI) 包的记录

提供了与每个用户名关联的所有过去和任何当前项目的列表。

这些信息来自我们的数据库记录,对于过去的项目,对 PyPI 保密。

9. 由给定用户名上传的任何 Python 包索引 (PyPI) 包的 IP 下载日志

PyPI 不保留包含 IP 地址的包的下载日志。下载日志由管道处理,该管道包括 CDN 报告的 GeoIP 信息。

这些记录来自 Google BigQuery 公共数据集,并使用以下查询

SELECT * FROM `bigquery-public-data.pypi.file_downloads`
WHERE project IN ({LIST OF PROJECT NAMES FROM 8})
AND timestamp > '{START OF PERIOD IN QUESTION}';

Ee Durbin 是 Python 软件基金会的基础设施主管。自 2013 年以来,他们一直致力于保持 PyPI 在线、可用和安全。