蜜罐用户名枚举:针对 /u/*.json 扫描的 Cloudflare 片段

我的 Discourse 论坛正疯狂遭受此类扫描器的攻击:一个机器人针对 /u/<name>.json 遍历用户名列表,收集返回 404 的响应,从而确定哪些用户名是存在的。每次探测都会消耗一个 Unicorn 工作进程,并向扫描器提供免费的答案。

我在 Cloudflare Snippet 中编写了一个小型脚本,在边缘节点用可信但虚假的个人资料来响应这些探测请求——200 状态码、由用户名派生的稳定 ID、加入日期、信任级别、发帖数量,甚至是一个包含金丝雀字符串(canary string)的虚假电子邮件地址。真实访客则不受任何影响,直接通过:会话 cookie、同源站点引用者、Accept: text/html 或 API 密钥都意味着“对此请求不予处理”。源服务器永远不会看到这些探测请求,因此这种更改是减少负载,而不是增加负载。

命中记录会连同 IP、ASN 和网络名称、国家、城市、边缘节点、HTTP/TLS 版本、用户代理以及被探测的用户名一起,记录到 New Relic。你可以导入一个包含十一个小部件的仪表盘,并可以使用 NRQL 查询“谁在反复访问”。

只需一个 Snippet 插槽。无需 KV,无需 Worker,无需修改源服务器设置,也无需进行拦截。
你还有 4 个剩余插槽,可以用在账户中的其他站点上。

代码仓库: GitHub - hhftechnology/cloudflare-honeypot: Cloudflare Snippet honeypot for user-enumeration scans (/u/*.json): fake 200 profile, New Relic logging, zero origin load · GitHub

文档涵盖了 Cloudflare 规则(注意:matches 运算符需要 Business 计划——请使用 wildcard)、New Relic 导入指南(必须替换两个占位符,否则会失败),以及 Discourse 注意事项——包括内置的“对公众隐藏用户资料”设置可能是更佳选择的情况。但对我而言,这一点无法实现。

希望这对某些人有所帮助。部署后的一小时内,我们的服务器负载就下降了。