swatch
何の気なしにauth.logをみてみたら、Illegal user ???? from のログが大量に記録されている。誰かがSSHログイン試行を無差別に行っているよう。 さいわい、不正ログインはされていないものの、気持ち悪いので対策をとることにした。
必要なもの
swatch
at
ディクトリ作成
# mkdir /etc/swatch
# mkdir /var/log/swatch
スクリプト作成
/etc/swatch/swatch.conf
/etc/swatch/swatch_action.sh
/etc/init.d/swatch
起動スクリプト
/etc/init.d/swatch
#!/bin/sh
PATH="/sbin:/bin:/usr/sbin:/usr/bin"
NAME="swatch"
DAEMON="/usr/bin/swatch"
DESC="simple watcher"
CONFFILE="/etc/swatch/swatch.conf"
#LOGFILE="/var/log/secure"
LOGFILE="/var/log/auth.log"
PIDFILE="/var/run/swatch.pid"
SCRIPTDIR="/var/log/swatch"
OPTS="--config-file $CONFFILE --tail-file $LOGFILE --pid-file=$PIDFILE \
--script-dir=$SCRIPTDIR --awk-field-syntax --daemon"
test -x $DAEMON || exit 0
start() {
if [ ! -f "$CONFFILE" ]; then
echo "Error: $CONFFILE does not exist."
exit 1
fi
if [ ! -f "$LOGFILE" ]; then
echo "Error: $LOGFILE does not exist."
exit 1
fi
if [ -f "$PIDFILE" ]
then
echo "Error: $NAME is already running."
else
$DAEMON $OPTS >> /var/log/swatch/swatch.log 2>&1
fi
}
stop() {
if [ -f "$PIDFILE" ]
then
PID=`cat $PIDFILE`
if ps h $PID > /dev/null
then
pkill -P $PID
else
echo "Error: $NAME is not running, but PID file exists. Deleting it."
fi
rm -f $PIDFILE "$SCRIPTDIR"/.swatch_script.*
else
echo "Error: $NAME is not running."
fi
}
case "$1" in
start)
echo "Starting $DESC: $NAME"
start
;;
stop)
echo "Stopping $DESC: $NAME"
stop
;;
restart)
echo "Restarting $DESC: $NAME"
stop
sleep 1
start
;;
*)
echo "Usage: $0 start|stop|restart"
exit 1
;;
esac
exit 0
コンフィグスクリプト
/etc/swatch/swatch.conf
watchfor /Did not receive identification string from/
exec "echo $12 | tr -d '(:f)'| /etc/swatch/swatch_action.sh $0"
watchfor /Illegal user/
exec "echo $10 | tr -d '(:f)'| /etc/swatch/swatch_action.sh $0"
watchfor /Authentication failure for root/
exec "echo $13 | /etc/swatch/swatch_action.sh $0"
iptablesでアクセス制限スクリプト
/etc/swatch/swatch_action.sh
#!/bin/bash
read IPADDR
mail=root
# IPアドレスから,を除去
IPADDR=`echo $IPADDR|tr -d ','`
# 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 10 ]; then
exit
elif [ $addr1 -eq 172 ] && [ $addr2 -ge 16 ] && [ $addr2 -le 31 ]; then
exit
elif [ $addr1 -eq 192 ] && [ $addr2 -eq 168 ]; then
exit
fi
# 引数として与えられた不正アクセスログメッセージをIPアドレス別ログファイルに記録
echo "$*" >> /var/log/swatch/$IPADDR
# IPアドレス別ログファイルから累積不正アクセス数取得
cnt=`cat /var/log/swatch/$IPADDR | wc -l`
# DROP
/sbin/iptables -A INPUT -s $IPADDR -j DROP
# 復帰
echo "/sbin/iptables -D INPUT -s $IPADDR -j DROP" | \
at now+30min > /dev/null 2>&1
# 規制IPアドレスメール通知
[ "$mail" != "" ] && (cat /var/log/swatch/$IPADDR ; \
echo ; whois $IPADDR) | \
mail -s "test $IPADDR $cnt lock!" $mail
echo "`date` $IPADDR $cnt lock!"