Top/Linux/Swatch

Swatch の変更点はてなブックマーク


ログ監視ツール。
-[[オフィシャル>http://swatch.sourceforge.net/]]

*sshdに対する不正アクセスを動的に防ぐ
sshdのログを監視し、特定のパターンが見つかったときに、接続元IPからのアクセスを禁止するルールをパケットフィルタに追加する。アクセス禁止は一定時間後に自動解除することも可能。

**必要なもの
-Swatch
-iptables
-at (自動解除する場合)

**予めディレクトリを作成
 mkdir /var/log/swatch

**起動スクリプト
 vi /etc/init.d/swatch
>
#code(bash,nonumber,nooutline){{
#!/bin/sh

PATH="/sbin:/bin:/usr/sbin:/usr/bin"
NAME="swatch"
DAEMON="/usr/bin/swatch"
DESC="simple watcher"
CONFFILE="/etc/swatch.conf"
#LOGFILE="/var/log/secure"
LOGFILE="/var/log/auth.log"
PIDFILE="/var/run/swatch.pid"
SCRIPTDIR="/var/log/swatch"
OPTS="--config-file $CONFFILE --tail-file $LOGFILE --pid-file=$PIDFILE \
	--script-dir=$SCRIPTDIR --awk-field-syntax --daemon"

test -x $DAEMON || exit 0

start() {
	if [ ! -f "$CONFFILE" ]; then
		echo "Error: $CONFFILE does not exist."
		exit 1
	fi
	if [ ! -f "$LOGFILE" ]; then
		echo "Error: $LOGFILE does not exist."
		exit 1
	fi
	if [ -f "$PIDFILE" ]
	then
		echo "Error: $NAME is already running."
	else
		$DAEMON $OPTS
	fi
}

stop() {
	if [ -f "$PIDFILE" ]
	then
		PID=`cat $PIDFILE`
		if ps h $PID > /dev/null
		then
			pkill -P $PID
		else
			echo "Error: $NAME is not running, but PID file exists. Deleting it."
		fi
		rm -f $PIDFILE
	else
		echo "Error: $NAME is not running."
	fi
}

case "$1" in
  start)
	echo "Starting $DESC: $NAME"
	start
	;;
  stop)
	echo "Stopping $DESC: $NAME"
	stop
	;;
  restart)
	echo "Restarting $DESC: $NAME"
	stop
	sleep 1
	start
	;;
  *)
	echo "Usage: $0 start|stop|restart"
	exit 1
	;;
esac

exit 0
}}
<
 chmod a+x /etc/init.d/swatch
 update-rc.d swatch defaults 99

-起動スクリプトや対象ログファイルの場所はディストリビューションによって違います。上はDebianでの例。RedHat系ではそれぞれ /etc/rc.d/init.d/swatch 、 /var/log/secure として下さい。

**ログローテート時にSwatchを再起動
ログローテート時に不具合が生じるので、Swatchを再起動するようにして下さい。
-Debianなら /etc/cron.daily/sysklogd の最終行に次を追加。
 /etc/init.d/swatch restart > /dev/null
-RedHat系なら /etc/logrotated.d/syslog の /var/log/secure の項に次を追加。
 postrotate
 	/etc/init.d/swatch restart > /dev/null
 endscript

**設定
 vi /etc/swatch.conf
>
 watchfor	/Did not receive identification string from/
 	exec "/sbin/iptables -A INPUT -s $12 -j DROP"
 watchfor	/Illegal user/
 	exec "/sbin/iptables -A INPUT -s $10 -j DROP"
 #	exec "echo '/sbin/iptables -D INPUT -s $10 -j DROP' | at now+30min"
 watchfor	/Authentication failure for root/
 	exec "/sbin/iptables -A INPUT -s $13 -j DROP"
<
-ログの書式は環境によって違います。上はDebian sargeでの例。
-コメント部を有効にすれば、Illegal userは30分で解除するようになります。

**起動
 /etc/init.d/swatch start

**テスト方法
+/etc/swatch.confのDROPの箇所をACCEPTに変える
+Swatchを起動
+不正な感じでアクセス
+iptables -Lでルールが追加されていることを確認
+iptables -Fでルールを全消去
+Swatchを停止
+1.を元に戻す

**備考
-エラーログを監視しているだけなので、すんなり入られれば終わりです。
-/etc/ssh/sshd_configでの設定(待ちうけポートの変更、rootでのログインの禁止、パスワード認証から公開鍵認証への切り替えなど)も併せて行った方がいいと思います。
-iptablesを他の用途にも使っている方は専用のchainを作って下さい。
-攻撃者がIP Spoofingしていた場合、任意のIPをアクセス禁止にさせられてしまうかも???
-rebootで消えないように定期的にiptables-saveして下さい。

*関連
-[[Linux/OpenSSH]]
-[[Linux/Swatch]]

*参考
-[[void GraphicWizardsLair( void ); // sshdに無差別にアクセスしているIPを動的検知してファイアーウォールに登録する>http://www.otsune.com/diary/2004/10/29/7.html#200410297]]
>Swatch+ipfilter/ipfw
<
-[[Protect SSH From Hackers>http://home.gagme.com/greg/linux/protect-ssh.php]]
>Swatch+route+at~
パケットフィルタリングツールをインストールする必要がないので良さそう。ただ、loに繋ぐってどうなんでしょう。それと、man routeするとrejectの項には "This is NOT for firewalling." って書いてあるし。。。
<
-[[[linux-users:104973] Re: SSHの大量不正アクセスログ>http://search.luky.org/linux-users.a/msg04927.html]]
>シェルスクリプト+iptables+at
<
-[[ギャラクシードリンク 宇宙味>http://d.hatena.ne.jp/kanata_ail/20050802#1123032145]]
>シェルスクリプト+pf
<
**気になる
-[[Welcome to DenyHosts>http://denyhosts.sourceforge.net/]]
>sshdログを監視して不信なIPをtcp_wrapperを使ってアクセス禁止に(/etc/hosts.denyに追加)するPythonで書かれたツール
<
--[[2005年 9月 (1)。>http://tabesugi.net/memo/2005/91.html#061231]] /etc/hosts.denyを書き換えることについての考察
-[[BlockHosts - automatic blocking of abusive ssh hosts | A C Zoom>http://www.aczoom.com/cms/blockhosts]]
>同上。マニュアルにThis script was inspired by: DenyHostsって書いてある。
<
-[[SourceForge.net: Sentry Tools>http://sourceforge.net/projects/sentrytools/]]
>
<

*Amazon
#amazon(4873112044,left)
#amazon(4873112060,left)
#amazon(4873110793,left)
#amazon(4894714507,left)
差分 一覧