Top/Linux/Swatch

Swatchはてなブックマーク

ログ監視ツール。

sshdに対する不正アクセスを動的に防ぐ

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

必要なもの

  • Swatch
  • iptables
  • at (自動解除する場合)

予めディレクトリを作成

mkdir /var/log/swatch

起動スクリプト

vi /etc/init.d/swatch
#!/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

テスト方法

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

備考

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

関連

参考

気になる

Amazon

差分 一覧