/dev/null 2>&1 # if [ $? -eq 0 ]; then # IPADDR=`echo "$IPADDR"|sed -e 's/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d` # else # IPADDR=`echo "$IPADDR"|sed -e 's/.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d` # fi #上の5行を下記の様に変更してこのスクリプトをSASL専用にした。 IPADDR=`echo "$IPADDR"|sed -e 's/.*\[\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)\].*/\1/p' -e d` if [ "$IPADDR" = "127.0.0.1" ]; then exit fi echo $LOG >> /var/log/swatch/$IPADDR #不正アクセス数取得 cnt=`cat /var/log/swatch/$IPADDR | wc -l` #不正アクセス数が5以上の場合またはlockと指定された場合 if [ $cnt -ge 3 ] || [ $# -eq 2 -a "$2" = "lock" ]; then iptables -A INPUT -s $IPADDR -j DROP echo "iptables -D INPUT -s $IPADDR -j DROP > /dev/null 2>&1" | at now+24hour > /dev/null 2>&1 [ "$mail" != "" ] && (cat /var/log/swatch/$IPADDR ; echo ; whois $IPADDR) | mail -s "$IPADDR $cnt lock!" $mail echo "`date` $IPADDR $cnt lock!" else echo "`date` $IPADDR $cnt" fi この正規表現の変更でたぶんOKだと思うが。 参考 CentOSで自宅サーバー構築 7月4日追加 IPアドレスが空だった場合に終了する if [ "$IPADDR" = "" ]; then exit fi カウントするためのファイルがいつまでも残ってしまうので接頭辞を付けてlogrotateで削除するようにした echo $LOG >> /var/log/swatch/ipaddr-$IPADDR /etc/logrotate.d/swatchip /var/log/swatch/ipaddr-* { missingok notifempty weekly } " />

itoigawabass

itoigawaのブログ

swatch ログ監視ツール

2014-07-03

久々にサーバーのネタ
ログファイルを監視し、特定のメッセージを検知するswatchを導入しています

maillogのsmtpd SASL LOGIN authentication failed: authentication failureを検知したらそのIPをIPTABLESでブロックしています。
つまりメールサーバーにログインしようとして認証できなかったIPアドレスはアクセスをブロックするのですが、
先日わずか5分程で3000回以上もアタックされていました。

スクリプトに問題があるのか見直してみました。

logの内容は Jul 2 07:48:07 ml110 postfix/smtpd[21575]: warning: 118.Red-79-148-235.staticIP.rima-tde.net[79.148.235.118]: SASL LOGIN authentication failed: authentication failure
のようなメッセージのIPアドレス部分を抜き出す正規表現を見直す

#!/bin/bash
PATH=/bin:/sbin:/usr/bin
LANG=C
mail=root
read LOG
IPADDR=`echo $LOG|cut -d " " -f $1`
echo "$IPADDR"|grep "^[0-9]*\." > /dev/null 2>&1
# if [ $? -eq 0 ]; then
# IPADDR=`echo "$IPADDR"|sed -e 's/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d`
# else
# IPADDR=`echo "$IPADDR"|sed -e 's/.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d`
# fi

#上の5行を下記の様に変更してこのスクリプトをSASL専用にした。
IPADDR=`echo "$IPADDR"|sed -e 's/.*\[\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)\].*/\1/p' -e d`


if [ "$IPADDR" = "127.0.0.1" ]; then
exit
fi
echo $LOG >> /var/log/swatch/$IPADDR
#不正アクセス数取得
cnt=`cat /var/log/swatch/$IPADDR | wc -l`
#不正アクセス数が5以上の場合またはlockと指定された場合
if [ $cnt -ge 3 ] || [ $# -eq 2 -a "$2" = "lock" ]; then
iptables -A INPUT -s $IPADDR -j DROP
echo "iptables -D INPUT -s $IPADDR -j DROP > /dev/null 2>&1" | at now+24hour > /dev/null 2>&1
[ "$mail" != "" ] && (cat /var/log/swatch/$IPADDR ; echo ; whois $IPADDR) | mail -s "$IPADDR $cnt lock!" $mail
echo "`date` $IPADDR $cnt lock!"
else
echo "`date` $IPADDR $cnt"
fi

この正規表現の変更でたぶんOKだと思うが。
参考 CentOSで自宅サーバー構築

7月4日追加
IPアドレスが空だった場合に終了する
if [ "$IPADDR" = "" ]; then
    exit
fi
カウントするためのファイルがいつまでも残ってしまうので接頭辞を付けてlogrotateで削除するようにした
echo $LOG >> /var/log/swatch/ipaddr-$IPADDR

/etc/logrotate.d/swatchip

/var/log/swatch/ipaddr-* {
    missingok
    notifempty
    weekly
}

2014-07-03 15:12:28

カテゴリー:サーバー
タグ: