| トップ | Solaris | FreeBSD | Gentoo | CentOS | Fedora | Windows | Tips | 自宅サーバの動作確認 | サイト内検索(Namazu) | サイト内検索(HE) |
出力されたログをリアルタイムで監視し、不正アクセスを遮断するために「Swatch」を導入する。
遮断するファイアウォールには「iptables」、
「IP Filter」、
「Packet Filter」、
のいずれかを用いるものとする。
よって、それぞれの設定はすでに完了済みとする。
なお、「iptables」の設定については、Linuxの自宅サーバの構築のページを参照。
また、「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=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」の起動
基本的な起動方法は以下の通り。
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」を再起動した方が無難である。
再起動はローテートが実行された後に上記で作成したスクリプトを実行すれば良い。
なお、実行方法はローテートソフトによって違うので、それぞれの設定方法に応じて変更。