本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。
WordPressの不正アクセス対策|wp-login.php・xmlrpc.phpをアクセスログで監視する check_all.sh の作り方

ターミナル仕事術・実践編 | UNIX Cafe
wp-login.php・xmlrpc.php への不審なアクセスを、ログから見つける手順
WordPress の不正アクセス対策では、wp-login.php や xmlrpc.php へのアクセスログを継続的に確認するだけでも、攻撃の気配をかなり早い段階でつかめます。
大げさな監視サービスを入れなくても、まずは小さな確認手順を持つことが重要です。
この記事では、WordPress のアクセスログから wp-login.php / xmlrpc.php への不審なアクセスだけを抜き出し、怪しいIPを見つけるための check_all.sh の作り方をまとめます。
あわせて、抽出したIPをどう確認し、どこまで対処するかという初期運用の流れも整理します。
やることはシンプルです。ログを取得し、対象URLだけに絞り、自分のアクセスを除外し、回数順に並べる。そうした最小構成だけでも、WordPress の不正アクセス対策として十分実用的な監視の土台になります。
ログの源泉: 24時間 365 日、世界中からのアクセスを記録し続けているのは、サイトが動いているレンタルサーバーです。ここには膨大な「生データ」が蓄積されています。
解析の司令室: 手元の PC やノート環境は、そのデータを「知恵」に変えるための拠点です。
接続: 必要に応じて VPN やアクセス制御を使いながら、サーバーにある最新のログを手元へ引き寄せ、解析の準備を整えます。
高速処理: 自作スクリプト check_all.sh を実行し、膨大なログを素早く走査します。
抽出: grep / awk / sort を組み合わせ、無数のアクセスから「不審な IP」だけを炙り出します。
正体判別: 抽出された IP を whois で検証し、有名クラウドか、あるいは悪意あるスキャンかを、人間が判断します。
反映: 拒否すべき IP をそのまま即遮断するのではなく、まずは whois や ASN 情報で確認し、必要に応じて WAF やサーバー設定、補助的に .htaccess へ反映します。
「抽出したIPをどうやって.htaccessに書けばいいの?」という方は、こちらの記事で具体的な書き方を解説しています。
この回でできるようになること
- WordPress のアクセスログから wp-login.php / xmlrpc.php だけを抜き出せるようになる
awkで怪しい IP を取り出し、攻撃者ランキング(Top10)を作れるようになる- ランキング結果を見て、WordPress の不正アクセス対策として次にやるべき行動(確認・記録・対処)が分かる
難しい理論は後回しで大丈夫です。
読み終わったら、あなたのターミナルにもこのページのサンプルと同じ「ランキング表」が出ます。
必要なアクセスは残す。不正アクセスだけを「ログで仕分け」する
「不正アクセス対策」と聞くと、 “全てをブロックしたくなる”かもしれません。
でも、手当たり次第に全てのIPをブロックすると困ったことが起こります。
たとえば、こんなアクセスは止めたくありません。
- Google などの検索エンジンの巡回(SEOに関わります)
- 外部サービスの通知や連携(フォーム・決済・APIなど)
- そして、あなた自身の管理画面アクセス
- CDN / WAF / 死活監視(UptimeRobot等)のアクセス
IPアドレスを厳選する
無作為にIPを選んでブロック(=誤ブロック)してしまうと、必要なお客さんまで巻き込んでしまい、次のようなトラブルが発生します。
- サイトが急に表示されない
- WordPressにログインできない
- サイトの機能が止まる
特に危険なのが、自分自身のIPを遮断してしまうケースです。
管理画面へのアクセスが遮断され、WordPressにログインできなくなるので注意が必要です。
そこで、 check_all.sh の登場です。
このスクリプトは、ログの中から 狙われやすい入口(wp-login / xmlrpc)だけを抜き出し、さらに 誰が何回試したかをランキングで表示することができます。
つまり、「遮断していい相手」を数字で特定できるということです。
この準備が整うと、次にやる作業(whois などで確認 → WAF やサーバー設定へ反映 → 必要なら .htaccess で補助)を、迷わずスムーズに進められます。
では次に、ログの中からwp-login / xmlrpc だけを抜き出し、IPを回数順に並べて「遮断候補」を見える化していきます。
スクリプトの設計図:UNIX哲学を体現する
このスクリプトは、複雑なAIや重いソフトウェアを使いません。以下の4つのフェーズを、パイプ(|)で繋ぐだけで完成します。
- 収集: リモートサーバーから最新のログを取得
- フィルタリング: 自分のアクセスを除外
- 抽出: 攻撃者が狙う「急所」へのアクセスを特定
- 整形: 攻撃回数順にランキング化
完成したランキング表
このスクリプトを実行すると、不正アクセスの「回数が多いIPが上に並ぶ表」を、いつでも必要な時に出せるようになります。
>>> サーバーから最新のログを取得中...
--- 攻撃者ランキング (Top 10) ---
20 4.223.96.43
19 173.244.55.55
7 141.98.11.44
6 104.215.29.182
5 62.60.130.210
5 4.217.197.7
5 141.98.11.23
4 4.214.32.32
4 4.194.99.179
4 4.189.120.199
----------------------------------------------------------
解析完了。上位のIPに対して whois 検証を行ってください。あなたの環境に合わせるための3つの材料
スクリプトの仕組みはシンプルですが、あなたの環境で動作させる「材料」が3つ必要です。
- 自分のIPアドレス(例:123.45.67.89)
- ログファイル(例:access.log)
- 見張る入口(例:wp-login.php / xmlrpc.php)
この3つの情報がわかれば、あとは設定を書き換えるだけで動かすことができます。
まだ固定IPアドレスを持っていない場合は、固定IP付きのVPNやリモートアクセス手段を使う方法があります。固定IPアドレスがあると、GA4 の内部トラフィック設定や、レンタルサーバー / WAF のホワイトリスト登録を安定して行いやすくなります。
ロリポップ!固定IPアクセス
固定IPを使うときの補足
固定IPアドレスは、「管理画面に入れる人を限定したい」「接続元IPをホワイトリストで管理したい」という場面で特に役立ちます。ログ解析そのものとは別の話ですが、日々の運用を安定させるための土台になります。
押さえておきたいポイント:
- 管理系アクセスの送信元を固定しやすい: 自宅や外出先からでも、同じ送信元IPで管理画面や保守経路をまとめやすくなります。
- 接続経路を分けやすい: 管理用のアクセスだけを普段の閲覧経路と分離したいときに、運用を整理しやすくなります。
- 導入コストと手間のバランスを見る: 固定IPは便利ですが、契約費用や接続設定の管理も増えるため、運用規模に合わせて判断するのが現実的です。
固定IPはあくまで「管理しやすくするための土台」です。ログ解析、WAF、ログイン制限、二要素認証などと組み合わせて使うと、効果を発揮しやすくなります。
4つのステップで構築する「自分専用」の防衛ツール
Step 1:ノイズを消し、急所を張る
まずは、膨大なログから「自分自身」の送信元IPアドレスを除外し、攻撃者が必ず狙う WordPress のログイン画面(wp-login.php)などへのアクセスだけに絞り込みます。
# 自分のIP(123.45.67.89)を1列目だけで判定して除外する
grep -E "wp-login.php|xmlrpc.php" access.log | awk -v ip="123.45.67.89" '$1 != ip'Point: この形なら、1列目の送信元IPだけを見て、自分のアクセスを正確に除外できます。
なぜ wp-login と xmlrpc は狙われるの?
wp-login.php は、WordPress に入るための正面玄関です。
ですから攻撃用ボットも、まずここを試します。
xmlrpc.php も、外部から操作できる窓口として使われることがあり、狙われやすい場所です。
ただし、WordPress アプリや一部の外部クライアント連携で必要になることもあるため、使っていなければ止める、使っているなら制限するという考え方が実務向きです。
最初は、この2つを「見張りポイント」にすることで、観察のコツを掴んでいきましょう。
ログイン画面を守るもう一つの強力な武器として「SiteGuard」というプラグインも有名です。これについては、また別の回で詳しくご紹介できればと思います。
Step 2:「誰が」来たのかを特定する
記録の中に含まれる時刻やブラウザ情報は、ここでは不要です。awk を使って、1列目のIPアドレスだけを抜き出します。
ただし、Cloudflare やロードバランサーの配下では、1列目が実クライアントIPではないログ形式もあります。その場合は access log の出力形式を確認したうえで、参照する列番号を調整してください。
grep -E "wp-login.php|xmlrpc.php" access.log | awk -v ip="123.45.67.89" '$1 != ip {print $1}'ログは物語です。IPアドレスは登場人物の名前。
まずは「名前だけを抜き出す」と、世界が一気に整理されます。
Step 3:攻撃の「熱量」を可視化する
バラバラのIPを並べ替え、同じIPが何回アクセスしたかをカウントします。
# sort で並べ、uniq -c で回数を数え、sort -nr で多い順に並べる
grep -E "wp-login.php|xmlrpc.php" access.log | awk -v ip="123.45.67.89" '$1 != ip {print $1}' | sort | uniq -c | sort -nrPoint: これで「攻撃者ランキング」の完成です。上位に並ぶIPこそが、今すぐ対処すべき「要注意候補」です。
小さな道具が並べて、パイプでつなぐ
- grep:ふるい(必要なものだけ残す)
- awk:切り出し(欲しい部分だけ抜く)
- sort:整列(並べて見やすくする)
- uniq -c:集計(同じものを数える)
- sort -nr:ランキング化(多い順に並べる)
どれも単体では小さい道具ですが、繋ぐとログの「観測装置」になります。
Step 4:完成!リモート解析スクリプト
最後に、これらを一つのファイルにまとめ、サーバーから自動でログをダウンロードする工程を加えます。
ここでは分かりやすさのために curl --netrc を使っていますが、実運用では 平文の ftp:// より ftps:// または sftp:// を優先してください。
#!/bin/bash
set -euo pipefail
MY_IP="123.45.67.89"
FTP_HOST="files.example.com"
REMOTE_LOG="/logs/access.log"
tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT
echo ">>> サーバーから最新のログを取得中..."
curl -s --netrc "ftps://${FTP_HOST}${REMOTE_LOG}" -o "$tmp"
echo "--- 攻撃者ランキング (Top 10) ---"
grep -E "wp-login.php|xmlrpc.php" "$tmp" \
| awk -v ip="$MY_IP" '$1 != ip {print $1}' \
| sort | uniq -c | sort -nr | head -n 10
echo "----------------------------------------------------------"
echo "解析完了。上位のIPに対して whois 検証を行ってください。"
.netrc を作成する
スクリプトを実行する前に .netrc を作成します。これで ID やパスワードをコマンドラインへ直接書かずに済みます。
vi ~/.netrc # FTPの設定内容を保存
chmod 600 ~/.netrc # 自分だけが読める設定に変更詳しい設定方法は、このあと後半の「.netrc の作成方法」でまとめて確認できます。
スクリプトを実行する
- スクリプトを、「check_all.sh」という名前で保存
- chmod +x で実行ファイルに変更
- ./check_all.sh で実行
chmod +x check_all.sh # ファイルに実行権限を追加する
./check_all.sh # ファイルを実行するここまでできたら、あとは実行するだけです。
“手作業で眺めるログ”が、“毎日同じ形式で出てくる表”に変わります。
実際に動かしてみた結果
このスクリプトを走らせると、ターミナルに以下のような「要注意候補」が表示されます。
>>> サーバーから最新のログを取得中...
--- 攻撃者ランキング (Top 10) ---
20 4.223.96.43
19 173.244.55.55
7 141.98.11.44
6 104.215.29.182
5 62.60.130.210
5 4.217.197.7
5 141.98.11.23
4 4.214.32.32
4 4.194.99.179
4 4.189.120.199
----------------------------------------------------------
解析完了。上位のIPに対して whois 検証を行ってください。ランキング1位のIPは、短時間に20回もログインを試みています。これが、スクリプトが教えてくれた「今、観察すべき相手」です。
結果を見たら、次にやることは3つだけ
- 上位3つのIPをメモする
- 他の管理サイトでも同じIPが出るか確認する(複数サイト管理の強み)
- 「増えた・減った」を記録して、傾向をつかむ
この工程だけで、攻撃用ボットからの防衛が「不安」から「運用」に変わります。
.netrc の作成方法
.netrc は、FTP や curl がログインするときの「IDとパスワード」を保存しておく設定ファイルのようなものです。
これを使うと、たとえば次のようなメリットがあります。
- スクリプト内に パスワードを書かなくて済む
- curl –netrc のようにして 資格情報をスクリプトへ直書きせずに済む
最低限の自動化なら、まずはこの形で十分です。
.netrc を作る場所
Mac / Linux なら、基本は ホームディレクトリ(~)直下に作ります。
vi ~/.netrc書き方(最小の例)
machine files.example.com
login your_ftp_user
password your_ftp_password
各行の意味
machine:ログイン先のサーバー名(FTPS / FTP / SFTP などの接続先ホスト名)login:FTPユーザー名password:FTPパスワード
普段 FTP ソフトに入れている接続情報と、考え方は同じです。
超重要:権限を絞る(これを忘れると危険)
.netrc はパスワードが入るので、自分だけが読める状態にします。
chmod 600 ~/.netrc確認:
ls -l ~/.netrc-rw——- みたいになっていればOKです。
FTP_HOST と .netrc の “machine” は一致させる
たとえばスクリプト側が files.example.com なら、.netrc の machine も同じホスト名にそろえます。
machine files.example.com
login your_id
password your_password動作テスト(スクリプトの前に試す)
REMOTE_LOG の設定が /logs/access.log なら、このように試せます。ここでも平文FTPではなく、可能なら FTPS / SFTP を選んでください。
curl --netrc ftps://files.example.com/logs/access.log -o /tmp/access_test.logfiles.example.com/logs/access.log
この部分は、実際のサーバー環境に合わせて置き換えてください。ファイルを取得できれば成功です。
やってはいけないこと(事故ポイント)
.netrcをGitHubに入れる(公開事故の王道です)- 記事に 実ユーザー名/実パスワード/実ホスト名 をそのまま書く
- 権限
chmod 600を忘れる
もし記事内で例を書くなら、いまの下書きのようにfiles.example.com / your_ftp_user などの ダミー表記にしてください。
補足:作業環境は軽快さが効く
ログ解析のような地道な作業は、すぐ開けて軽快に動く環境があるだけで継続しやすくなります。
まとめ:道具を使いこなし、主導権を握る
手元の作業環境で、30年以上使われ続けてきた UNIX コマンド を繋ぎ、ログから異常を見つけて対処していく。やっていること自体は、とても地に足のついた運用です。
このスクリプトが吐き出した結果をもとに、whois や ASN 情報で傾向を確認し、必要に応じて WAF、ログイン試行制限、二要素認証、xmlrpc.php の制限、そして補助的に .htaccess やサーバー設定へ反映する。この「道具と人間のハイブリッド」な防衛術こそが、多サイト管理を安定させる現実的なやり方です。
ここに掲載したスクリプトは最小構成です。必要に応じて機能を足しながら、自分だけの check_all.sh に育ててみてください。





