WAF で送信元を止める前に「巻き添え」を確かめる(IP / ASN / JA4 の使い分け)
迷惑な送信元をブロックするときは、止める単位(IP・ASN・JA4・国など)ごとに巻き添えになる正規利用者がいないかを確認し、広く当たる条件は bot スコアなどと AND で組み合わせ、決め手がなければ止めずに保留して理由を記録する。
いつ使うか
- マネージドルールをすり抜ける迷惑アクセスや、攻撃ばかり送ってくる送信元を手動で止めるとき。
- Cloudflare 無料プランで「探索系スキャン」を塞ぐ(ブロックログ起点のカスタムルール) の次の段階として、パスではなく送信元単位で止めたくなったとき。
- 元記事は Cloudflare Enterprise+Bot Management 前提(Bot Score・JA4・Log アクションなど)。考え方は AWS WAF など他製品でも同じ。
止める単位と、止まる範囲
| 単位 | 止まる範囲 | 巻き添えの典型 |
|---|---|---|
| IP | その IP からの全アクセス | CGN(携帯/ISP の共有 IP)、会社の出口、VPN・iCloud プライベートリレー・WARP |
| ASN | 事業者ネットワーク全体 | ISP・携帯キャリア・VPN 事業者・クラウド上の正規サービス |
| JA4(TLS ClientHello の指紋) | 同じソフト・同じ設定の全アクセス(IP・事業者をまたぐ) | 一般ブラウザの JA4、社内スクリプトや取引先連携のライブラリ |
| 国 | その国全体 | その国の正規利用者・通したいクローラー |
JA4 の読み方: t13d1516h2_... の 13 が TLS 1.3、h2 が ALPN(HTTP/2)。主要ブラウザは t13...h2、Python / Go のライブラリは ALPN が 00 や h1 になりがち。ただし curl-impersonate や uTLS でブラウザの JA4 は偽装できる。
調べる入り口(Security Analytics などで)
- 偵察: WAF を通過してオリジンに届き、404 などのエラーが多い送信元(MITRE ATT&CK T1595.003 Wordlist Scanning)。
- 攻撃: マネージドルールでブロックされた件数が多い送信元。ほぼ攻撃だけなら送信元ごと止めると、ルールをすり抜けた分もまとめて止まる。
止める根拠になるサイン
- リクエストがほぼ攻撃だけ(Attack Score が低い、マネージドルール該当ばかり)
- 使っていない CMS や言語のパス、ログイン必須ページ、検証環境を次々に試す
- 200 番台がほとんどなく 404 / 5xx が多い
- 検索エンジンの bot を名乗るのに Verified bot ではない(運営元の公開手順で確認しても偽物)
- 運営元不明のクローラーが負荷をかけている/公開脅威情報に載っている
止める前のチェック
- 共有 IP ではないか: 期間を長めにとり、人間寄りスコアのリクエストが混じっていないか、User-Agent や JA4 が何種類もないか、どの事業者の IP かを見る。
- ASN の種類と規模: Cloudflare Investigate で事業者の種類と IP 範囲、Cloudflare Radar(APNIC 推定)で利用者数を確認。
- ホスティング: 複数 IP から攻撃が続くなら ASN で止めることもある
- クラウド: 原則 IP 単位。ASN の大半が迷惑な場合のみ ASN
- ISP・携帯・VPN/プロキシ: ASN 単独では止めない
- JA4 が一般ブラウザのものではないか、社内・取引先で同じ JA4 を使っていないか。
- 業務で使っている bot・正規クローラー・自社拠点/VPN の出口ではないか。正規クローラーはまずレートリミットで量を抑える。
- 決め手がなければ保留(自然な閲覧に見える、人間寄りスコア、共有 IP で切り分けられない、クラウドで決め手なし)。
ルールの書き方
- 国・一般ブラウザの JA4・ISP の ASN・共有 IP のような広く当たる条件は単独で使わず、Bot Score などの自動化/攻撃条件と AND で組む。値を並べるだけのルールと組み合わせルールは分けて管理する。
- 影響が読めない条件はまず記録だけ(Log / AWS は Count)で試す。人が混じりうるならブロックではなく確認画面(Managed Challenge / CAPTCHA)。
- アカウントレベルのルール(複数サイトにまとめて効く)はサイト側の例外より先に評価され、誤ると全サイトに波及する。どのサイトにも不要なアクセスだけを書く。
- 例外(Skip)はパスと送信元の両方で絞り、飛ばすルールも最小限に。誤検知はルールセット全体を止めず、該当ルールだけをそのパスで外す。
止めた後
- 日付・対象(単位と値)・理由・根拠にした画面・送信元の調査結果を記録し、保留にしたものも同じ形で記録する。
- ブロック値はいずれ腐る(JA4 は年 1 回程度変わる、UA はいつでも変えられる、IP は持ち主が変わる)。IP リストのコメントに追加日を入れ、古いものから見直す。
- ルール名・記録・実設定を突き合わせて揃える。
出典
- @yousukezan · 2026-10-15
- 元記事(Zenn, azunyan): zenn.dev