「サイトが改ざんされました」
ある朝、クライアントからのその一本の電話で、私の血の気は一気に引きました。フリーランスとして独立したての頃、まだ経験も浅く、セキュリティに対する意識もどこか他人事だったのです。納品したサイトは問題なく動いていましたし、まさか自分の作ったサイトが、と。慢心があったのだと思います。
慌ててサーバーにログインし、ファイルを確認すると、見慣れないPHPファイルが大量に設置され、トップページには不気味なドクロの画像が。頭が真っ白になりながらも、バックアップからなんとか復元し、クライアントには平謝り。幸い、大きな実害が出る前だったことと、誠心誠意対応したことで許してもらえましたが、あの時の胃がキリキリするような感覚と、プロとしての自信が木っ端微塵に砕かれた屈辱は、今でも鮮明に覚えています。
原因は、当時流行していたプラグインの脆弱性を突かれたことでした。しかし、本当の原因は、私がサイトの「悲鳴」を聞き逃していたことにあります。
その悲鳴が記録されていたのが、サーバーログです。
後からログを解析してみると、攻撃が実行される数日前から、海外のIPアドレスから怪しいアクセスが集中していました。特定のファイルに対して、何度も何度も、執拗に。もし、私があの時、ログを見る習慣さえ持っていれば、攻撃の「兆候」に気づけたはずでした。IPをブロックする、脆弱性のあるプラグインを停止する、といった対策を取る時間があったはずなのです。
サーバーログ。それは、ただの無味乾燥なテキストファイルではありません。あなたのサイトが日々どんな訪問者と出会い、どんな危険に晒されているかを記録した、生々しい航海日誌です。多くの人は、この宝の山の価値に気づかず、あるいは「難しそう」という理由で見て見ぬふりをしています。
この記事は、かつての私のように、セキュリティをどこか他人事だと感じているあなたにこそ読んでほしい。サーバーログの中から攻撃のサインを読み解き、サイトを未然に守るための、実践的な監視術を伝授します。難しい話は抜きです。私の失敗談も交えながら、現場で使える知識だけを、分かりやすく解説していきます。さあ、あなたのサイトの悲鳴を聞き逃さないための第一歩を、ここから始めましょう。
ログファイルは宝の山!まずは基本の「き」を知ろう
さて、私の苦い思い出話から始まってしまいましたが、ここからは具体的に「じゃあ、どうやってログを見ればいいの?」という話をしていきましょう。その前に、まずはログファイルの基本について、少しだけ頭に入れておいてください。
サーバーログって、そもそも何者?
サーバーログというのは、その名の通り「サーバーの活動記録」です。あなたのサイトが置いてあるコンピューター(サーバー)で起こった出来事が、時系列で延々と記録されているテキストファイル、とイメージしてください。
誰かがサイトにアクセスすれば、「〇時〇分、このIPアドレスの人が、このページを見に来ましたよ」と記録されます。サイトの表示で何かエラーが起これば、「〇時〇分、このプログラムのこの部分でエラーが発生しましたよ」と記録される。まるで、休むことなく働き続ける、超真面目な書記さんのような存在です。
この書記さんが書き溜めた記録を読み解くことで、私たちはサイトの健康状態をチェックしたり、トラブルの原因を突き止めたり、そして、今回のテーマである「攻撃の兆候」を発見したりできるわけです。
なぜログ監視が最強の防御になるのか
セキュリティ対策というと、WAF(Web Application Firewall)を導入したり、セキュリティープラグインを入れたり、といった「防御壁」をイメージする人が多いかもしれません。もちろん、それらは非常に重要です。しかし、どんなに強固な壁を作っても、それを乗り越えようとする攻撃者は後を絶ちません。
ログ監視は、そうした「壁を乗り越えようとする動き」そのものを捉えることができる、数少ない手段なのです。例えるなら、城壁に設置された監視塔のようなもの。敵が城壁に取り付こうと準備している段階や、壁の一部を壊そうとカンカンやっている段階で、いち早くその動きを察知できます。
攻撃が成功してしまってからでは、対応は後手に回ります。被害の復旧、原因の調査、顧客への謝罪…。考えるだけでもゾッとします。しかし、ログ監視で兆候を掴めば、先手を打てる。これほど強力な防御策はないと、私は本気で思っています。
ログファイルはどこにある?主な種類と見方
「ログが大事なのは分かったけど、どこにあるんだ?」という話ですよね。これは、あなたが使っているサーバーの種類(Apache、Nginxなど)や、レンタルサーバーの会社によって少しずつ違うので、一概に「ここ!」とは言えないのがもどかしいところです。
ただ、多くの場合は、サーバーの管理画面(PleskやcPanelなど)からログファイルの場所にアクセスできたり、ダウンロードできたりするはずです。「サーバーログ」「アクセスログ」みたいなメニューを探してみてください。分からなければ、レンタルサーバーのマニュアルやサポートに聞くのが一番早いです。
そして、サーバーログにはいくつか種類があるのですが、最低限、以下の2つは絶対に覚えておいてください。
| ログの種類 | 主な内容 | 役割 |
|---|---|---|
| アクセスログ | 誰が、いつ、どのファイルにアクセスしたかの記録 | サイトの利用状況の分析、不正アクセスの追跡 |
| エラーログ | PHPエラーやサーバー内部のエラーの記録 | サイトの不具合の原因特定、攻撃によるエラーの検知 |
アクセスログは、あなたのサイトへの訪問者全員の足跡です。これを分析することで、「最近、やたらとログインページにアクセスしてくる怪しいヤツがいるな…」とか、「存在しないはずのファイルを探し回ってるヤツがいるぞ…」といった、攻撃の準備段階の動きを捉えることができます。
一方のエラーログは、サイトの悲鳴そのものです。プログラムのバグで出ることも多いですが、攻撃者がサイトの弱点を探ろうとして、わざとエラーを引き起こしている場合もあります。普段は見かけないようなエラーが急に増えだしたら、それは何かのサインかもしれません。
まずは、自分のサーバーのどこにこれらのログがあるのかを確認し、一度でいいから中身を覗いてみてください。最初は意味不明な文字列にしか見えないかもしれません。しかし、それがあなたのサイトを守るための第一歩になるのです。
ログに潜む攻撃のサインを見抜け!具体的な監視ポイント
ログの場所と種類が分かったら、いよいよ実践編です。膨大なログの中から、どうやって攻撃のサインを見つけ出すのか。ここでは、私が実際に普段からチェックしている、特に重要な監視ポイントを5つ紹介します。これだけ押さえておけば、大抵の兆候は捉えられるはずです。
1. ログイン試行の嵐(ブルートフォース攻撃)
これは最も古典的で、そして今なお多い攻撃の兆候です。WordPressのログインページ(wp-login.php)に対して、短時間に大量のアクセスが特定のIPアドレスから来ていたら、ほぼ間違いなくブルートフォース攻撃(総当たり攻撃)を仕掛けられています。
▼ アクセスログのチェックポイント
192.0.2.1 - - [06/Nov/2025:10:20:01 +0900] "POST /wp-login.php HTTP/1.1" 200 4041 "-" "Mozilla/5.0 (...)"
192.0.2.1 - - [06/Nov/2025:10:20:02 +0900] "POST /wp-login.php HTTP/1.1" 200 4041 "-" "Mozilla/5.0 (...)"
192.0.2.1 - - [06/Nov/2025:10:20:03 +0900] "POST /wp-login.php HTTP/1.1" 200 4041 "-" "Mozilla/5.0 (...)"
こんなログが、同じIPアドレスから何十、何百と続いていたら要注意です。POST /wp-login.php というのが、まさにユーザー名とパスワードを送信してログインを試みている記録。攻撃者は、辞書にある単語やよく使われるパスワードを片っ端から試して、なんとか侵入しようとしているのです。
私のクライアントのサイトでも、海外のIPから1分間に数百回のログイン試行があったことがあります。すぐにそのIPをサーバーのファイアウォールでブロックして事なきを得ましたが、気づかなければ突破されていたかもしれません。
2. 存在しないファイルを探し回る訪問者(脆弱性スキャン)
攻撃者は、いきなり攻撃を仕掛けてくるわけではありません。まずは、あなたのサイトにどんな「弱点」があるかを探るために、偵察活動を行います。その典型的な行動が、脆弱性があることで知られている古いプラグインやテーマのファイルを探し回ることです。
▼ アクセスログのチェックポイント
198.51.100.5 - - [06/Nov/2025:11:30:15 +0900] "GET /wp-content/plugins/super-old-plugin/readme.txt HTTP/1.1" 404 1234 "-" "-"
198.51.100.5 - - [06/Nov/2025:11:30:16 +0900] "GET /wp-content/themes/some-vulnerable-theme/info.php HTTP/1.1" 404 1234 "-" "-"
ログを見て、404 Not Found(ファイルが見つかりません)というエラーが、特定のIPアドレスから、しかも明らかに怪しいプラグインやテーマのパスに対して多発していたら、それは脆弱性スキャンを受けている可能性が高いです。「このサイト、あの古いプラグイン使ってないかな?使ってたらラッキー!」ってな具合で、手当たり次第に弱点を探しているのです。
3. 設定ファイルへの不審なアクセス
wp-config.php。このファイル名にピンと来たら、あなたはもう初心者ではありません。そう、WordPressのデータベース接続情報や認証キーなどが書かれた、サイトの心臓部とも言える超重要な設定ファイルです。
当然、このファイルは外部から直接アクセスできないように設定されているべきなのですが、攻撃者はサーバーの設定ミスを期待して、ダメ元でアクセスを試みてくることがあります。
▼ アクセスログのチェックポイント
203.0.113.10 - - [06/Nov/2025:12:05:40 +0900] "GET /wp-config.php HTTP/1.1" 403 404 "-" "-"
もし、こんなログを見つけたら、即座にそのIPアドレスをブロックすべきです。wp-config.phpを直接狙ってくるなんて、プロの泥棒が金庫の場所を知っていて、ピッキングしようとしてるようなものですからね。
4. 見慣れない国からのアクセス
あなたのサイトが、日本人向けのサービスやブログなら、主なアクセス元は当然、日本国内のはずです。それなのに、ある日突然、全く関係のない海外の国からのアクセスが急増していたら、それは何かの兆候かもしれません。
もちろん、海外在住の日本人が見てくれている可能性もあるので、一概に「海外IP=悪」と決めつけるのは早いです。しかし、明らかに攻撃的な動き(例えば、前述のログイン試行や脆弱性スキャン)とセットになっていたら、警戒レベルを上げるべきです。
IPアドレスから国を特定するツールはWeb上にたくさんあるので、怪しいIPを見つけたら一度調べてみるといいでしょう。「このIP、ロシアからだ…」「こっちは中国か…」なんてことが分かると、より具体的に危険を察知できます。
5. エラーログの急な増加
最後に、エラーログです。普段は静かなエラーログが、ある時から急に騒がしくなったら、それはサイトが攻撃を受けているサインかもしれません。
▼ エラーログのチェックポイント
[Thu Nov 06 14:10:05 2025] [error] [client 198.51.100.5] script '/var/www/html/sql-injection-test.php' not found or unable to stat
これは、SQLインジェクションという攻撃を試みた結果、エラーが出ている例です。攻撃者は、データベースを不正に操作しようとして、様々なパターンの攻撃コードを送りつけてきます。その結果、予期せぬエラーが大量に発生することがあるのです。
PHPの文法エラーや、特定のファイルが見つからないというエラーが、特定のIPアドレスから、短時間に集中して記録されていたら、それはあなたのサイトが「健康診断」と称した精密検査(つまり攻撃)を受けている真っ最中だということです。
これらのポイントを意識してログを眺めるだけで、今まで見えなかったものが見えてくるはずです。最初は大変かもしれませんが、慣れてくれば、ログの「ノイズ」の中から、ヤバい「シグナル」を嗅ぎ分けることができるようになりますよ。
ログ監視を効率化する!私の愛用ツールとテクニック
ここまで読んで、「ログの重要性は分かったけど、あの膨大なテキストを毎日目で追うなんて無理!」って思った正直なあなた、正解です。私だってそんな苦行はやりたくありません。
幸い、私たちには強力な武器があります。ログ監視を効率化し、異常を自動的に見つけ出してくれるツールたちです。ここでは、私が実際に現場で愛用している、コマンドラインの黒い画面で使うツールと、WordPressの管理画面から使えるお手軽なプラグインの両方を紹介しましょう。
黒い画面は友達さ!コマンドラインツール
サーバーにSSHでログインして、黒い画面(コマンドライン)を叩けるなら、絶対にこっちを使うべきです。最初はとっつきにくいかもしれませんが、慣れればこれほど強力で柔軟なツールはありません。
tail: ログをリアルタイムで追いかける
tailコマンドは、ファイルの末尾を表示するコマンドです。特に-fオプションを付けて実行すると、ファイルに新しい行が追記されるたびに、リアルタイムでその内容を表示してくれます。まさに、監視塔の見張り番にうってつけの機能です。
# アクセスログをリアルタイム監視
tail -f /var/log/httpd/access_log
# エラーログをリアルタイム監視
tail -f /var/log/httpd/error_log
これを実行したまま放置しておけば、サイトへのアクセスや発生したエラーが、目の前を流れていきます。怪しい動きがあった時に、すぐに気づくことができます。
grep: 大量のログから特定の文字列を探し出す
grepは、指定した文字列が含まれる行だけを抽出してくれる、ログ分析の必須コマンドです。例えば、特定のIPアドレスからのアクセスだけを見たい時や、ログイン試行のログだけを抜き出したい時に絶大な威力を発揮します。
# 特定のIPアドレス(203.0.113.10)のアクセスだけを抽出
grep '203.0.113.10' /path/to/access_log
# ログイン試行(wp-login.phpへのPOST)のログを抽出
grep 'POST /wp-login.php' /path/to/access_log
私はよく、tail -fとgrepを組み合わせて使います。リアルタイムで流れてくるログの中から、怪しいキーワード(wp-login.phpとか、特定のプラグイン名とか)を含む行だけをハイライト表示させるのです。こうすれば、膨大なログの中から異常を効率的にあぶり出せます。
WordPressプラグインでお手軽監視
「黒い画面はちょっと…」というあなたには、WordPressのプラグインがおすすめです。管理画面からインストールするだけで、ログの監視やセキュリティ対策を自動化してくれる優れものがたくさんあります。
- Wordfence Security: もはや説明不要の、超定番セキュリティー統合プラグインです。ファイアウォール機能が有名ですが、ログイン試行の失敗を記録したり、怪しいアクセスをブロックしたり、ファイルの改ざんを検知したりと、ログ監視の観点でも非常に高機能。無料版でも十分すぎるほどの働きをしてくれます。
- SiteGuard WP Plugin: 国産プラグインで、日本語の分かりやすさが魅力です。特に、ログインページのURLを変更したり、画像認証(キャプチャ)を追加したりする機能が秀逸で、ブルートフォース攻撃対策に大きな効果を発揮します。ログインに失敗した履歴を記録してくれるので、攻撃の兆候も掴みやすいです。
- WP-STATISTICS: 厳密にはセキュリティープラグインではありませんが、どんなIPアドレスが、どのページに、どの国からアクセスしているかを、WordPressの管理画面上でグラフィカルに表示してくれます。怪しい国からのアクセスが急増していないか、といった全体像を把握するのに役立ちます。
私個人の意見としては、コマンドラインツールとプラグインは、どちらか一方ではなく、両方使うのがベストだと思っています。プラグインで基本的な防御と監視を自動化しつつ、何かあった時にはコマンドラインで深く掘り下げる。この二段構えが、あなたのサイトをより強固に守ってくれるはずです。
ログ監視は習慣だ。サイトを守るための最後の砦
長々と語ってきましたが、私が一番伝えたいことは、たった一つです。
「サーバーログを見ることを、歯磨きと同じレベルの『習慣』にしよう」
最初は面倒かもしれません。意味が分からないかもしれません。でも、毎日じゃなくてもいい、週に一度でもいいから、ログを覗く時間を作ってみてください。そうすれば、あなたのサイトの「平熱」がどんな状態か、だんだんと肌感覚で分かってきます。そして、いざという時に「あれ、いつもと違うな」という微かな違和感、つまり攻撃の兆候に気づけるようになるのです。
私が昔経験した、あのサイト改ざんの悪夢。あれは、技術が足りなかったから起きたのではありません。サイトへの「関心」が足りなかったから起きたのだと、今は思います。自分のサイトがどんな状況に置かれているか、無関心だったことへの罰だったのです。
この記事で紹介した監視ポイントやツールは、あくまであなたの武器でしかありません。その武器を手に取り、見張り台に立つのは、他の誰でもない、サイトの管理者であるあなた自身です。
ログは、あなたのサイトが決して裏切らない、最も正直なパートナーです。その声に耳を傾け、サイトを脅威から守り抜いてやってください。あなたなら、きっとできますよ。
WordPressのセキュリティ、不安に思っていませんか?
「自分のサイトは大丈夫だろうか…」
「何から手をつければいいか分からない…」
もしあなたが少しでもそう感じているなら、専門家によるセキュリティ診断を受けてみることを強くお勧めします。
上記のサイトでは、WordPressのプロがあなたのサイトの脆弱性を無料で診断してくれます。問題が見つかれば、具体的な対策方法についてもアドバイスをもらえます。手遅れになる前に、一度プロの目でチェックしてもらい、安心を手に入れましょう。