swatch

何の気なしにauth.logをみてみたら、Illegal user ???? from のログが大量に記録されている。誰かがSSHログイン試行を無差別に行っているよう。 さいわい、不正ログインはされていないものの、気持ち悪いので対策をとることにした。

必要なもの

ディクトリ作成

# mkdir /etc/swatch

# mkdir /var/log/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!"