WordPressログ解析とhtaccessによる不正アクセス防御策

WordPressのアクセスログ約247万件を解析し、検出された攻撃パターンとサーバー防御策を解説します。

はじめに

公開中のWebサイトは、日常的にボットや脆弱性スキャナーによる攻撃通信に晒されています。これらを放置すると、情報漏洩やサーバーの過負荷停止に直結します。

本記事では、約247万件のアクセスログ解析から判明した攻撃手口と、Apache(.htaccess)による具体的な遮断設定手順を解説します。

アクセスログ解析結果と検出された攻撃手口

エックスサーバー上のWordPress環境において、蓄積されたアクセスログをストリーミング走査して集計しました。集計の結果、一般ユーザーの通常閲覧に混ざり、多種多様な攻撃通信が継続的に届いていました。

攻撃・通信種別 検出件数 主なリクエスト対象 サーバー応答
キャッシュ無効化DoS 267,903件 PURGE /各コンテンツURI 429 Too Many Requests / 200 OK
機密ファイル・設定探索 51,307件 /.env, /.git/config, wp-config.php.bak 404 Not Found / 500 Internal Server Error
パストラバーサル・LFI 4,027件 ../../wp-config.php, /etc/passwd 404 Not Found / 301 Moved
WebShell・バックドア探索 598件 /alfa.php, /wso.php, /shell.php 404 Not Found
XML-RPCブルートフォース 1,262件 POST /xmlrpc.php 200 OK(227バイト: 認証拒否)

ログから検出された危険度の高い通信について、記録例と攻撃の意図を分析します。

キャッシュ無効化DoS(PURGEメソッド乱発)

特定のIPアドレスから、キャッシュクリア用のPURGEメソッドが短時間に連続送信されたログです。

85.131.213.XXX - - [01/Nov/2026:14:22:10 +0900] "PURGE /category/it-pass/ HTTP/1.1" 200 42 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
85.131.213.XXX - - [01/Nov/2026:14:22:11 +0900] "PURGE /archives/1054 HTTP/1.1" 200 42 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
85.131.213.XXX - - [01/Nov/2026:14:22:12 +0900] "PURGE / HTTP/1.1" 429 203 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
85.131.213.XXX - - [01/Nov/2026:14:22:12 +0900] "PURGE /archives/2088 HTTP/1.1" 429 203 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"

PURGEは、リバースプロキシやVarnish等のキャッシュを破棄するためのメソッドです。一般の閲覧者は使用しません。キャッシュを強制消去してオリジンサーバーへ処理を集中させ、過負荷を引き起こす狙いがあります。ログ後半ではレートリミットが機能し、HTTP 429で制限されています。

機密ファイル・設定情報探索

環境変数やGit管理フォルダ、バックアップファイルを無差別に探査したログです。

195.178.110.XXX - - [03/Nov/2026:08:15:22 +0900] "GET /.env HTTP/1.1" 404 153 "-" "Mozilla/5.0 (compatible; Nmap Scripting Engine)"
195.178.110.XXX - - [03/Nov/2026:08:15:23 +0900] "GET /.git/config HTTP/1.1" 404 153 "-" "Mozilla/5.0 (compatible; Nmap Scripting Engine)"
195.178.110.XXX - - [03/Nov/2026:08:15:24 +0900] "GET /wp-config.php.bak HTTP/1.1" 404 153 "-" "Mozilla/5.0 (compatible; Nmap Scripting Engine)"
195.178.110.XXX - - [03/Nov/2026:08:15:25 +0900] "GET /wp-config.php.old HTTP/1.1" 404 153 "-" "Mozilla/5.0 (compatible; Nmap Scripting Engine)"
195.178.110.XXX - - [03/Nov/2026:08:15:26 +0900] "GET /backup.sql HTTP/1.1" 404 153 "-" "Mozilla/5.0 (compatible; Nmap Scripting Engine)"

開発時の一時ファイルが残存している場合、データベース認証情報や秘密鍵が漏洩します。ログ上はすべてHTTP 404となっており、漏洩は発生していません。

パストラバーサル・LFI(ローカルファイルインクルード)試行

ディレクトリ遡及記号(../)を用い、サーバー内の重要ファイルを不正取得しようとするログです。

34.125.88.XXX - - [04/Nov/2026:19:40:12 +0900] "GET /wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php?cmd=get&target=../../wp-config.php HTTP/1.1" 404 153 "-" "python-requests/2.28.1"
34.125.88.XXX - - [04/Nov/2026:19:40:14 +0900] "GET /index.php?file=../../../../../../etc/passwd HTTP/1.1" 404 153 "-" "python-requests/2.28.1"

既知の脆弱性を持つプラグイン経路やOSの設定ファイル(/etc/passwd)を狙っています。対象プラグインが未導入のため、全件404で遮断されています。

WebShell・バックドア探索

改ざん被害に遭ったサイトで設置されやすい不正ファイル(WebShell)への探索ログです。

45.148.10.XXX - - [02/Nov/2026:03:11:05 +0900] "GET /wso.php HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
45.148.10.XXX - - [02/Nov/2026:03:11:06 +0900] "GET /alfa.php HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
45.148.10.XXX - - [02/Nov/2026:03:11:07 +0900] "GET /c99.php HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
45.148.10.XXX - - [02/Nov/2026:03:11:08 +0900] "GET /shell.php HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"

事前に侵入経路が確保されていないか外部から調査しています。該当ファイルは存在しないため、404で応答しています。

XML-RPCブルートフォース攻撃

XML-RPCエンドポイントに対し、複数認証を一度に試行するリクエストのログです。

85.131.213.XXX - - [05/Nov/2026:22:04:31 +0900] "POST /xmlrpc.php HTTP/1.1" 200 227 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
85.131.213.XXX - - [05/Nov/2026:22:04:33 +0900] "POST /xmlrpc.php HTTP/1.1" 200 227 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
85.131.213.XXX - - [05/Nov/2026:22:04:35 +0900] "POST /xmlrpc.php HTTP/1.1" 200 227 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"

HTTP 200で成功しているように見えますが、応答サイズは227バイト固定です。これはWordPressがXML形式で認証失敗エラーを返した標準仕様です。ログイン試行は防御されています。

.htaccessを用いた不正アクセスの遮断

検出された攻撃パターンを未然に防ぐため、Apacheの設定ファイル(.htaccess)を編集して入口で通信を遮断します。

手順1: 不正なHTTPメソッドを遮断

通常のWeb閲覧で使われない特殊メソッドを拒否します。

  1. Webサーバーのルートディレクトリにある .htaccess を開きます。
  2. 以下のディレクティブを追記します。
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} ^PURGE$
    RewriteRule .* - [F,L]
</IfModule>

PURGEメソッドによるリクエストに対して、即座に403 Forbiddenを返却します。

手順2: XML-RPCへのアクセスを完全停止

外部連携機能を使用しない場合は、xmlrpc.phpへの通信を完全に閉塞します。

  1. .htaccess に以下のブロックを追記します。
<Files xmlrpc.php>
    Require all denied
</Files>

Apache 2.4標準の Require all denied を記述し、不正なログイン試行をサーバー負荷なく破棄します。

手順3: 機密ファイルやバックアップの外部参照を禁止

環境設定ファイルやバックアップファイルへの直接アクセスを一括拒否します。

  1. 以下のFilesMatch設定を追加します。
<FilesMatch "^(\.env|\.git|\.ht|wp-config\.php\.|\.bak|\.old|\.sql)">
    Require all denied
</FilesMatch>

拡張子や接頭辞を正規表現で指定し、残存した機密情報ファイルの漏洩リスクを遮断します。

手順4: ログインエンドポイントを保護

管理画面のURLを変更し、不正アクセスを排除します。

  1. SiteGuard WP Plugin等を用いて管理ログインURLをリネームします。
  2. .htaccess に変更後の書き換えルールを適用します。
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteRule ^wp-signup\.php 404-siteguard [L]
    RewriteRule ^wp-activate\.php 404-siteguard [L]
    RewriteRule ^login_custom(.*)$ wp-login.php$1 [L]
</IfModule>

標準のwp-login.phpへの直接アクセスを遮断し、攻撃用ボットの標的から外します。

親ドメインの一括制御によるセキュリティ管理の効率化

マルチドメインやサブドメインを運用している場合、共通の防御設定は親ドメインのルートにある .htaccess に集約できます。

個別のサブディレクトリごとに設定ファイルを分散管理すると、更新漏れが発生します。最上位のディレクトリで一括定義することで、全配下のサイトに一貫したセキュリティ基準を継承できます。

ただし、下位階層の .htaccess で RewriteEngine On が再宣言されると、親のRewriteルールが上書きされる仕様があります。必要に応じてInheritオプションを指定し、継承関係を維持します。

関連ページ

【WordPress超入門】初心者がウェブサイトを作成する方法を丁寧に解説
## WordPressの基礎* (* (* (* 管理画面のユーザ名とパスワードの設定* 「キャッチフレーズ」(HPのタイトルの説明書き)の設定* パーマリンク* 「Wordpress」の管理画面への切り替え* (* 「cocoon(コク...

コメント