dovecotのログをみていると、以下のような認証アタックが結構あることに気が付きました。
2 20:27:49 www19472ue auth: pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=access rhost=74.94.179.17 Sep 2 20:27:49 www19472ue auth: pam_succeed_if(dovecot:auth): error retrieving information about user access Sep 2 20:27:59 www19472ue auth: pam_unix(dovecot:auth): check pass; user unknown Sep 2 20:27:59 www19472ue auth: pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=pwrchute rhost=74.94.179.17 Sep 2 20:27:59 www19472ue auth: pam_succeed_if(dovecot:auth): error retrieving information about user pwrchute Sep 2 20:28:10 www19472ue auth: pam_unix(dovecot:auth): check pass; user unknown Sep
特定のIPだけを許可するようなことができない状況なので、swatchを使って、dovecotで5回以上認証失敗したIPは2時間だけiptablesで接続を拒否するように設定してみた。
今回は、複数のサーバに設置する必要があったので、設定用のファイルを用意しました。よろしければ、自己責任でご利用くださいませ。
●ファイル構成
swatch.sh
template/swatch_action.sh
template/swatch_logwatch_conf.txt
template/swatch_secure.conf
template/swatch_rc.txt
のようにファイルを適当なディレクトリに設置します。
swatch.sh
#! /bin/sh
yum -y install swatch at perl-Time-HiRes perl-File-Tail
SACT=/usr/local/bin/swatch_action.sh
CONFD=/etc/swatch
LOGCONF=/etc/logrotate.d/swatch
SECURECONF=/etc/swatch/secure.conf
SRC=/etc/rc.d/init.d/swatch
my_dirname() { echo ${1%/*}; }
PWD=`pwd`
case "$0" in
/*) DIR=`my_dirname "$0"` ;;
*) DIR=`my_dirname "$PWD/$0"` ;;
esac
if [ ! -e ${SACT} ]
then
cp ${DIR}/template/swatch_action.sh ${SACT}
chmod 700 ${SACT}
fi
if [ ! -e ${CONFD} ]
then
mkdir ${CONFD}
fi
if [ ! -e ${LOGCONF} ]
then
cp ${DIR}/template/swatch_logwatch_conf.txt ${LOGCONF}
fi
if [ ! -e ${SECURECONF} ]
then
cp ${DIR}/template/swatch_secure.conf ${SECURECONF}
fi
if [ ! -e ${SRC} ]
then
cp ${DIR}/template/swatch_rc.txt ${SRC}
chmod +x ${SRC}
fi
restatus=`$SRC status`
if [[ "$restatus" =~ stopped ]]; then
$SRC start
fi
chkconfig --add swatch
chkconfig swatch on
restatus=`/etc/rc.d/init.d/atd status`
if [[ "$restatus" =~ stopped ]]; then
/etc/rc.d/init.d/atd start
fi
chkconfig atd ontemplate/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]*\." > /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
template/swatch_logwatch_conf.txt
/var/log/swatch/swatch.log {
missingok
notifempty
sharedscripts
postrotate
/etc/rc.d/init.d/swatch restart > /dev/null || true
endscript
}template/swatch_secure.conf
# logfile /var/log/secure watchfor /dovecot.*authentication failure/ pipe "/usr/local/bin/swatch_action.sh 14" throttle=00:00:10 #上記は、「/var/log/secure」をチェックし、 #「dovecot.*authentication failure」を含む(「.*」は正規表現)行を取り出す。 #取り出した行を空白で区切ったとき、14番目にIPに関する情報があるので、この内容をswatch_action.shに渡す。 #ただし、10秒間は同じ文字を検出しても無視する。 #という設定です。
template/swatch_rc.txt
#!/bin/bash
#
# swatch
#
# chkconfig: 2345 90 35
# description: swatch start/stop script
# Source function library.
. /etc/rc.d/init.d/functions
PATH=/sbin:/usr/local/bin:/bin:/usr/bin
mkdir -p /var/log/swatch
start() {
# Start daemons.
ls /var/run/swatch_*.pid > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo -n "Starting swatch"
pno=0
for conf in /etc/swatch/*.conf
do
pno=`expr $pno + 1`
WATCHLOG=`grep "^# logfile" $conf | awk '{ print $3 }'`
swatch --config-file $conf --tail-file $WATCHLOG \
--script-dir=/tmp --awk-field-syntax --use-cpan-file-tail --daemon \
--pid-file /var/run/swatch_$pno.pid \
>> /var/log/swatch/swatch.log 2>&1
RETVAL=$?
[ $RETVAL != 0 ] && return $RETVAL
done
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/swatch
return $RETVAL
else
echo "swatch is already started"
fi
}
stop() {
# Stop daemons.
ls /var/run/swatch_*.pid > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo -n "Shutting down swatch"
for pid in /var/run/swatch_*.pid
do
kill $(cat $pid)
rm -f $pid
done
echo
rm -f /var/lock/subsys/swatch /tmp/.swatch_script.*
else
echo "swatch is not running"
fi
}
status() {
ls /var/run/swatch_*.pid > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo -n "swatch (pid"
for pid in /var/run/swatch_*.pid
do
echo -n " `cat $pid`"
done
echo ") is running..."
else
echo "swatch is stopped"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: swatch {start|stop|restart|status}"
exit 1
esac
exit $RETVAL●swatchの設定
ファイル設置後、管理者権限で
sh ./swatch.sh
を発行すればよいです。
※ログ監視ツール導入(SWATCH)を参考にさせていただきました。
1件のコメント
コメントは受け付けていません。