SWATCHによるログ常時監視で不正アクセス自動拒否
システムのログファイルを監視し、設定されたメッセージを検知してリアルタイムに任意の動作を起こすことが出来るSWATCHを導入して、不正アクセスが行えないようにします。
なお、自分でもSSH等でアクセスする際、パスワードを間違えるので、SWATCHが検知したIPアドレスからの累積不正アクセス数が3回以上になった場合、該当IPアドレスからのアクセスを行えないようにし、24時間後にアクセス制限を自動的に解除するようにします。
■必要なPerl5モジュールのインストール
- Date::Calc
- Date::Parse
- File::Tail
- Time::HiRes
# perl -MCPAN -e shell
cpan> install Date::Calc
cpan> install Date::Parse
cpan> install File::Tail
cpan> install Time::HiRes
cpan> install Date::Manip
※CPANの要求するままにインストールをしました。
■SWATCHインストール
# cd /usr/local/src/
# wget http://downloads.sourceforge.net/swatch/swatch-3.2.2.tar.gz?modtime=1186769620&big_mirror=0
# tar zxvf swatch-3.2.2.tar.gz
# cd swatch-3.2.2
# perl Makefile.PL
# make
# make test
# make install
■SWATCHアクションスクリプト作成
# vi /usr/local/bin/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]*).*/1/p' -e d` else # IPアドレス以外から始まる場合 IPADDR=`echo "$IPADDR"|sed -e 's/.*[^0-9]([0-9]*.[0-9]*.[0-9]*.[0-9]*).*/1/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 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 $LOG >> /var/log/swatch/$IPADDR # IPアドレス別ログファイルから累積不正アクセス数取得 cnt=`cat /var/log/swatch/$IPADDR | wc -l` # 該当IPアドレスからの累積不正アクセス数が3以上の場合または # 引数でlockと指定された場合アクセス規制 if [ $cnt -ge 3 ] || [ $# -eq 2 -a "$2" = "lock" ]; then # 該当IPアドレスからのアクセスを拒否するルールを挿入 iptables -I INPUT -s $IPADDR -j DROP # 上記ルールを24時間後に削除するスケジュールを登録 echo "iptables -D INPUT -s $IPADDR -j DROP > /dev/null 2>&1" | at now+24hour > /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
# chmod 700 /usr/local/bin/swatch_action.sh
■SWATCH設定ファイル格納ディレクトリ作成
# mkdir /etc/swatch
■SWATCHログ切替え設定ファイル作成
# vi /etc/logrotate.d/swatch
/var/log/swatch/swatch.log {
missingok
notifempty
sharedscripts
postrotate
/etc/rc.d/init.d/swatch restart > /dev/null || true
endscript
}
■/var/log/messages監視用設定ファイル作成
# vi /etc/swatch/messages.conf
# logfile /var/log/messages # BINDのバージョン照会を検知したら該当ホストからのアクセスを24時間規制 # ※DNSサーバー(BIND)構築済であることが前提 watchfor /query 'VERSION.BIND/TXT/CH' denied/ pipe "/usr/local/bin/swatch_action.sh 7 lock"
■/var/log/secure監視用設定ファイル作成
# vi /etc/swatch/secure.conf
# logfile /var/log/secure # アクセス無許可ホストからのSSHログイン失敗を検知したら該当ホストからのアクセスを24時間規制 # ※/etc/hosts.deny、/etc/hosts.allowでアクセス許可ホストを制限していることが前提 watchfor /sshd.*refused/ pipe "/usr/local/bin/swatch_action.sh 10 lock" # アクセス許可ホストからのSSHログイン失敗を3回以上検知したら該当ホストからのアクセスを24時間規制 watchfor /sshd.*Invalid user/ pipe "/usr/local/bin/swatch_action.sh 10 lock" watchfor /sshd.*Illegal user/ pipe "/usr/local/bin/swatch_action.sh 10 lock"
■SWATCH起動スクリプト作成
# vi /etc/rc.d/init.d/swatch
#!/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 stoped"
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起動スクリプトへ実行権限付加
# chmod +x /etc/rc.d/init.d/swatch
SWATCH起動
# /etc/rc.d/init.d/swatch start
SWATCH起動スクリプトをcheconfigへ登録
# chkconfig --add swatch
SWATCH自動起動設定
# chkconfig swatch on
SWATCH自動起動設定(確認)
# chkconfig --list swatch
■IPアドレスの規制状態は以下のコマンドで確認可能
iptablesによる受信拒否ルールの照会
# iptables -L INPUT -n|grep DROP
Chain INPUT (policy DROP)
DROP all — XXX.XXX.XXX.XXX 0.0.0.0/0
DROP all — XXX.XXX.XXX.XXX 0.0.0.0/0
■IPアドレスの規制解除予約状態は以下のコマンドで確認可能
※下記例の場合、iptablesによるアクセス拒否ルールの削除コマンドが、
2006-02-04 09:32と2006-02-04 09:33に予約されている
atコマンドによる予約キューの照会
# atq|sort
114 2006-02-04 09:32 a root
115 2006-02-04 09:33 a root
atコマンドにより予約されている処理の照会
# at -c 114|tail -2
iptables -D INPUT -s XXX.XXX.XXX.XXX -j DROP > /dev/null 2>&1
atコマンドにより予約されている処理の照会
# at -c 115|tail -2
iptables -D INPUT -s XXX.XXX.XXX.XXX -j DROP > /dev/null 2>&1
- カテゴリ:Web開発
- 公開日:2008/01/19
- ↑ 記事評価をお願いします。

