postfixのmaillogを見ていると存在しないユーザへのメール送信が結構発生していたので、swatchの監査設定を追加しました。
●発生しているログ
Sep 28 10:40:29 www postfix/smtpd[809]: NOQUEUE: reject: RCPT from m156-77.hkmagazine-stand.co.uk[202.51.156.77]: 550 5.1.1 <irlutqp3n@example.com>: Recipient address rejected: User unknown in local recipient table; from=<pberr_aasv_995877_c00a6aa828b364f380cc59a27d698ef2@3de0d30.mobi> to=<irlutqp3n@example> proto=ESMTP helo=<m156-77.hkmagazine-stand.co.uk>
設定ファイル「/etc/swatch/maillog.conf」
# logfile /var/log/maillog watchfor /Recipient address rejected: User unknown in local recipient table;/ pipe "/usr/local/bin/swatch_action.sh 10" throttle=00:00:10 #上記は、「/var/log/maillog」をチェックし、 #「Recipient address rejected: User unknown in local recipient table;」を含む行を取り出す。 #取り出した行を空白で区切ったとき、10番目にIPに関する情報があるので、この内容をswatch_action.shに渡す。 #ただし、10秒間は同じ文字を検出しても無視する。
#という設定です。
この状態でしばらくみていたんだけど、
Sep 28 11:00:55 www postfix/smtpd[674]: NOQUEUE: reject: RCPT from 164.Red-80-58-29.staticIP.rima-tde.net[80.58.29.164]: 550 5.1.1 <pszhulttj@example.com>: Recipient address rejected: User unknown in local recipient table; from=<tbzsqscpnha@yahoo.co.jp> to=<pszhulttj@example.com> proto=SMTP helo=<164.Red-80-58-29.staticIP.rima-tde.net>
のようなログの場合、swatch_action.shでのIPの切り出しに失敗していました。なので、swatchを導入してみるのswatch_action.shの
echo "$IPADDR"|grep "^[0-9]*\." > /dev/null 2>&1
の行を
echo "$IPADDR"|grep "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" > /dev/null 2>&1
のように修正しました。
修正後のswatch_action.shは以下となります。
#!/bin/bash PATH=/bin:/sbin:/usr/bin LANG=C # 規制IPアドレス情報メール通知先設定 # ※メール通知しない場合は下記をコメントアウト #mail=root # ログを標準入力から取得 read LOG # ログからIPアドレスを抽出 IPADDR=`echo $LOG|cut -d " " -f $1` echo "$IPADDR"|grep "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" > /dev/null 2>&1 if [ $? -eq 0 ]; then # IPアドレスから始まる場合 IPADDR=`echo "$IPADDR"|sed -e 's/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*//p' -e d` else # IPアドレス以外から始まる場合 IPADDR=`echo "$IPADDR"|sed -e 's/.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*//p' -e d` fi # IPアドレスをピリオドで分割 addr1=`echo $IPADDR|cut -d . -f 1` addr2=`echo $IPADDR|cut -d . -f 2` addr3=`echo $IPADDR|cut -d . -f 3` addr4=`echo $IPADDR|cut -d . -f 4` # IPアドレスがプライベートIPアドレスの場合は終了 if [ "$IPADDR" = "127.0.0.1" ]; then exit elif [ $addr1 -eq 192 ] && [ $addr2 -eq 168 ]; then exit fi # 不正アクセスログメッセージをIPアドレス別ログファイルに記録 echo $LOG >> /var/log/swatch/$IPADDR # IPアドレス別ログファイルから累積不正アクセス数取得 cnt=`cat /var/log/swatch/$IPADDR | wc -l` # 該当IPアドレスからの累積不正アクセス数が5以上の場合または # 引数でlockと指定された場合アクセス規制 if [ $cnt -ge 5 ] || [ $# -eq 2 -a "$2" = "lock" ]; then # 該当IPアドレスからのアクセスを拒否するルールを挿入 iptables -I INPUT -s $IPADDR -j DROP # 上記ルールを2時間後に削除するスケジュールを登録 echo "iptables -D INPUT -s $IPADDR -j DROP > /dev/null 2>&1" | \ at now+2hour > /dev/null 2>&1 # アクセス規制IPアドレス情報をメール通知 [ "$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