ハニーポットによるユーザー名列挙: /u/*.json スキャンに対するCloudflareスニペット

私のDiscourseフォーラムは、こんな悪質なスキャナーに手こずっていました:ボットがワードリストを使って /u/<name>.json を総当たりし、404エラーを収集して、どのユーザー名が存在するかを把握しようとするのです。各プローブはUnicornのワーカーを1つ消費し、スキャナーに無料の答えを提供してしまいます。

Cloudflareスニペットを作成し、これらのプローブに対してエッジで信頼できそうな偽のプロフィールで応答するようにしました — ステータスコード 200、ユーザー名から導出した安定したID、参加日、信頼レベル、投稿数、さらにカナリーストリングを含む偽のメールアドレスまで。実際の訪問者はそのまま通過します: セッションCookie、same-siteリファラー、Accept: text/html、またはAPIキーがあれば「これは無視して」という意味です。origin(ソースサーバー)はプローブを一切受け取らないため、負荷は増加せず、むしろ減少します。

ヒットはIP、ASNとネットワーク名、国、都市、エッジデータセンター、HTTP/TLSバージョン、User-Agent、およびプローブされたユーザー名とともにNew Relicに記録されます。インポート可能な11ウィジェットのダッシュボードと、「繰り返しアクセスしてくるのは誰か」を表示するNRQLクエリも用意されています。

スニペットスロット1つ分。KVもWorkerもoriginの変更もブロック処理も不要。
アカウント内にはまだ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インポート(2つのプレースホルダーを置き換えないと失敗します)、そしてDiscourseの注意事項 — 組み込みの「一般ユーザーからユーザープロファイルを非表示にする」設定の方が実は最適な解決策となるケースを含めて — が記載されていますが、私の環境ではそれが不可能でした。

誰かの役に立てば嬉しいです。私たちのサーバーの負荷は、デプロイ後1時間以内に低下しました。