+n 制作ログ制作中の気づきや学びを記録

HOME > BLOG > ブログのPVが増えたので16日間そっとしておいたら、読者ではなく脆弱性探索Botが育っていました

ブログのPVが増えたので16日間そっとしておいたら、読者ではなく脆弱性探索Botが育っていました

制作ログBotCloudflareWordPressセキュリティ

当サイトとはリンクを繋いでいませんが、趣味で運営している個人ブログでPVが急増しました。
アクセスを紐解くと、確かに閲覧ユーザーは増加していましたが、それ以外に来ては欲しくないBotが大量にアクセスしていることがわかりました。
今回は、Cloudflareで見えた大量Botアクセスと対策について紹介します。

発端はCloudflareで月間PVが1万を超えたこと

個人ブログは、GAのほかにCloudflareを導入しています。
8月6日にCloudflareから「10,000 pageviews」の通知が届きました。この時点ではアクセスが増えたのだと思い、そのまま様子を見ることにしました。その後、8月22日に改めてアクセス状況を確認。8月1日〜22日のPage Viewsを確認すると、96.22k(約9.6万)まで増加していました。

GA4も確認すると、確かに7月下旬から実ユーザーのアクセスは増加傾向にあり、記事によっては7〜10分程度閲覧されていました。そのため「アクセス増加のすべてがBot」というわけではありませんでしたが、Cloudflareの数字とは大きな乖離があることがわかりました。

当初は、自分自身の更新作業や閲覧もCloudflareに含まれているのではと考えました。しかし、直近ではブログをほとんど触っていなかったため、別の原因を調査することにしました。

そこで、Page Viewsだけでなく、Cloudflareで確認できるHTTPリクエストのログを調べてみました。

User-Agentを見ると「curl/8.7.1」が大量発生

Cloudflare Web Analyticsで詳細を確認すると、

curl/8.7.1 が大量発生

していました。
なお、ブラウザ/User-Agentを確認したところ、

curl/8.7.1:直近24時間で約1.83k

という大量リクエストを発見しました。
IPなどを照合すると、IP位置情報上ではフランスと判定されるアクセスが大量に発生していました。
通常のブラウザ閲覧ではなく、cURLを利用した自動プログラム・Botによる通信の可能性が高いと判断しました。

アクセス先を調べると、かなり怪しかった

念の為、Top Pathsやリクエストを見ると、通常の記事巡回とは明らかに異なるURLが並んでいました。
代表例は、

/system-diagnostics
/wp-json/gravitysmtp/v1/tests/mock-data
/apps/vendor/phpunit/phpunit/phpunit
/admin/threadz
/opcache-status/opcache.php
/host.key
/bugs/verify.php
/cloudfoundryapplication
/tool/view/phpinfo.view.php
/.docker/config.json
/api/v2/swagger.json

さらに、

.env
wp-config.php.bak

など、設定情報・認証情報が誤って公開されていないか探すようなアクセスも確認できました。

wp2shell 

といった明らかに警戒すべき名称もログも登場したため、サイトコンテンツを読むBotというより、WordPressやサーバーの既知の弱点・設定ファイル・バックアップファイルなどを自動探索するスキャンBotと考えました。

結果として、このアクセスのほとんどは失敗に終わっています。
なお、該当IPのHTTPステータスを見ると、

2xx 7
3xx 14
4xx 約1.84k

ほぼすべて4xx。
正常応答した7件も、

/robots.txt 4
/ 2
/wp-json/oembed/1.0/embed 1

だけでした。
正常応答したのは、robots.txt、トップページ、WordPress標準系REST APIのみでした。探索対象となっていた怪しいファイルは設置しておらず、今回確認したログ上では、それらが取得された形跡もありませんでした。

対策として海外アクセスを制限

Bot大量アクセスが原因とは断言できませんが、閲覧ユーザーが増加したこともあり同時期にWordPress管理画面で、

  • 表示が崩れる
  • リロードしているような挙動になる

などの不調も発生していたため、対策を立てることにしました。

該当ブログが、サイトが基本的に日本国内向けで海外ユーザー向けではなかったためCloudflareで海外からのアクセスを制限した方が手っ取り早い解決策と考え、セキュリティールールを変更することにしました。

すると、翌日のリクエスト数が約1.87kまで減少しました。
ですが、海外Bot自体はその後もアクセスを試みており、リクエストの半分以上が4xxになる状態になっています。
また、数日前はフランスやEU圏と判定されるIPアドレスからがメインでしたが、その他の国からも同様のアクセスが確認されました。

今回のサイトは国内向けで海外からの利用を想定していなかったため、この対応を選びました。
ただし、海外アクセスの一律制限は正規Botや必要なサービスまで遮断する可能性があります。サイトの用途に応じたルール設定が必要です。

今回分かったこと

Botを放置していたら、月間100万PVも夢ではなかったかもしれません。
もちろん、まったく嬉しくない100万PVですが。

ですが、望まないアクセスが増えればサーバーへの負荷にもつながります。
今回、「公開されているWebサイトには、本当に自動スキャンBotが大量に来ている」ことを実際のログで確認できたことは、良い経験になりました。

そして、 .env や wp-config.php.bak を「URLを誰にも教えていないから大丈夫」と公開領域へ置くのが危険な理由も、実データとして体感することができ、CloudflareのPV ≠ 人間によるPV ということも改めて確認することができました。

今後のGA・Cloudflareを導入しているブログ運営では、

  • GA4 → 実ユーザーの閲覧・行動を見る
  • Search Console → Google検索を見る
  • Cloudflare → Botを含む通信や異常アクセスを見る

くらいに役割を分けて見るのが良さそうだと思い知らされた出来事でした。