トップ  > サーバ設定:運用  > サーバ公開後のセキュリティ対策  > ログ監視ツール導入(SWATCH)

ログ監視ツール導入(SWATCH)  (最終更新日:2010/02/17)

SWATCHインストール

RPMforgeリポジトリが導入されいない場合こちらを参照してインストールします。

[root@sv ~]# yum install swatch ← SWATCHインストール

SWATCH設定

1.SWATCHアクションスクリプト作成

SWATCHが検出したIPアドレスからの累積不正アクセス数が3回以上になった場合と引数でlock(Ping of Death等のアクセスを即規制するオプション)と指定された場合、該当IPアドレスからのアクセスを168時間(一週間)規制するシェルスクリプトを作成します。

[root@sv ~]# 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

    # 上記ルールを168時間後に削除するスケジュールを登録
    echo "iptables -D INPUT -s $IPADDR -j DROP > /dev/null 2>&1" | \
    at now+168hour > /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@sv ~]# chmod 700 /usr/local/bin/swatch_action.sh ← SWATCHアクションスクリプトへ実行権限付加
2.SWATCH設定
[root@sv ~]# mkdir /etc/swatch ← SWATCH設定ファイル格納ディレクトリ作成

[root@sv ~]# 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監視設定

以下のメッセージを検知したら、該当ホストからのアクセスを168時間規制します。

Oct 21 05:20:12 centos named[14130]: client XXX.XXX.XXX.XXX#55199: query 'VERSION.BIND/TXT/CH' denied

[root@sv ~]# vi /etc/swatch/messages.conf ← /var/log/messages監視用設定ファイル作成
ここから----------
# logfile /var/log/messages

# BINDのバージョン照会を検知したら該当ホストからのアクセスを168時間規制
# ※DNSサーバー(BIND)構築済であること
watchfor /query \'VERSION\.BIND\/TXT\/CH\' denied/
    pipe "/usr/local/bin/swatch_action.sh 7 lock"
    throttle=00:00:10

# アクセス無許可ホストからのDNS使用を検知したら該当ホストからのアクセスを168時間規制
# ※DNSサーバー(BIND)構築済であること
watchfor /named.*client.*query.*denied/
    pipe "/usr/local/bin/swatch_action.sh 7 lock"
----------ここまで
4.var/log/secure監視設定

以下のメッセージを検知したら該当ホストからのアクセスを168時間規制するようにします。

Jan 24 09:32:07 centos sshd[21171]: refused connect from ::ffff:XXX.XXX.XXX.XXX (::ffff:XXX.XXX.XXX.XXX)

以下のメッセージを3回以上検知したら該当ホストからのアクセスを168時間規制するようにする

Jan 28 19:32:10 centos sshd[16367]: Invalid user admin from XXX.XXX.XXX.XXX

[root@sv ~]# vi /etc/swatch/secure.conf ← /var/log/secure監視用設定ファイル作成
# logfile /var/log/secure

# アクセス無許可ホストからのSSHログイン失敗を検知したら該当ホストからのアクセスを168時間規制
# ※/etc/hosts.deny、/etc/hosts.allowでアクセス許可ホストを制限していることが前提
watchfor /sshd.*refused/
    pipe "/usr/local/bin/swatch_action.sh 10 lock"
    throttle=00:00:10

# アクセス許可ホストからのSSHログイン失敗を3回以上検知したら該当ホストからのアクセスを168時間規制
watchfor /sshd.*Invalid user/
    pipe "/usr/local/bin/swatch_action.sh 10"
    throttle=00:00:10

SWATCH起動

[root@sv ~]# 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@sv ~]# chmod +x /etc/rc.d/init.d/swatch ← SWATCH起動スクリプトへ実行権限付加

[root@sv ~]# /etc/rc.d/init.d/swatch start ← SWATCH起動
Starting swatch

[root@sv ~]# chkconfig --add swatch ← SWATCH起動スクリプトをchkconfigへ登録

[root@sv ~]# chkconfig swatch on ← SWATCH自動起動設定

[root@sv ~]# chkconfig --list swatch ← SWATCH自動起動設定確認
swatch          0:off   1:off   2:on    3:on    4:on    5:on    6:off

SWATCH補足

ログファイルを監視し、不正アクセスを検知してホストのアクセスを168時間規制した場合、whoisがメールで通知されます

※SWATCHアクションスクリプト(swatch_action.sh)で規制IPアドレス情報通知先メールアドレスを指定した場合