CT Logとbot対策:AI検索で参照されたいならBot Fight Modeを入れてはいけない

未分類メモ

きっかけ

「どこにも公開していないのにアクセスが来る」というポストが流れてきた。コメントで「CT Logを監視されているのでは」と書いたら、「まとめがあるといいな」という反応をもらったので、簡単に整理してみた。

HTTPSを公開すると攻撃botが来る、という話についての記事を読んでもらえれば経緯はわかるが、要するにこういうことだ。

  • HTTPSサイトを公開すると、発行した証明書がCT Logに記録される
  • CT Logは誰でも検索できるため、botはここを監視して新規公開ドメインを拾う
  • 公開直後に/.env/.git/wp-adminあたりを決め打ちでスキャンしてくる
  • 公開直後はセキュリティ設定が甘いことが多いため、そこを狙う

Bot Fight Modeを入れてはいけないケースがある

記事ではCloudflare WAFやBot Fight Modeでの対策を推奨している。実際、自分のサイト(このサイト)もCloudflare Pagesで運用しているので、設定を見直してみた。

ただ、調べていて一つ気になった点がある。

Bot Fight ModeはAI検索クローラーも弾く可能性がある。

Cloudflareが「Verified Bot」として認識しているのは、主に学習目的のバックグラウンドクローラーだ。

bot分類Bot Fight Mode
GooglebotVerified Bot通過
GPTBot(OpenAI学習クローラー)Verified Bot通過
ClaudeBot(Anthropic学習クローラー)Verified Bot通過
Perplexityのリアルタイムフェッチグレーゾーン弾かれる可能性あり
ChatGPT Browseのフェッチグレーゾーン弾かれる可能性あり
スキャンbotUnverified Botブロック

問題になるのは「ユーザーがAIに検索させたとき」のリアルタイムフェッチだ。PerplexityやChatGPT Browseがページ内容を取りに来るとき、そのリクエストはAIサービスのサーバーから出る。通常のブラウザとはフィンガープリントが異なるため、Bot Fight Modeに引っかかる可能性がある。

税理士事務所のサイトで「秋葉原 税理士事務所」とユーザーがAI検索したとき、自分のサイトが参照されなければ意味がない。それをブロックするBot Fight Modeは、この用途では逆効果になる。

ではどうするか

Bot Fight ModeなしでWAF Custom Rulesを使い、悪意あるスキャンパスだけを個別にブロックする方が安全だ。

Cloudflare Dashboard → Security → WAF → Custom Rules に以下を追加する。

URI Path contains /.env       → Block
URI Path contains /.git       → Block
URI Path contains /wp-admin   → Block
URI Path contains /phpinfo    → Block
URI Path contains /.php       → Block

これなら学習クローラーもリアルタイムフェッチも通過できる。スキャンbotが狙う「うっかり置いてある機密ファイル」のパスだけを塞ぐ形になる。

SSGでも.envの中身が漏れる経路はある

このサイトはNuxt 3 + Cloudflare Pages静的出力(SSG)で動いている。「SSGだから.envが本番に含まれるリスクはない」と思いがちだが、一つ落とし穴がある。

NuxtのruntimeConfig.publicに入れた値は、ビルド後のJavaScriptバンドルに埋め込まれる。

// nuxt.config.ts
runtimeConfig: {
  resendApiKey: process.env.RESEND_API_KEY,  // サーバーサイドのみ → 静的ファイルに含まれない
  public: {
    apiBase: process.env.NUXT_PUBLIC_API_BASE,  // クライアントにも公開 → JSに埋め込まれる
  }
}

resendApiKeyのようにサーバーサイドのみに置いた値はSSGビルド後の静的ファイルには含まれない。一方、public配下に入れた値はクライアント側のJSに埋め込まれ、ブラウザのDevToolsから誰でも確認できる。

やってしまいがちなのは、開発中に「とりあえずpublicに入れておこう」とAPIキーやトークンを置いてしまうケースだ。.envファイル自体は本番に存在しなくても、その中身がJSバンドル経由で全公開になる。

対策はシンプルで、ブラウザに渡す必要がない値は絶対にpublicに入れない、これだけだ。このサイトはogSecret等の機密値はサーバーサイドのみに置いており、publicには非機密の設定値しか入っていない。

まとめ

観点結論
Bot Fight ModeAI検索で参照されたいサイトには不向き
WAF Custom Rules悪意あるパスのみ個別ブロックで十分
robots.txtallow: ['/']のまま維持(AI検索には明示的に許可を)
SSG + .envファイル自体は含まれないがruntimeConfig.publicに機密値を入れると漏れる

「httpsで公開したら攻撃botが来る」は事実だが、対策の選択肢によっては本来見せたい相手(AI検索)も弾いてしまう。セキュリティ設定はサイトの目的と照らし合わせて選ぶ必要がある。