「Swatch」の設定

出力されたログをリアルタイムで監視し、不正アクセスを遮断するために「Swatch」を導入する。
遮断するファイアウォールには「iptables」、 「IP Filter」、 「Packet Filter」、 のいずれかを用いるものとする。
よって、それぞれの設定はすでに完了済みとする。
なお、「iptables」の設定については、Linuxの自宅サーバの構築のページを参照。
また、「Swatch」のインストール方法は割愛する。

「Swatch」の設定

「Swatch」の設定方法

デフォルトでの設定ファイルは実行ユーザのホームディレクトリの .swatchrc になる。
「Swatch」の基本的な書式は以下の通り。

無視したいpatternの場合
ignore     /pattern/

actionを実行したいpatternの場合
watchfor   /pattern/
        action1
        action2
        

基本的にwatchforでpatternを実行し終了するので、ignoreがある場合、watchforより前に記述する。
また、patternにはPerlの正規表現が利用できる。

action

action 説明
echo ターミナルにメッセージを表示する。
bell beep音を鳴らす。
デフォルトは1回だが、引数を指定すれば引数分beep音を鳴らす。
exec 引数に指定したコマンドを実行する。
mail 指定したアドレスにメールを送信する。
例:mail=root@localhost
pipe パイプで結果を渡す。
write サーバにログインしているユーザのコンソール上にwriteコマンドを利用して表示する。
例:write=root
throttle 一度検出されたpatternが再度検出された場合、検出を抑える。
continue patternがマッチしてもactionを終了せず、次に進む。
quit 「Swatch」を終了する。

「Swatch」の設定

ここでは、/var/log/secureを監視し、sshによる不正アクセスを監視することにする。
また、後で述べる起動スクリプトでの都合を考えて、以下のように設定ファイルを作成する事にする。

Unix# vi /root/swatch/ssh.conf <= 設定ファイルの作成(ファイル名の末尾を .conf とする)
# /var/log/secure <= 1行目をコメントアウトし、監視ログファイルを指定
/Invalid user/
  exec "/root/authdrop.sh $_"
不正アクセスへの対応

不正アクセス対応スクリプトの作成

上記で指定したシェルスクリプトによりパケットフィルタを行う。
スクリプトのファイアウォールの操作部分は使用しているファイアウォールに合わせて設定する。
なお、不正アクセス先がDHCPで割り当てられたIPアドレスの可能性も考慮し、24時間後にルールを解除する。

Unix# vi /root/authdrop.sh <= スクリプトの作成
#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

LOGPATH="/var/log/dropip"
MAX=3


IP=`echo "$*" | awk '{print $10}'`
case "$IP" in
127.0.0.1)
  exit 0
  ;;
192.168.0.[0-9]*)
  exit 0
  ;;
*)
  echo "$*" >> "$LOGPATH"/"$IP"
  CNT=`cat "$LOGPATH"/"$IP" | wc -l`
  if [ "$CNT" -ge "$MAX" ]
  then
    「iptable」を使用している場合
    iptables -I INPUT -s "$IP" -j DROP > /dev/null 2>&1
    echo "iptables -D INPUT -s $IP -j DROP > /dev/null 2>&1" | at now+24hour > /dev/null 2>&1
    ここまで
    「IP Filter」を使用している場合
    echo "@1 block in quick from $IP to any" | ipf -f - > /dev/null 2>&1
    echo "echo \"block in quick from $IP to any\" | ipf -r -f - > /dev/null 2>&1" | at now+24hour > /dev/null 2>&1
    ここまで
    「Packet Filter」を使用している場合
    pfctl -t blacklist -Tadd "$IP" > /dev/null 2>&1
    echo "pfctl -t blacklist -Tdelete $IP > /dev/null 2>&1" | at now+24hour > /dev/null 2>&1
    ここまで
  fi
  ;;
esac

exit 0


Unix# chmod 700 /root/authdrop.sh <= 作成したスクリプトに実行権限付加
Unix# mkdir /var/log/dropip <= ログ格納用ディレクトリの作成
「Swatch」の実行

「Swatch」の起動

基本的な起動方法は以下の通り。

Unix# swatch -c /root/.swatchrc -t /var/log/message

「Swatch」の主な起動オプションは以下の通り。

オプション 説明
-c 設定ファイル
-t 監視対象のログファイル
--script-dir 「Swatch」起動後に作成されるスクリプトファイルのパスを指定。
例:--script-dir=/root

複数のログファイルを監視したい場合、必要分の設定ファイルを作成し、それぞれ起動オプションを指定し「Swatch」を複数起動する。

「Swatch」の起動スクリプト

起動スクリプトを以下のように作成する。
プロセス数の取得の為のpsコマンドのオプションはLinuxの場合なので、使用しているOSに合わせる。
なお、マシン起動時に自動的に起動するようにするには、それぞれのOSの起動スクリプトの実行の仕方に合わせて設定する。

Unix# vi /etc/init.d/swatch <= 起動スクリプトの作成
#!/bin/sh

PATH=/bin:/sbin:/usr/bin

# 起動中の「Swatch」のプロセス数を取得
CNT=`ps aux | grep swatch | grep -v "$0" | grep -v grep | wc -l`

case "$1" in
'start')
    if [ "$CNT" -eq 0 ]; then
        for CONF in `ls /root/swatch/*.conf`
        do
            LOG=`gawk 'NR == 1 {print $2}' $CONF`
            swatch -c $CONF -t $LOG &
            sleep 1
        done
        echo "Started: Swatch"
    else
        echo "Swatch has started"
    fi
    ;;
'stop')
    if [ "$CNT" -ne 0 ]; then
        for PID in `ps aux | grep swatch | grep -v "$0" | grep -v grep | awk '{print $2}'`
        do
            SCR=`ps up $PID | grep $PID | awk '{print $12}'`
            kill -KILL $PID
            if [ `expr "$SCR" : '.*script.*'` -gt 0 ]; then
                if [ "$SCR" != `which swatch` ]; then  # 万が一にも「Swatch」本体を消去しない為
                    rm -f $SCR                         # 「Swatch」停止後にもスクリプトファイルが残るので削除
                fi
            fi
        done
        echo "Stopped: Swatch"
    else
        echo "Swatch has stopped"
    fi
    ;;

'restart')
    $0 stop
    sleep 3
    $0 start
    ;;

'status')
    if [ "$CNT" -ne 0 ]; then
        echo "Swatch has started"
    else
        echo "Swatch has stopped"
    fi
    ;;

*)
    echo "Usage: $0 { start | stop | restart | status }"
    exit 1
    ;;
esac

exit 0


Unix# chmod 700 /etc/init.d/swatch <= 起動スクリプトに実行権限付加
ログローテーション時の対応

「Swatch」が監視しているログファイルがローテートされた場合、古いログを監視してしまう場合がある。
その為、念の為にローテートされた後に「Swatch」を再起動した方が無難である。
再起動はローテートが実行された後に上記で作成したスクリプトを実行すれば良い。
なお、実行方法はローテートソフトによって違うので、それぞれの設定方法に応じて変更。

▲ページのトップへ