[wiki:WikiStart 戻る] ログ監視ツール導入(SWATCH) ■概要 システムのログファイル(/var/log/messages等任意のログファイル)を監視し、特定のメッセージを検知してリアルタイムに任意のアクションを実行することができるSWATCHを導入して、不正アクセス元からのアクセスを即ブロックする。 なお、該当IPアドレスは動的IPアドレスの場合もあり、該当IPアドレスが正当なユーザに割当てられた場合に正当なユーザがアクセスできなくなってしまうので、24時間後にアクセス制限を自動的に解除するようにする。 ■SWATCHインストール {{{ [root@fedora ~]# yum -y install perl-File-Tail ← SWATCHに必要なFile::Tailインストール [root@fedora ~]# yum -y install swatch ← SWATCHインストール }}} ■SWATCH設定 (1)SWATCHアクションスクリプト作成 SWATCHが検知したIPアドレスからの累積不正アクセス数が3回以上になった場合または、引数でlock※と指定された場合、該当IPアドレスからのアクセスを24時間規制するシェルスクリプトを作成する ※Ping of Death等悪意のあるアクセスを即規制するためのオプション {{{ [root@fedora ~]# vi /usr/local/bin/swatch_action.sh ← SWATCHアクションスクリプト作成 #!/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 [root@fedora ~]# chmod 700 /usr/local/bin/swatch_action.sh ← SWATCHアクションスクリプトへ実行権限付加 }}} (2)SWATCH設定 {{{ [root@fedora ~]# mkdir /etc/swatch ← SWATCH設定ファイル格納ディレクトリ作成 [root@fedora ~]# vi /etc/logrotate.d/swatch ← SWATCHログ切替え設定ファイル作成 /var/log/swatch/swatch.log { missingok notifempty sharedscripts postrotate /etc/rc.d/init.d/swatch restart > /dev/null || true endscript } }}} (3)/var/log/messages監視設定 以下のメッセージを検知したら該当ホストからのアクセスを24時間規制するようにする {{{ Oct 21 05:20:12 fedora named[14130]: client XXX.XXX.XXX.XXX#55199: query 'VERSION.BIND/TXT/CH' denied [root@fedora ~]# vi /etc/swatch/messages.conf ← /var/log/messages監視用設定ファイル作成 # logfile /var/log/messages # BINDのバージョン照会を検知したら該当ホストからのアクセスを24時間規制 # ※DNSサーバー(BIND)構築済であること watchfor /query \'VERSION\.BIND\/TXT\/CH\' denied/ pipe "/usr/local/bin/swatch_action.sh 7 lock" # アクセス無許可ホストからのDNS使用を検知したら該当ホストからのアクセスを24時間規制 # ※DNSサーバー(BIND)構築済であること watchfor /named.*client.*query.*denied/ pipe "/usr/local/bin/swatch_action.sh 7 lock" }}} (4)/var/log/secure監視設定※SSHサーバー構築済であること ・以下のメッセージを検知したら該当ホストからのアクセスを24時間規制するようにする {{{ Jan 24 09:32:07 fedora sshd[21171]: refused connect from ::ffff:XXX.XXX.XXX.XXX (::ffff:XXX.XXX.XXX.XXX) {{{ ・以下のメッセージを3回以上検知したら該当ホストからのアクセスを24時間規制するようにする {{{ Jan 28 19:32:10 fedora sshd[16367]: Invalid user admin from XXX.XXX.XXX.XXX }}} {{{ [root@fedora ~]# vi /etc/swatch/secure.conf ← /var/log/secure監視用設定ファイル作成 # 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" }}} (5)/var/log/vsftpd.log監視設定※FTPサーバー(vsftpd)構築済であること ・以下のメッセージを検知したら該当ホストからのアクセスを24時間規制するようにする {{{ Fri Jul 28 15:55:44 2006 [pid 28097] CONNECT: Client "XXX.XXX.XXX.XXX", "Connection refused: tcp_wrappers denial." }}} ・以下のメッセージを3回以上検知したら該当ホストからのアクセスを24時間規制するようにする {{{ Tue May 23 16:34:10 2006 [pid 11167] [xxxxxxxx] FAIL LOGIN: Client "XXX.XXX.XXX.XXX" }}} {{{ [root@fedora ~]# vi /etc/swatch/vsftpd.conf ← /var/log/vsftpd.log監視用設定ファイル作成 # logfile /var/log/vsftpd.log # アクセス無許可ホストからのFTPログイン失敗を検知したら該当ホストからのアクセスを24時間規制 # ※/etc/hosts.deny、/etc/hosts.allowでアクセス許可ホストを制限していることが前提 watchfor /Connection refused: tcp_wrappers denial/ pipe "/usr/local/bin/swatch_action.sh 10 lock" # アクセス許可ホストからのFTPログイン失敗を3回以上検知したら該当ホストからのアクセスを24時間規制 watchfor /FAIL LOGIN/ pipe "/usr/local/bin/swatch_action.sh 12" }}} (6)/var/log/maillog監視設定※vpopmail構築済であること ・以下のメッセージを検知したら該当ホストからのアクセスを24時間規制するようにする {{{ Sep 25 01:02:53 fedora vpopmail[30896]: vchkpw-smtp: vpopmail user not found xxxxxxxx@:XXX.XXX.XXX.XXX Oct 4 20:09:00 fedora vpopmail[27103]: vchkpw-pop3: vpopmail user not found xxxxxxxx@:XXX.XXX.XXX.XXX Oct 4 20:10:20 fedora vpopmail[27208]: vchkpw-pop3s: vpopmail user not found xxxxxxxx@:XXX.XXX.XXX.XXX }}} {{{ [root@fedora ~]# vi /etc/swatch/maillog.conf ← /var/log/maillog監視用設定ファイル作成 # logfile /var/log/maillog # 存在しないユーザ名によるvpopmail認証試行を検知したら該当ホストからのアクセスを24時間規制 watchfor /vpopmail user not found/ pipe "/usr/local/bin/swatch_action.sh 11 lock" }}} ■SWATCH起動 {{{ [root@fedora ~]# vi /etc/rc.d/init.d/swatch ← 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 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 [root@fedora ~]# chmod +x /etc/rc.d/init.d/swatch ← SWATCH起動スクリプトへ実行権限付加 [root@fedora ~]# /etc/rc.d/init.d/swatch start ← SWATCH起動 Starting swatch [root@fedora ~]# chkconfig --add swatch ← SWATCH起動スクリプトをcheconfigへ登録 [root@fedora ~]# chkconfig --list swatch ← SWATCH自動起動設定確認 swatch 0:off 1:off 2:on 3:on 4:on 5:on 6:off ← ランレベル2~5のonを確認 }}} ■SWATCHその他 設定に従って各種ログファイルを監視し、不正アクセスを検知して該当ホストからのアクセスを24時間規制した場合、該当IPアドレスのwhois情報がメール通知されてくる。 ※SWATCHアクションスクリプト(swatch_action.sh)で規制IPアドレス情報通知先メールアドレスを指定した場合 IPアドレスの規制状態は以下のコマンドで確認可能 {{{ [root@fedora ~]# iptables -L INPUT -n|grep DROP ← iptablesによる受信拒否ルールの照会 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アドレスの規制解除予約状態は以下のコマンドで確認可能 {{{ [root@fedora ~]# atq|sort ← atコマンドによる予約キューの照会 114 2006-02-04 09:32 a root 115 2006-02-04 09:33 a root [root@fedora ~]# at -c 114|tail -2 ← atコマンドにより予約されている処理の照会 iptables -D INPUT -s XXX.XXX.XXX.XXX -j DROP > /dev/null 2>&1 [root@fedora ~]# at -c 115|tail -2 ← atコマンドにより予約されている処理の照会 iptables -D INPUT -s XXX.XXX.XXX.XXX -j DROP > /dev/null 2>&1 }}} 上記例の場合、iptablesによるアクセス拒否ルールの削除コマンドが、2006-02-04 09:32と2006-02-04 09:33に予約されている