ipscrub: NGINX IP 地址匿名化模块
安装
您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:
- RedHat Enterprise Linux 7、8、9 和 10
- CentOS 7、8、9
- AlmaLinux 8、9
- Rocky Linux 8、9
- Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-ipscrub
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-ipscrub
通过在 /etc/nginx/nginx.conf 顶部添加以下内容来启用模块:
load_module modules/ngx_ipscrub_module.so;
本文档描述了 nginx-module-ipscrub v1.0.1,发布于 2018 年 5 月 29 日。
ipscrub 是一个用于 nginx 日志文件的 IP 地址匿名化工具。它是一个 nginx 模块,生成基于 IP 的哈希。您可以使用此哈希链接来自同一来源的请求,而无需通过 IP 地址识别用户。

安全模型
- 在初始化时,以及每个
PERIOD,使用arc4random_buf()生成 128 位的salt。 - 在每个请求中,生成掩码 IP 地址作为
HASH(salt ++ IP address)。 - 记录掩码 IP 地址。
ipscrub 使用 arc4random 生成随机的 nonce(请参见 Theo de Raat 关于 arc4random 的演讲 以获取概述)。在 Linux 上,这需要安装 libbsd(在 Ubuntu/Debian 上为 libbsd-dev 包)。
另外请注意:生成的哈希将在每个 PERIOD 过渡时发生变化,因此您只能在每个 PERIOD 内保持连续性。但由于用户可以随时在网络之间切换(例如,wifi -> 移动数据),即使您存储原始 IP 也会出现此类问题。
威胁模型
- 政府向您提供一个 IP 地址,并要求识别与该地址对应的用户。
- 政府通过电子邮件地址识别用户,并要求提供他们在某个时间点的 IP 地址。
在威胁场景 (1) 中,目标是计算与目标 IP 地址对应的掩码 IP。这只有在当前 PERIOD 结束之前提出要求时才可能实现。
场景 (2) 受到防御,因为服务器操作员不知道 salt,并且无法根据请求时间戳推断出它,因为 salt 是从仅存储在内存中的 nonce 生成的。在这种情况下,服务器操作员必须是同谋,但这更简单地通过服务器操作员仅记录未掩码的 IP 来实现。因此,这种安全/威胁模型并不能防止恶意的服务器操作员,但这并不是重点。它确实防止了诚实的服务器操作员在威胁场景 (1) 和 (2) 中被迫提供信息。
使用
配置
在您的 nginx.conf 中,
- 在顶层,通过添加行
load_module ngx_ipscrub_module.so;加载模块(注意:仅在您将其构建为动态模块时)。 - 设置
ipscrub_period_seconds <NUM SECONDS PER PERIOD>;(可选)。 - 在您的
log_format指令中,将$remote_addr替换为$remote_addr_ipscrub。 - 重新加载您的 nginx 配置。
注意:nginx 可能仍会在错误日志中泄漏 IP 地址。如果这让您担忧,请禁用错误日志或定期清除日志。
运行测试
make test
更新日志
- 1.0.1 修复了对解密哈希 IP 的漏洞(感谢 @marcan)
- 1.0.0 初始发布
GDPR
GDPR 于 2018 年 5 月 25 日生效。它立法处理有关用户的个人数据,包括 IP 地址。
来自 https://www.eugdpr.org/gdpr-faqs.html:
什么构成个人数据?
任何与自然人或“数据主体”相关的信息,可以直接或间接识别该人。它可以是姓名、照片、[...] 或计算机 IP 地址等任何内容。
ipscrub 生成的哈希让您能够通过 IP 地址关联 nginx 日志条目,而无需实际存储 IP 地址,从而减少您的 GDPR 风险。
YAGNI
您为什么还要记录 IP 地址呢?You Ain't Gonna Need It。如果您想要地理定位,只需结合使用 MaxMind 的 GeoIP 模块 和 ipscrub。
GitHub
您可以在 nginx-module-ipscrub 的 GitHub 仓库 中找到此模块的其他配置提示和文档。