これまでの記事で、Linuxログの重要性と、それを確認するための基本コマンドを学びました。
「毎日コマンドを打ってログを確認するのは、正直大変…」
「問題が起きてからログを見るのではなく、問題の”兆候”をリアルタイムで知りたい!」
そう感じているあなたへ。今回は、その悩みを解決するための「監視の自動化」がテーマです。
この記事では、「1分間に10回以上のログイン失敗」といったブルートフォース攻撃(総当たり攻撃)の兆候を自動で検知し、あなたにメールで知らせてくれる、簡単なシェルスクリプトの作り方をゼロから解説します。
一度設定してしまえば、あとはスクリプトが24時間365日、あなたの代わりにサーバーを見守ってくれます。サーバー管理者の負担を劇的に減らし、セキュリティインシデントへの対応を迅速化する「最初の一歩」を、一緒に踏み出しましょう。
準備するもの:3つの事前準備
スクリプトを作成する前に、いくつか準備が必要です。
1. Linuxサーバー
当たり前ですが、監視対象のサーバーが必要です。この記事では、CentOSやRHEL系のディストリビューションを想定して解説を進めます。
2. メール送信プログラムの導入
サーバーからアラートメールを送信するために、コマンドラインで使えるメール送信プログラムが必要です。ここでは、設定が比較的簡単なssmtpを導入します。
Bash
# yum (CentOS/RHEL) or dnf
sudo yum install ssmtp -y
インストール後、/etc/ssmtp/ssmtp.conf
という設定ファイルに、あなたが利用しているメールサーバーの情報(Gmailや会社のメールサーバーなど)を記述する必要があります。この設定は利用するメールサービスによって異なるため、ここでは詳細を割愛しますが、「ssmtp gmail 設定」などで検索すると多くの情報が見つかります。
3. スクリプトを設置する場所
作成したスクリプトを保存しておくためのディレクトリを用意しましょう。ここでは、/usr/local/binの中に置くことを想定します。
準備はこれだけです。それでは、早速スクリプト本体を作成していきましょう。
【コピペOK】ログイン失敗監視スクリプト
まず、スクリプトの全体像です。check_login_failure.sh
という名前でファイルを作成し、以下の内容をコピー&ペーストしてください。
Bash
#!/bin/bash
# --- 設定項目 ---
# 監視対象のログファイル
LOG_FILE="/var/log/secure"
# 検知したいキーワード
KEYWORD="Failed password"
# 閾値(この回数以上でアラート)
THRESHOLD=10
# アラートメールの送信先
MAIL_TO="your-email@example.com"
# --- 設定ここまで ---
# 1分前の時刻をログのフォーマットに合わせて取得
# (例: Sep 12 07:30)
TARGET_TIME=$(date --date='-1 minute' '+%b %_d %H:%M')
# ログファイルから、直近1分間のキーワードを含む行をカウント
# awkを使って、ログのタイムスタンプがTARGET_TIME以降のものを抽出
COUNT=$(awk -v d="$TARGET_TIME" '$0 > d' "$LOG_FILE" | grep "$KEYWORD" | wc -l)
# カウントが閾値を超えていたらメールを送信
if [ "$COUNT" -ge "$THRESHOLD" ]; then
# メール本文を作成
SUBJECT="[Alert] Brute Force Attack Detected on $(hostname)"
BODY="High number of failed login attempts detected.
Count: $COUNT attempts in the last minute.
Keyword: $KEYWORD
Log file: $LOG_FILE
Please check the server immediately."
# メールを送信
echo -e "Subject:${SUBJECT}\n\n${BODY}" | ssmtp "$MAIL_TO"
fi
exit 0
スクリプトの仕組みを徹底解説!
一見すると難しそうですが、やっていることは非常にシンプルです。一つずつ分解して見ていきましょう。
1. 設定項目
スクリプトの冒頭部分は、あなたの環境に合わせて変更する箇所です。
LOG_FILE
: 監視したいログファイルを指定します。今回は認証ログである/var/log/secure
です。KEYWORD
: どんな文字列を検知したいかを指定します。Failed password
はログイン失敗時に記録される典型的なキーワードです。THRESHOLD
: 1分間に何回キーワードが記録されたら異常と判断するか、その回数を指定します。MAIL_TO
: アラートを受け取りたいあなたのメールアドレスを指定します。
2. 1分前の時刻を取得
TARGET_TIME=$(date –date=’-1 minute’ ‘+%b %_d %H:%M’)
この行がこのスクリプトのキモです。dateコマンドを使って、「今から1分前」の時刻を生成しています。+%b %_d %H:%Mという部分は、ログファイル(/var/log/secure)に記録されているSep 12 07:30のようなタイムスタンプの形式と全く同じ形式で出力するための指定です。
3. ログを絞り込み、カウントする
COUNT=$(awk … | grep … | wc -l)
ここがログを分析している中心部です。パイプ|で3つのコマンドが繋がれています。
awk -v d="$TARGET_TIME" '$0 > d' "$LOG_FILE"
:awk
という強力なテキスト処理ツールを使い、ログファイルの中から、タイムスタンプが先ほど取得したTARGET_TIME
(1分前の時刻)よりも後の行だけを抽出します。grep "$KEYWORD"
: 抽出された直近1分間のログの中から、さらに設定したキーワード(Failed password
)が含まれる行だけを絞り込みます。wc -l
: 最終的に絞り込まれた行が何行あるかを数えます。この数がCOUNT
という変数に格納されます。
4. 閾値を超えたか判定し、メールを送信
if [ “$COUNT” -ge “$THRESHOLD” ]; then … fi
最後に、取得したCOUNTが設定したTHRESHOLD(閾値)以上(-ge)であれば、if文の中の処理、つまりメール送信処理が実行されます。メールの件名や本文を組み立て、ssmtpコマンドで実際にメールを送信します。
監視を自動化する:cronへの登録
スクリプトが完成したら、これを1分ごとに自動で実行するように設定します。そのために使うのがcron
です。
1. スクリプトに実行権限を与える
まず、作成したスクリプトを誰でも実行できるように、権限を変更します。
Bash
sudo chmod +x /usr/local/bin/check_login_failure.sh
2. cronを設定する
次に、crontabというコマンドを使って、定期実行のスケジュールを登録します。
Bash
sudo crontab -e
エディタが開くので、最終行に以下の一行を追記して保存してください。
* * * * * /usr/local/bin/check_login_failure.sh
* * * * *
というのは、「毎分、毎時、毎日、毎月、全ての曜日」に実行するという意味です。これで、毎分0秒に自動的にスクリプトが走り、ログイン失敗を監視してくれるようになります。
まとめ:自動化で手に入れる「安心」と「時間」
お疲れ様でした!これで、あなたのサーバーには、ブルートフォース攻撃の兆候を自動で検知し、知らせてくれる番人ができました。
今回作成したスクリプトは、設定項目のキーワードやログファイルを変更するだけで、様々な用途に応用できます。
- Webサーバーのエラーログ(
/var/log/httpd/error_log
)を監視して、「Internal Server Error
」を検知する。 - アプリケーションのログを監視して、特定の「
FATAL
」エラーを検知する。
ログ監視の自動化は、単に作業を楽にするだけではありません。それは、インシデントの早期発見を可能にし、迅速な対応へと繋げるための、極めて重要なセキュリティ対策です。そして何より、サーバー管理者が「何か起きていないか」と常に心配し続ける状態から解放され、より創造的な業務に集中するための時間と安心をもたらしてくれます。
この小さなスクリプトを、あなたの安定したインフラ運用の第一歩として、ぜひ活用してみてください。