メインコンテンツへスキップ
ブログサイトのロゴsui Tech Blog
5分で読めます

「Cloudflare を入れていれば安心」は半分正解だった

個人サイトに Cloudflare を入れると、ダッシュボードに攻撃ブロックのログが並びます。WordPress の設定ファイルを狙った攻撃は確実にブロックされますが、認証情報を狙った攻撃は素通りしてしまいます。それでも実害はゼロだった理由は Cloudflare ではなく、サイトの構成にありました。

個人サイトに Cloudflare を入れている人は多いと思います。ダッシュボードを開くと Security Analytics に「blocked」のログが並んでいて、「攻撃を防いでくれている」という安心感があります。私が運営する Webサイトも同じでした。

これは合理的な判断です。Cloudflare の WAF1 は実際に強力で、WordPress 系の設定ファイル漏洩を狙った攻撃は無料プランでも確実にブロックしてくれます。「入れておけば大丈夫」という感覚は、間違っていません。

「どれくらいブロックできているのか」が気になって、GraphQL Analytics API で実際のログを取得して確認してみました。
結果は、攻撃の 93% が WAF を素通りしていました。
.env・AWS credentials・フレームワーク設定ファイルなど、これらを狙ったリクエストは全部オリジンまで届いています。

それでも、実害はありませんでした。その理由はサイトの構成にありました。

攻撃の 93% は素通りしていた

最も攻撃リクエストが多かった IP アドレス(オランダ、TECHOFF SRV LIMITED)のデータを確認しました。

action 件数
block 6
unknown(素通り) 85
合計 91

91 件の攻撃のうち、ブロックできたのは 6 件(6.6%)のみです。残り 85 件はオリジンまで届いていました。

ブロックできたのは WordPress 系の設定ファイルを狙ったパスだけです。Cloudflare のマネージドルールは、WordPress 向けのルールセットが中心になっているため、以下はブロックされていました。

/wp-config.php.swp
/wp-config.php~
/wp-config.php.bak
/wp-config.php.old
/wp-config.php.save
/wp-config.php.txt
/backup/wp-config.php

一方、WordPress 以外を狙ったパターンはルールに引っかからず素通りしています。

# 環境変数ファイル
/.env, /.env.production, /.env.staging, /.env.dev, /.env.test
 
# クラウド認証情報
/.aws/credentials
/.aws/config
/.docker/config.json
/.composer/auth.json
 
# フレームワーク設定
/storage/logs/laravel.log
/appsettings.json
/terraform.tfstate
 
# Git 認証情報
/.git-credentials

さらに URLエンコード(/.%65%6Ev/.env)や二重エンコードで WAF の検知を回避しようとするリクエストも多数含まれていました。/.env;.css/.env;.jpg のような拡張子偽装まであります。

CloudflareのダッシュボードでURLエンコードやクレデンシャルを狙った攻撃が多数観測される

Cloudflare は「無料プランでも全部守ってくれる」ではなく、「WordPress の定番攻撃はブロックできるが、それ以外の広範な攻撃パターンは素通りする」が正確な理解です。

実害がゼロだった本当の理由

85 件が素通りしても実害がなかった理由は単純です。このサイトは Astro と Cloudflare Workers ベースの静的サイトで、.env も AWS credentials も存在しません。素通りしてオリジンに届いても、404 が返るだけです。

「実害がなかったのは Cloudflare のおかげ」ではなく、「攻撃者が求めているファイルが最初から存在しないから」です。

WordPress や Laravel のような構成であれば、これらのパスに実際のファイルが存在する可能性があります。Astro で静的サイトを作って Cloudflare Workers でホスティングするという選択が、結果としてこれらの攻撃を無効化していました。
アーキテクチャの選択がそのままセキュリティ対策になっているというのは、意識してやっていたわけではなかったので、あとから気付いておもしろいと感じました。

無差別スキャンという事実

「小規模な個人サイトは狙われない」というのは誤解で、実態は迷惑メールと同じ論法です。
10 万件送って 1 件でも引っかかればよい。プログラムで自動的に大量のサイトをスキャンし、そのうち 1 件でも脆弱な構成のサイトが見つかれば成果です。攻撃者にとってコストはほぼゼロですので、無差別に続けることに合理性があります。

今回の IP アドレスも 4/25・4/26・4/27 と 3 日連続でアクセスしていて、継続的なスキャンが動いていることが分かります。

トラフィック全体を 5 日分のサンプル(2,500 件)で集計すると、verified bot2(Cloudflare が認定した正規bot)が 1,249 件(49.9%)でした。2 リクエストに 1 つは何らかのbotです。

カテゴリ 件数
Search Engine Crawler(Google・Bing 等) 318
Webhooks(Slack 等) 304
AI Assistant 232
AI Crawler 123
Search Engine Optimization 122
AI Search 59
Feed Fetcher 58
その他 33

余談ですが、ClaudeBot(Anthropic)が /sitemap-index.xml を 1 日 3 回クロールしていました。自分が作成した Claude Code に関するページが Claude の学習データ候補としてクロールされているのは、不思議な感覚があります。

では何を気にすればよいのか

「93% 素通り」と聞くと怖く聞こえますが、過剰に恐れる必要はないと思っています。このサイトで実害がゼロだったように、構成を適切に選べば素通りしても被害は出ません。

むしろ現代の個人開発者が注意すべきは、WAF の素通りよりも WAF のログに現れないリスクだと思っています。
たとえば Supabase の RLS3(Row Level Security)の設定ミスは、Security Analytics を見ても検出できません。WAF がブロックするような攻撃ではなく、正規のリクエストとして認証されてしまうからです。新しい SaaS や PaaS を使うときは、設定のセキュリティをちゃんと理解してから公開するのが重要で、難しければ AI に相談しながら対策するのが現実的だと思っています。

一度 Security Analytics(WAF のログ)を確認してみることを勧めます。「自分のサイトにこんなスキャンが来ているのか」という実感は、抽象的なセキュリティの話よりずっと具体的なきっかけになります。私もダッシュボードを眺めていなければ、今回の気付きはなかったと思います。

まとめ

  • Cloudflare 無料プランのマネージドルールは WordPress 系の設定ファイル漏洩を対象にしたルールセットが中心で、.env や AWS credentials 等は素通りする
  • 攻撃 91 件のうちブロックできたのは 6 件(6.6%)。残り 85 件はオリジンまで届いていたが、実害はゼロだった
  • 実害がなかった理由は Cloudflare のおかげではなく、Astro + Cloudflare Workers という構成上、対象ファイルが存在しないため 404 が返るだけだったから
  • 現代の個人開発者が注意すべきは古典的な WAF 回避攻撃よりも、Supabase RLS のような WAF のログに現れない設定ミスだと思っている
  • まず Security Analytics を一度見てみると、見えていなかった実態が把握できる

参考

developers.cloudflare.com のアイコン
developers.cloudflare.com

GraphQL Analytics API

Query Cloudflare analytics data using GraphQL.

developers.cloudflare.com のアイコン
developers.cloudflare.com

Managed Rules

Deploy pre-configured managed rulesets to protect against common attacks.

developers.cloudflare.com のアイコン
developers.cloudflare.com

Analytics

View WAF analytics including Security Analytics and Security Events.

Footnotes

  1. Web Application Firewall の略。HTTP リクエストを検査し、攻撃パターンに一致するものをブロックするセキュリティ機能。

  2. Cloudflare が「正規のbot」として認定した自動クローラ。Google や Bing の検索クローラ、Slack の Webhook など。悪意あるスキャンbotとは区別される。

  3. Row Level Security の略。データベースの行レベルでアクセス制御を設定する機能。Supabase(PostgreSQL ベース)では RLS を有効化しないとすべてのデータに誰でもアクセスできてしまう。

理解度チェック

問題1: Cloudflareの無料プランのWAFが確実にブロックできた攻撃は主にどのようなものでしたか?

  • .envやAWS credentialsなどの環境変数・認証情報を狙った攻撃

    不正解もう一度考えてみましょう!

    これらのファイルに対する攻撃はWAFのルールに引っかからず、93%が素通りしてオリジンに到達していました。

  • SupabaseのRLS設定ミスを突くような攻撃

    不正解もう一度考えてみましょう!

  • WordPressの設定ファイル漏洩を狙った攻撃

    正解正解です!

    Cloudflareの無料プランで提供されるマネージドルールはWordPress向けのルールセットが中心であるため、wp-config.phpなどを狙った攻撃は確実にブロックされます。

  • 無差別に実行されるすべてのスキャンボットによるアクセス

    不正解もう一度考えてみましょう!

問題2: 著者のサイトでWAFを素通りした攻撃が多数あったにもかかわらず、実害がゼロだった本当の理由は何ですか?

  • AstroとCloudflare Workersベースの静的サイトであり、攻撃対象となるファイルが最初から存在しなかったため

    正解正解です!

    .envやAWS credentialsなどのファイルが物理的に存在しないアーキテクチャであったため、攻撃者がアクセスしても404エラーになるだけでした。

  • URLエンコードや拡張子偽装による攻撃手法が古いもので、無効化されていたため

    不正解もう一度考えてみましょう!

  • Cloudflareが認定した正規のbot(verified bot)からのアクセスしか来ていなかったため

    不正解もう一度考えてみましょう!

  • 攻撃の大半がCloudflareのネットワーク内で自動的に破棄されていたため

    不正解もう一度考えてみましょう!

関連記事

セキュリティ

「Webサービス公開前のチェックリスト」にあるレスポンスヘッダの内容を調べてみる

Webサービス公開前のチェックリストにあるレスポンスヘッダの意味が全くわからなかったので、どんなリスクから守ってくれるのかを調べてみました。この記事ではWebサービスを公開する前に必要なレスポンスヘッダの内容と設定しなかったときのリスクを知ることができます。

記事を読む
CloudflareCloudflareWorkers

Cloudflareのグローバルネットワーク上でヘッドレスChromeを実行するBrowser Rendering

Cloudflare Browser RenderingのREST APIを使って、WebページをMarkdownに変換するAPIを構築する方法を解説します。不要な要素の削除やリソース最適化など、実践的な実装例を紹介します。

記事を読む
CloudflareWorkersCloudflare

Notionの画像(S3)をCloudflare R2に格納する

Notionで作成されたマークダウンコンテンツには、Amazon S3に保存された画像へのリンクが含まれています。ブログ記事として公開する際に、これらの画像をCloudflare R2ストレージなどの外部ストレージに移行することで非公開ページの画像も表示することができます。この記事ではNotionのページに添付されている画像をCloudflare R2に格納する処理について解説します。

記事を読む