wiki:ログ監視ツールswatch

Version 1 (modified by admin, 7 years ago) ( diff )

--

戻る

ログ監視ツール導入(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に予約されている
}}}
Note: See TracWiki for help on using the wiki.