Cloudflare WAFで悪質Botを99%ブロックする設定【カスタムルール完全版】
TL;DR
悪質Botを放置すると 帯域コストが膨らみ、サーバーが落ち、正規ユーザーが損をする。CloudflareのWAFカスタムルールを使えば、正規ユーザーに影響を与えずにBotトラフィックの大半を弾ける。このページでは設定をステップ順に解説する。コピペ可能なルール式付き。
なぜ今Botブロックが必要か
Botトラフィックはインターネット全体の約半数を占めるとされる(Cloudflare Radar調査)。問題は悪質Botが含まれること。
サイト運営者への直接ダメージ:
- 帯域コスト増: スクレイピングBotが大量リクエストを送ると転送量課金が膨らむ。VPSの月額が数倍になるケースは珍しくない
- サーバー負荷: 正規ユーザーより遥かに短い間隔でリクエストを打つため、CPU使用率が跳ね上がり応答遅延が発生する
- コンテンツ盗用: 商品データ・価格情報・記事本文を自動収集されて競合に使われる
- セキュリティスキャン: 脆弱性スキャナーが常時走っている状態になり、ゼロデイ発見のリスクが上がる
前提:CloudflareのBotブロック機能はプランで大きく変わる
設定前に自分のプランで何が使えるか確認する。
| 機能 | Free | Pro | Business | Enterprise |
|---|---|---|---|---|
| Bot Fight Mode(基本自動ブロック) | ◯ | ◯ | — | — |
| Super Bot Fight Mode(カテゴリ別設定) | — | ◯ | ◯ | ◯ |
| Bot Management(スコアリング) | — | — | — | ◯別途 |
| WAFカスタムルール数 | 5 | 20 | 100 | 1,000 |
| Rate Limitingルール数 | 1 | 2 | 5 | 100 |
| カスタムルールでRegex使用 | — | — | ◯ | ◯ |
本記事の設定は Pro(月額$20)以上 を前提とする。Freeプランは Step 1 だけ実行可能。
ダッシュボードのナビゲーション(2025年以降)
Cloudflareのダッシュボードは2024年以降リニューアルが進んでいる。新旧どちらを使っているかで導線が変わる。
| 操作 | 新Dashboard | 旧Dashboard |
|---|---|---|
| カスタムルール | Security > Security rules > Custom rules | Security > WAF > Custom rules |
| Rate Limiting | Security > Security rules > Rate limiting rules | Security > WAF > Rate limiting |
| Bot設定 | Security > Settings(「Bot traffic」でフィルタ) | Security > Bots |
| マネージドルール | Security > Settings(「Web application exploits」でフィルタ) | Security > WAF > Managed rules |
本記事では 新Dashboardの導線 を基準に記載する。
Step 1: Bot Fight Mode / Super Bot Fight Mode を有効化する(所要5分)
新Dashboard: Security > Settings → 「Bot traffic」でフィルタ
Freeプランの場合
「Bot Fight Mode」のトグルをONにする。CloudflareがBotと確定したトラフィックを自動的にチャレンジする。カスタマイズ不可。
Pro / Businessプランの場合
Bot Fight Mode をOFFにしてから「Super Bot Fight Mode」を設定する(両立不可)。
Super Bot Fight Modeの推奨設定:
| カテゴリ | 推奨アクション | 理由 |
|---|---|---|
| Definitely automated | Block | 確実なBotは即ブロック |
| Likely automated | Managed Challenge | 誤検知リスクがあるため最初はChallenge |
| Verified bots | Allow | GooglebotなどのSEOクローラーを通す |
| Static resource protection | ON | JS/CSSへのBot直アクセスをブロック |
| JavaScript detections | ON | JS非実行のHeadlessブラウザを検出 |
Managed Challenge はCloudflareがサイレントに動作を検証する仕組みで、正規ユーザーへの影響が少ない。最初は Managed Challenge で様子を見て、1週間後にSecurity Eventsで誤検知がなければ Block に上げる。
Step 2: WAFカスタムルールで精密ブロック
新Dashboard: Security > Security rules > Create rule > Custom rules
Cloudflareのルール式は (条件式) の形で書く。and / or / not で組み合わせ可能。
ルール1: 悪質なUser-Agentをブロック
(http.user_agent contains "python-requests") or
(http.user_agent contains "scrapy") or
(http.user_agent contains "zgrab") or
(http.user_agent contains "masscan") or
(http.user_agent contains "libwww-perl") or
(http.user_agent eq "")
アクション: Block
python-requests / scrapy はスクレイピングライブラリのデフォルトUA。masscan / zgrab はポートスキャナー。空UAは正規ブラウザでは発生しない。
注意: 自社のAPIクライアントやCI/CDで python-requests を使っている場合、先にそのIPのSkipルールを優先度上位に追加すること。
ルール2: 脆弱性スキャンのパスをブロック
(http.request.uri.path contains "/.env") or
(http.request.uri.path contains "/.git") or
(http.request.uri.path contains "/phpmyadmin") or
(http.request.uri.path contains "/xmlrpc.php") or
(http.request.uri.path contains "/wp-login.php") or
(http.request.uri.path contains "/admin/config")
アクション: Block
WordPressを使っていなくても wp-login.php へのスキャンは毎日来る。.env 取得狙いも頻繁。自サイトに不要なパスはすべて遮断してよい。
ルール3: 国別制限(オプション)
日本向けサービスで、特定の国からの攻撃が多い場合に有効。いきなりBlockせずManaged Challengeから始める。
(ip.geoip.country in {"CN" "RU" "KP"}) and
not (http.request.uri.path contains "/api/webhook")
アクション: Managed Challenge
Webhookの受信など特定パスは例外にするのがポイント。自サイトのアクセスログ(Security Events)で実際の攻撃元国を確認してから適用する。
Step 3: Rate Limitingでブルートフォース対策
新Dashboard: Security > Security rules > Rate limiting rules > Create rule
Proプランは2ルールのみ。重要度の高いエンドポイントに絞って設定する。
ログインページへのブルートフォース対策
| 設定項目 | 値 |
|---|---|
| Expression | http.request.uri.path eq "/login" |
| Characteristics(カウント単位) | IP address |
| Requests per period | 10 |
| Period | 1分 |
| Action | Block |
| Duration | 60秒 |
全パスに低閾値で設定すると正規ユーザーが誤ブロックされる。まずはログインやAPIなど重要エンドポイントのみに適用する。
Step 4: 効果確認(Security Events)
新Dashboard: Security > Events(または Analytics > Security)
設定後24〜48時間でブロックイベントが蓄積される。確認ポイント:
BlockされたリクエストのUA・IP・パスを見て誤検知がないか確認Challenge Solvedが多いルールは正規ユーザーを巻き込んでいる可能性 → アクションをBlockからManaged Challengeに緩める- 特定のUA・パスへの攻撃が集中していれば専用ルールを追加
# CloudflareのRay IDで個別リクエストを追跡する
curl -sI https://example.com/ | grep -i cf-ray
# cf-ray: 8abc123456def789-NRT
Ray IDをDashboardのEvents検索に入れると、そのリクエストへの判定結果と適用ルールが確認できる。
まとめ
| 設定 | 効果 | 必要プラン |
|---|---|---|
| Super Bot Fight Mode ON | 確実Bot自動ブロック・カテゴリ別設定 | Pro以上 |
| UAブロックルール | スクレイピングツール・スキャナー遮断 | Free以上 |
| パスブロックルール | 脆弱性スキャン・Botのパス探索遮断 | Free以上 |
| 国別Managed Challenge | 攻撃元国のトラフィックを選別 | Free以上 |
| Rate Limiting | ブルートフォース・短時間DDoS対策 | Pro以上(2ルール) |
WAF設定は「追加してからEventsで誤検知確認」のサイクルが重要。最初から全部Blockにせず、Managed Challenge → 問題なければ Block の順で段階的に締める。
会員限定:WAFルールJSON一式 + GoogleBot/BingBot例外設定
Super Bot Fight Modeの「Verified bots」でAllowに設定しても、カスタムルール側でGooglebotのUAを誤ってブロックするケースがある。検索エンジンBot(Googlebot・BingBot・Yahoo! Japan Bot)を誤検知しないための例外設定ルールと、本記事のカスタムルール4本をTerraform(HCL)でコード管理するテンプレートを会員限定で公開している。
この続きはメンバー限定です
メールアドレスを登録すると、本記事の設定ファイル・コードと全 10 本の実践記事が読めます。無料・いつでも解除可。