Webサーバで特定ファイルへのアクセスを監視し、メールで知らせる

#!/bin/sh

# Monitoring the specific access to the web server and send notification mail.

logfile=/path/to/your/server_log

if [ ! -f $logfile ]; then
echo "$logfile: File does not exist"
exit 1
fi

grep -i "/cgi-bin/php" $logfile | awk '$6 == "\"POST" {print $0}' > /tmp/access.log
cat /tmp/access.log | mail -s access_detected your@mail.com

Webサーバの特定ファイルへのアクセスを監視し、メールで知らせるスクリプトです。いちいちサーバにログインしてログを確認するのが面倒なときに使えるかもです。
例に挙げたのはCVE-2012-1823, CVE-2012-2311の脆弱性を利用した不正アクセスを検知するためのスクリプトです。

リクエストURLに「/cgi-bin/php」を含み、かつPOSTメソッドでのアクセスを検知したら、/tmp/access.logに該当のアクセスログを記述します。
awkコマンドの"$0"「すべてのカラム」を意味します。この場合はアクセスログに載っている送信元IPやアクセス先のファイル名、ステータスコード、リファラーなどのすべてのフィールドを出力します。
そして、/tmp/access.logの内容をmailコマンドに渡してメールを送信しています。
grepコマンドで i オプションを指定してリクエストのファイル名の大文字・小文字の区別を無効化してますが、これは無くてもいいかもしれません。
あとはスクリプトをcronで定期実行させれば、通知メールが定期的に届きます。

※スクリプトの最初の方で監視対象のログファイルを指定して、指定したログファイルが存在しなかったらエラーメッセージを表示して終了します。

以上。

2015年4月19日追記
以下のように地味に改良。

#!/bin/sh

# Monitoring the specific access to the web server and send notification mail.

logfile=/path/to/log
file=/path/to/file
old_logline=0
keyword=pattern
mailsubject=subject of mail

while true
do
if [ ! -f $logfile ]; then
echo "$logfile: File does not exist"
exit 1
fi

current_logline=$(grep $keyword $logfile | wc -l)

while [ $current_logline -ne $old_logline ]
do
grep $keyword $logfile | awk '{print $0}' >> $file
cat $file | mail -s $mailsubject example@mail.com
old_logline=$current_logline

done
done

変更点
while文で常にスクリプトを回すことによってログ監視のリアルタイム性をあげた。

Leave a Reply

Your email address will not be published. Required fields are marked *