grepとawkだけで攻撃が見える:Macで作る防衛スクリプト| UNIX Cafe

当サイトでは、コンテンツの一部に広告を掲載しています。
【実録】ログ解析スクリプト「check_all.sh」の全貌| UNIX Cafe

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つのフェーズを、パイプ(|)で繋ぐだけで完成します。

  1. 収集: リモートサーバーから最新のログを取得
  2. フィルタリング: 自分のアクセスを除外
  3. 抽出: 攻撃者が狙う「急所」へのアクセスを特定
  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 -nr

Point: これで「攻撃者ランキング」の完成です。上位に並ぶ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つだけ

  1. 上位3つのIPをメモする
  2. 他の管理サイトでも同じIPが出るか確認する(複数サイト管理の強み)
  3. 「増えた・減った」を記録して、傾向をつかむ

この工程だけで、攻撃用ボットからの防衛が「不安」から「運用」に変わります。

.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」

この部分をサーバーの環境に合わせてください。ファイルが取れていれば成功です。

やってはいけないこと(事故ポイント)

  • .netrcGitHubに入れる(公開事故の王道です)
  • 記事に 実ユーザー名/実パスワード/実ホスト名 をそのまま書く
  • 権限 chmod 600 を忘れる

もし記事内で例を書くなら、いまの下書きのように
ftp.example.com / your_ftp_user などの ダミー表記にしてください。

まとめ:道具を使いこなし、主導権を握る

MacBook Air M4という最新のハードウェアの上で、30年以上変わらない UNIXコマンド を繋げて、世界中からの攻撃をスクリプト1つで防御する。

このスクリプトが吐き出した結果を元に、whois で検証し、.htaccess を編集してセキュリティを強化する。この「道具と人間のハイブリッド」な防衛術こそが、多サイト管理を安定させる最適解だと思います。

ここに掲載したスクリプトは最小構成ですが、このコードに自分の欲しい機能を追加して、皆さんもぜひ、自分だけの check_all.sh を育ててみてください。

さらに学びたいあなたへ

📘 用途ごとに選ぶ Linux のおすすめ本

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe 編集部

UNIX Cafe は、むずかしい言葉をできるだけ使わず、物語を読むような気持ちで気軽に学べる場所です。
プログラミングは、アイデアをコンピューターに伝えるための「ことば」。
簡単な単語と文法を覚えることで、誰でもターミナルから便利なコマンドを使えるようになります。
コーヒーを片手に立ち寄るような気持ちで、やさしいプログラミングの世界を、
そっとのぞいてみてください。

目次