
UNIX Cafe | 第97回
1行のパイプがサイトを守る
管理している複数のサイトに届く、無数の不正アクセス。
その中から「悪意」だけを抽出し、効率よく防衛するために、私が MacBook Air M4 のターミナルで毎日走らせている自作スクリプトが check_all.sh です。
今回は、UNIXの伝統的な「小さく鋭いツール」を組み合わせ、読み終わる頃にはあなた専用の道具が完成する、実践的な構築術をお届けします。
防衛ソフトを追加で買う必要はありません。
あなたのMacに最初から入っている道具(grep / awk / sort)を、たった1本のパイプで繋ぐだけです。
そして何より大切なのは、自分で作った道具を進化させ「最後は人間が判断する」ということです。
機械に任せきりにせず、管理者が主導権を取り戻すための入口になります。
この回でできるようになること
- ログから wp-login / xmlrpc だけを抜き出し、「怪しい動き」だけを見られるようになる
- awk で IP を取り出し、**攻撃者ランキング(Top10)**を作れるようになる
- ランキング結果を見て、次にやるべき行動(確認・記録・対処)が分かる
難しい理論は後回しで大丈夫です。
読み終わったら、あなたのターミナルにもこのページのサンプルと同じ「ランキング表」が出ます。
必要なアクセスは残す。不正アクセスだけを「ログで仕分け」する
「不正アクセス対策」と聞くと、 “全てをブロックしたくなる”かもしれません。
でも、手当たり次第に全てのIPをブロックすると困ったことが起こります。
たとえば、こんなアクセスは止めたくありません。
- Google などの検索エンジンの巡回(SEOに関わります)
- 外部サービスの通知や連携(フォーム・決済・APIなど)
- そして、あなた自身の管理画面アクセス
- CDN / WAF / 死活監視(UptimeRobot等)のアクセス
IPアドレスを厳選する
無作為にIPを選んでブロック(=誤ブロック)してしまうと、必要なお客さんまで巻き込んでしまい、次のようなトラブルが発生します。
- サイトが急に表示されない
- WordPressにログインできない
- サイトの機能が止まる
特に危険なのが、自分自身のIPを遮断してしまうケースです。
管理画面へのアクセスが遮断され、WordPressにログインできなくなるので注意が必要です。
そこで、 check_all.sh の登場です。
このスクリプトは、ログの中から 狙われやすい入口(wp-login / xmlrpc)だけを抜き出し、さらに 誰が何回試したかをランキングで表示することができます。
つまり、「遮断していい相手」を数字で特定できるということです。
この準備が整うと、次にやる作業(whoisで確認 → .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アドレスを持っていない人は、1コインで使える【ロリポップ!固定IPアクセス】が便利です。固定IPアドレスを使うことで、Google アナリティクスのフィルター機能や、レンタルサーバーのホワイトリスト登録なども設定することができます。
4つのステップで構築する「自分専用」の防衛ツール
Step 1:ノイズを消し、急所を張る
まずは、膨大なログから「自分自身」のIPアドレスを除外し、攻撃者が必ず狙う WordPress のログイン画面(wp-login.php)などへのアクセスだけに絞り込みます。
# 自分のIP(123.45.67.89)を除外し、ターゲットを絞り込む
grep -v "123.45.67.89" access.log | grep -E "wp-login.php|xmlrpc.php"Point: この一行だけで、画面には「自分以外の第三者が、こじ開けようとした記録」だけが流れます。
なぜ wp-login と xmlrpc は狙われるの?
wp-login.php は、WordPress に入るための正面玄関です。
ですから攻撃用ボットも、まずここを試します。
xmlrpc.php も、外部から操作できる窓口として使われることがあり、狙われやすい場所です。
最初は、この2つを「見張りポイント」にすることで、観察のコツを掴んでいきましょう。
Step 2:「誰が」来たのかを特定する
記録の中に含まれる時刻やブラウザ情報は、ここでは不要です。awk を使って、1列目のIPアドレスだけを抜き出します。
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 -v "123.45.67.89" access.log | grep -E "wp-login.php|xmlrpc.php" | awk '{print $1}' | sort | uniq -c | sort -nrPoint: これで「攻撃者ランキング」の完成です。上位に並ぶIPこそが、今すぐ対処すべき「要注意候補」です。
小さな道具が並べて、パイプでつなぐ
- grep:ふるい(必要なものだけ残す)
- awk:切り出し(欲しい部分だけ抜く)
- sort:整列(並べて見やすくする)
- uniq -c:集計(同じものを数える)
- sort -nr:ランキング化(多い順に並べる)
どれも単体では小さい道具ですが、繋ぐとログの「観測装置」になります。
Step 4:完成!リモート解析スクリプト
最後に、これらを一つのファイルにまとめ、サーバーから自動でログをダウンロードする工程を加えます。
#!/bin/bash
set -euo pipefail
MY_IP="123.45.67.89"
FTP_HOST="ftp.example.com"
REMOTE_LOG="/logs/access.log"
tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT
echo ">>> サーバーから最新のログを取得中..."
curl -s --netrc "ftp://${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 # 自分だけが読める設定に変更詳しい設定方法は、次の章の「実際に動かしてみた結果」の後に書いています。
スクリプトを実行する
- スクリプトを、「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 ftp.example.com
login your_ftp_user
password your_ftp_password
各行の意味
machine:ログイン先のサーバー名(FTPホスト名)login:FTPユーザー名password:FTPパスワード
※ FTPソフトの設定内容と同じです。
超重要:権限を絞る(これを忘れると危険)
.netrc はパスワードが入るので、自分だけが読める状態にします。
chmod 600 ~/.netrc確認:
ls -l ~/.netrc-rw——- みたいになっていればOKです。
FTP_HOST と .netrc の “machine” は一致させる
例:スクリプトが ftp.example.com なら、.netrc も machine は同じに。
machine ftp.example.com
login your_id
password your_password動作テスト(スクリプトの前に試す)
REMOTE_LOG の設定が /logs/access.log ならば、このように試せます。
curl --netrc ftp://ftp.example.com/logs/access.log -o /tmp/access_test.log「ftp.example.com/logs/access.log」
この部分をサーバーの環境に合わせてください。ファイルが取れていれば成功です。
やってはいけないこと(事故ポイント)
.netrcをGitHubに入れる(公開事故の王道です)- 記事に 実ユーザー名/実パスワード/実ホスト名 をそのまま書く
- 権限
chmod 600を忘れる
もし記事内で例を書くなら、いまの下書きのようにftp.example.com / your_ftp_user などの ダミー表記にしてください。
まとめ:道具を使いこなし、主導権を握る
MacBook Air M4という最新のハードウェアの上で、30年以上変わらない UNIXコマンド を繋げて、世界中からの攻撃をスクリプト1つで防御する。
このスクリプトが吐き出した結果を元に、whois で検証し、.htaccess を編集してセキュリティを強化する。この「道具と人間のハイブリッド」な防衛術こそが、多サイト管理を安定させる最適解だと思います。
ここに掲載したスクリプトは最小構成ですが、このコードに自分の欲しい機能を追加して、皆さんもぜひ、自分だけの check_all.sh を育ててみてください。
さらに学びたいあなたへ
📘 用途ごとに選ぶ Linux のおすすめ本

