存在しないユーザへのメール送信を制限する。

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