MAKIZOU.COM

WEB系SEのホームページ作成&サーバ構築運用メモ

SWATCHによるログ常時監視で不正アクセス自動拒否

システムのログファイルを監視し、設定されたメッセージを検知してリアルタイムに任意の動作を起こすことが出来るSWATCHを導入して、不正アクセスが行えないようにします。
なお、自分でもSSH等でアクセスする際、パスワードを間違えるので、SWATCHが検知したIPアドレスからの累積不正アクセス数が3回以上になった場合、該当IPアドレスからのアクセスを行えないようにし、24時間後にアクセス制限を自動的に解除するようにします。

■必要なPerl5モジュールのインストール

  • Date::Calc
  • Date::Parse
  • File::Tail
  • Time::HiRes

# perl -MCPAN -e shell
cpan> install Date::Calc
cpan> install Date::Parse
cpan> install File::Tail
cpan> install Time::HiRes
cpan> install Date::Manip
※CPANの要求するままにインストールをしました。

■SWATCHインストール
# cd /usr/local/src/
# wget http://downloads.sourceforge.net/swatch/swatch-3.2.2.tar.gz?modtime=1186769620&big_mirror=0
# tar zxvf swatch-3.2.2.tar.gz
# cd swatch-3.2.2
# perl Makefile.PL
# make
# make test
# make install

■SWATCHアクションスクリプト作成
# vi /usr/local/bin/swatch_action.sh
以下をコピー&ペースト

#!/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

# chmod 700 /usr/local/bin/swatch_action.sh

■SWATCH設定ファイル格納ディレクトリ作成
# mkdir /etc/swatch

■SWATCHログ切替え設定ファイル作成
# vi /etc/logrotate.d/swatch

/var/log/swatch/swatch.log {
	missingok
	notifempty
	sharedscripts
	postrotate
		/etc/rc.d/init.d/swatch restart > /dev/null || true
	endscript
}

■/var/log/messages監視用設定ファイル作成
# vi /etc/swatch/messages.conf

# logfile /var/log/messages

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

■/var/log/secure監視用設定ファイル作成
# vi /etc/swatch/secure.conf

# 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 lock"

watchfor /sshd.*Illegal user/
	pipe "/usr/local/bin/swatch_action.sh 10 lock"

■SWATCH起動スクリプト作成
# vi /etc/rc.d/init.d/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 stoped"
	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

SWATCH起動スクリプトへ実行権限付加
# chmod +x /etc/rc.d/init.d/swatch

SWATCH起動
# /etc/rc.d/init.d/swatch start

SWATCH起動スクリプトをcheconfigへ登録
# chkconfig --add swatch

SWATCH自動起動設定
# chkconfig swatch on

SWATCH自動起動設定(確認)
# chkconfig --list swatch

■IPアドレスの規制状態は以下のコマンドで確認可能
iptablesによる受信拒否ルールの照会
# iptables -L INPUT -n|grep DROP

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アドレスの規制解除予約状態は以下のコマンドで確認可能
※下記例の場合、iptablesによるアクセス拒否ルールの削除コマンドが、
 2006-02-04 09:32と2006-02-04 09:33に予約されている

atコマンドによる予約キューの照会
# atq|sort

114 2006-02-04 09:32 a root
115 2006-02-04 09:33 a root

atコマンドにより予約されている処理の照会
# at -c 114|tail -2

iptables -D INPUT -s XXX.XXX.XXX.XXX -j DROP > /dev/null 2>&1

atコマンドにより予約されている処理の照会
# at -c 115|tail -2

iptables -D INPUT -s XXX.XXX.XXX.XXX -j DROP > /dev/null 2>&1

  • カテゴリ:Web開発
  • 公開日:
  • 1つ星2つ星3つ星4つ星5つ星
    Loading ... Loading ...
    ↑ 記事評価をお願いします。

コメント&トラックバック

トラックバック用URL

コメント




使用できるXHTMLタグ <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>