【超初心者向け】怪しいアクセスってどんなの?

はじめに

こんにちは。24 卒システムソリューション部のインフラエンジニア 2 年目の ぱる です。

早速ですが、皆さんはアクセスログというものをすぐにイメージできるでしょうか。
インフラエンジニアとしてアラート対応をしていたら毎日のように見る基本的なログの一つなのですが、1 年目のころは特に苦手意識が強くて嫌いでした。

ということで今回は、「アクセスログにどんなことが書いてあるのかわからない」「アクセスログの調査方法が分からない」「どんなアクセスが攻撃なのか判断できない」など、アクセスログにまだ馴染みのない方向けの記事にしようと思います。

※ どういう風に調査するかについての記事なので、調査のためのコマンドについては一切触れていないのですが、ページ最下部の参考サイトにも挙げているような優秀な記事がたくさんあるのでそちらをご覧いただければと思います!

アクセスログを知ろう

そもそもアクセスログって何のためにあるの?

Web サイトが重い、エラーが表示されて見れないという経験は、普通に生きていてもわりとあるかと思います。
アクセス増によるサーバへの負荷だけがこういった事象の原因となるわけではありませんが、アクセスログを調査することで「そもそもアクセスが影響しているのか」というところを確認できます。
原因の切り分けのためにも、アクセスログの出力は必須です。

いったんアクセスログを見てみる

いったん見てみます。
例えば、あるサイト(http://example.net)にアクセスしたとします。
そうすると、サーバ側には下記のような文がアクセスログとして出力されます

192.168.100.101 - - [1/Nov/2025:10:20:50 +0900] "GET /index.php HTTP/1.1" 200 1042 "http://example.com" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"

一見するとただの暗号のような文字列ですが、実は「いつ、誰が、どこから、何をしに来たか」という情報が、決まった順番で書かれているだけです。
ちょっと長いですが下記で分解してみます。

  1. 192.168.100.101元のクライアントのIPアドレス(この IP からアクセス来たよー)
  2. -クライアントの識別子(通常は使われないので - になります)
  3. -リクエスト送信者のユーザー名(認証が必要なページでアクセスしてきた人の名前。通常は - です)
  4. [1/Nov/2025:10:20:50 +0900]アクセスがあった日時(+0900 はUTCからの時差が9時間だよってこと)
  5. "GETHTTPメソッド(GET通信とか、POST通信とか…いろいろあります)
  6. /index.phpリクエストURI(サーバーに対して「このファイルが欲しい!」とお願いしているパスのこと)
  7. HTTP/1.1"HTTPのバージョン
  8. 200ステータスコード(200はリクエスト成功!の意味)
  9. 1042レスポンスバイト数(サーバーが返したデータの大きさ。単位はバイト)
  10. "http://example.com"リファラーURL(このページから リンクを辿って来たよ、という前のページのURL。http://example.net/index.php の前にいたページのこと)
  11. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" ユーザーエージェント(ブラウザやOSの情報。Chromeを使ってるのが分かる)

出力形式の設定方法

Web サーバーが出力するアクセスログは、絶対にこう!といった形式があるわけではなく、設定ファイルで「どの情報を、どの順番で記録するか」を自由に定義できます
基本的にこの設定は、サーバーの/etc配下などにある設定ファイルに記述しますが、使っているミドルウェア(ApacheやNginx)によって書き方は異なります。
下記、書き方の一例です。

Apache ver.

LogFormat "%{X-Forwarded-For}i %l %u [%t] \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Nginx ver.

log_format combined '$http_x_forwarded_for - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';

Apacheの例にある %{X-Forwarded-For}i 、Nginx の例にある $http_x_forwarded_for について少し触れておきます。

これは、初期設定では書かれていない項目ですが、これを書くことで前段にロードバランサーリバースプロキシなどがある環境でも、どの IP からアクセスが来たのかが分かるようになります
逆に、この設定が書かれていなければ、すべて前段にあるロードバランサーやリバースプロキシなどの IP しか書かれず、詳細な調査ができません。

要するに、設定ファイルへの書き方次第でログフォーマットは自由にカスタマイズできます。
書く順番を変えれば出力順も変わりますし、今回のように特別な値(ヘッダー情報)を追加で記録することもできます。

詳しいフォーマットの説明は以下の記事で詳しく書いてあるので、ぜひ見てみてください♪

【Apache】アクセスログの見方をやさしく解説!※ 2025年2月更新

【nginx】アクセスログの見方・設定・場所等を解説

クセスログを調査してみよう

アクセスログ調査するときはここ見たほうがいいかもね、みたいな超ざっくりとした調査方法です。
アクセス内容も調査方法も千差万別なので、単なる一例として見てみてください

前提:サーバの CPU LA(処理待ちの行列)が上昇している!調査しよう!

ステップ1:アクセス数の推移をみる

まず、サーバー負荷がアクセス起因になってそうかを確認するため、分ごとのアクセス数を集計してみます

   10 [29/Oct/2025:12:00
   10 [29/Oct/2025:12:01
   11 [29/Oct/2025:12:02
2529 [29/Oct/2025:12:03 <-- !?
5107 [29/Oct/2025:12:04 <-- !!
2714 [29/Oct/2025:12:05 <-- !!
   26 [29/Oct/2025:12:06
   30 [29/Oct/2025:12:07

12時03 分から 3 分間だけ急増しているのは、なかなか奇妙なアクセス増です。
CPU の負荷が上がった理由はこれのようです

ステップ2:怪しいアクセスを特定する

アクセスが急増していることが分かったら、次は「誰が、何をしに来たのか」を特定します。
ここからは、急増していた時間帯のログに絞って、怪しいところを探していきます。

① アクセス元 IP

特定の IP から頻繁にアクセスが来てないか調べます。

# アクセス数 IPアドレス
10143 192.0.2.115 <-- 突出して多い
    128 192.0.2.22
      62 192.0.2.88
      17 192.0.2.54

IP 検索サイトなどで IP 元の情報を調べ、日本人向けのサイトなのに海外 IP からのアクセスがめちゃくちゃ来てたら怪しいです。クローラーや攻撃の可能性が高そうですね。

② アクセス先パス (リクエストURI)

サイトのどのパスにアクセスが集中しているか見ます。
怪しげな IP に絞ってパスを見てみるとよりわかりやすいです。

# IP 192.0.2.115 のアクセス先 パス
105 /wp-login.php        <-- 怪しそう
  98 /xmlrpc.php           <-- 怪しそう
  42 /?author=1             <-- 怪しそう
  27 /wp-admin/admin-ajax.php
  15 /wp-config.php.bak <-- 怪しそう
  15 /wp-admin/profile.php
  14 /wp-content/plugins/file-manager/readme.txt

ここの「怪しい」「怪しくない」の判別が結構むずかしいので、一つずつ見てみます。
サイトをお店に例えて、正規のアクセス(URLを普通にポチッとする)を正面入り口、怪しいアクセス(WordPress などの管理画面に入ってやろうとする)を裏口に例えて考えてみましょう。

wp-login.php や xmlrpc.php (怪しい)
目的:  不正ログイン(総当たり攻撃)
例え: お店の「従業員専用の裏口」のドアノブを、IDとパスワードを片っ端から試してガチャガチャやっている状態

/?author=1 (怪しい)
目的: ユーザー名の特定
例え: 正面入り口から「IDが1番の従業員さんいますか?」と聞いて、従業員の名前(ログインのためのユーザー名)を盗み見しようとしている状態

wp-config.php.bak (怪しい)
目的: 機密情報の窃取
例え: お店の「金庫の暗証番号」(データベースのパスワードなど)が書かれたメモのバックアップファイル(.bak)が落ちてないか見に行っている状態

正規の機能として使われることがあるパス
admin-ajax.php (文脈次第で怪しい)・・・WordPressの正規機能(記事の自動保存、動的な処理など)。アクセス数が異常に多ければ、攻撃に悪用されている可能性もあり
wp-admin/profile.php (アクセス元 IP によっては怪しくない)・・・ログイン中のユーザーが自分のプロフィールを見る
plugins/.../readme.txt (下見の可能性)・・・プラグインのスキャン

上記は単なる一例ですが、こういった明らかに怪しいパスへのアクセスもわりと普通にあります

③ GET 通信と POST 通信

つらつらとパスについて話しましたが、そのパスに対してどういう通信をして情報を得ようとしたかというところも重要です。
よく見る「GET通信」と「POST通信」には触れておきたいと思います。

GET通信(イメージ:ハガキ)
目的: 「この情報ちょうだい!」とお願いするとき。(例:ページを表示する、/?author=1で情報を見る)
特徴: 送る情報がURLにくっつく(?author=1 みたいな感じ)。丸見えなので、大事な情報は送れません。

POST通信 (イメージ:封筒に入った手紙 )
目的:「この情報を受け取って!」とお願いするとき。(例:ログインする、フォーム送信)
特徴: 送る情報(IDやパスワード)を封筒に入れて隠して送ることができる。URL には情報が出ない

なぜ重要なのか
今回の調査例でいうと、/wp-login.php(裏口)への攻撃は、「IDとパスワード」という大事な情報を隠して送る必要があるので、絶対にPOST通信で行われます。
もしログを見て、wp-login.phpに対してGET通信がたくさん来ていたら、「これは攻撃じゃなくてスキャンかな」と判断できますし、
逆に大量のPOSTが来ていたら、「総当たり攻撃(ブルートフォース)かも!」と判断できるわけです

③ ステータスコード

サーバーがどう返事したかを見ます。

# アクセス数 ステータスコード
  6821 404 <-- 存在しないファイルへのアクセスが最多
    153 500 <-- サーバー内部でエラーが発生
    112 403 <-- アクセスが拒否されている
      35 200 <-- 正常なアクセス

4xx(Not Foundとか)や5xx(Internal Server Errorとか)が多発してたら、アクセスに失敗している形跡であるといえます。
4xxはまだWebサーバーが返せてますが、5xxはサーバーから応答不可を出す(=プログラムがエラーを吐いてる)ので、サーバーが重くなり負荷につながります

怪しいアクセスに対して 200 OK(正常)を返していたら…?

ここで注意したいのが、200 OK(リクエスト成功)です。
成功というのは、あくまで「サーバーが要求されたものを正常に返した」という意味で、「そのアクセスが安全だった」という意味ではありせん。
お店の例えで言うなら、404 は「金庫の暗証番号はここにはない」という空振りですが、200 は「金庫の暗証番号、はいどうぞ」と渡してしまったことを意味します。

ログイン攻撃(wp-login.php)のログの見方

POST /wp-login.php200 OK (ログイン失敗)
意味: IDかパスワードが違います。もう一度ログインページを表示しますね。
これが大量に続いていたら「総当たり攻撃の真っ最中だ」と判断できます。

POST /wp-login.php302 Found (ログイン成功)
意味: 認証OK!ダッシュボード(/wp-admin/)に転送(リダイレクト)します。
もし攻撃元の IP アドレスから 302 が返っていたら、それは「攻撃者に侵入された」ことを示す危険なサインといえます。

このように、怪しいパスへのアクセスで 200 OK や 302 Found が返っていたら、それは攻撃が成功し始めているサインかもしれないので、より注意深く調査する必要があります。

他にも、ステータスコードにもいろいろ細かに種類があるので、詳しい記事は下記をご覧ください♪

【これだけは覚えておきたい】おさらいと復習をかねてHTTPステータスコードのエラーを簡単に解説

【これだけは覚えておきたい】おさらいと復習をかねてHTTPステータスコードのエラーを簡単に解説

④ ユーザーエージェント

最後に、何を使ってアクセスしてきたかを見ます。

# ユーザーエージェントの例
"Mozilla/5.0 (compatible; DotBot/1.2; ...)"
"Mozilla/5.0 (... compatible; Google-Read-Aloud; ...)"

ログにbotcrawlerって書いてあるのは、プログラムによる自動アクセスです。Google などの有益なクローラーもいますが、悪質なクローラーもあります。
また、ここが変な文字列になってたり、特定のユーザーエージェントにアクセスが偏ってたら、攻撃っぽいなと判断する材料になります。

情報量が多くて疲れますね…
ざっくりですが以上のような情報を踏まえ、サーバー負荷の原因はアクセス起因なのか、どんなアクセスだと「怪しい」といえるのかを判断します。

怪しいアクセスはどう対処するの?

実際対処するとなると、お客様との合意も必要ですが、代表的な対処例を紹介しておきます。

① IP アドレスをブロックする (一番手っ取り早い)

調査で、特定のIPアドレス(例: 192.0.2.115)から異常な数のアクセスが来ていると分かったので、ここからのアクセスをブロックするが一番早いです。

ブロックの仕方は環境によって様々です。
Nginxなら conf ファイルに `deny 192.0.2.115;` と書いたり、Apache 環境なら .htaccess で制限をかけたりできます。OSのファイアウォールや、前段に WAF などがあればそこでブロックするもよしです。

② 特定のパスへのアクセスを制限する

攻撃者は「従業員専用の裏口(wp-login.phpなど)」を狙ってきます。 それなら、「裏口」へのアクセス自体を厳しく制限しておくことは必須です。

例えば、「wp-login.phpにアクセスしていいのは、自分の会社のIPアドレスだけ」という設定を Nginx の conf ファイルに入れます。
※バージョンによっても書き方が変わるので注意!

location = /wp-login.php {
# 自分のIPアドレスだけを許可
allow 1.2.3.4;
# それ以外は全部拒否
deny all;

# PHPへの処理も忘れずに
include fastcgi_params;
fastcgi_pass unix:/run/php-fpm/www.sock;
}

不特定多数の IP からアクセスされたくないパス(例えば、攻撃に使われるだけの xmlrpc.php など)については、そもそも deny all; で絶対に見せないようにするのも有効です。

まとめ

いかがでしたでしょうか。

大嫌いだったアクセスログでしたが、1年間眺めているとだんだんと読めるようになるものですね。
アクセスログの調査に躓いている人のほんの手助けになればうれしいです

最後までお読みいただきありがとうございました🌷

参考サイト:
Linuxのアクセスログを確認する方法|場所・見方・活用例をわかりやすく解説
ログを読みやすくするときに使うコマンド「grep, awk」について解説する
【事例】WordPressサイト改ざんの復旧と対策を行いました
HTTPリクエストの基本 GETとPOSTの違いを学ぶ
WordPressのセキュリティ対策として管理画面にアクセス制限を設定

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
1
読み込み中...
1 票, 平均: 1.00 / 11
23
X facebook はてなブックマーク pocket

この記事をかいた人

About the author

ぱる

24卒 システムソリューション部
将来の夢は、少し大きな部屋を借りて猫を飼うことです