/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 } " />
itoigawaのブログ
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
if [ "$IPADDR" = "" ]; then exit fiカウントするためのファイルがいつまでも残ってしまうので接頭辞を付けてlogrotateで削除するようにした
echo $LOG >> /var/log/swatch/ipaddr-$IPADDR /etc/logrotate.d/swatchip /var/log/swatch/ipaddr-* { missingok notifempty weekly }