3月 302011
 
シェアする

最近、流行っているのか知らないけれど、Dovecot認証によるサーバの負荷を上げる
一種のDOSアタックが散見される。

今までは独自に作成したシェルスクリプトによって各種ログより認証に失敗している接続元
を特定し、iptablesに追加するということを行っていたが、拒否されたものは手動で解除する
必要があり、どんどん溜まっていくのでこれを機に、「swatch」の導入を行なうことにした。

「swatch」を「yum」コマンドでインストールするのだが、yumでインストールできるように
以下を参照し「RPMforge」のリポジトリのインストールをしておく必要がある

RPMforgeのrepoを追加するの巻@ServersMan

 

1. 「swatch」と「at」をインストールする。

「at」は定時に指定したコマンドを実行するプログラムだ。

# yum -y install swatch at

2. swatchで確認した接続元IPアドレスを処理するスクリプトを用意する。

以下の条件に一致した場合iptablesを用いて1時間接続を拒否する設定。
設定する監査対象ログと判定された回数が5回以上
接続元がローカルホスト(127.0.0.1)でない

# vi /usr/local/bin/swatch_action.sh
「vi」の操作方法
1.[ESC]を押してから[i]を押し、画面下に「-- INSERT --」の表示を確認してから以下内容をコピペ
2.編集が完了したら[ESC]を押してから[:wq]と入力し[Enter]で保存
#!/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アドレスが127.0.0.1の場合は終了
if [ "$IPADDR" = "127.0.0.1" ]; then
exit
fi

# 不正アクセスログメッセージをIPアドレス別ログファイルに記録
echo $LOG >> /var/log/swatch/$IPADDR

# IPアドレス別ログファイルから累積不正アクセス数取得
cnt=`cat /var/log/swatch/$IPADDR | wc -l`

# 該当IPアドレスからの累積不正アクセス数が5以上の場合または
# 引数でlockと指定された場合アクセス規制
if [ $cnt -ge 5 ] || [ $# -eq 2 -a  "$2" = "lock" ]; then
# 該当IPアドレスからのアクセスを拒否するルールを挿入
iptables -I INPUT -s $IPADDR -j DROP

# 上記ルールを1時間後に削除するスケジュールを登録
echo "iptables -D INPUT -s $IPADDR -j DROP > /dev/null 2>&1" | \
at now+1hour > /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

4.作成したスクリプトに実行権限を付与する

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

5. 設定ファイルを設置するディレクトリを作成する

# mkdir /etc/swatch

6. 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
}

7.ログを監視する為の設定ファイルを作成

# vi /etc/swatch/secure.conf

以下内容を記述し保存

# logfile /var/log/secure
watchfor /dovecot-auth.*authentication failure/
 pipe "/usr/local/bin/swatch_action.sh 14"
 throttle=00:00:10

上記は、以下の条件のログを監査する
・ログファイル「/var/log/secure
・「dovecot-auth ○○ authentication failure」を含む
・対象ログのスペース区切りの14番目にログ情報がある

もし以下のように「lock」を指定すると一度でもログが確認されると
すぐに拒否する設定になる

# logfile /var/log/secure
watchfor /dovecot-auth.*authentication failure/
 pipe "/usr/local/bin/swatch_action.sh 14 lock"
 throttle=00:00:10

例:

Mar 30 02:16:17 trippyboy dovecot-auth: pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser= rhost=::ffff:183.83.127.82

8.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 stopped"
 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

9.swatch起動スクリプトに実行権限付与

# chmod +x /etc/rc.d/init.d/swatch

10.swatch起動

# service swatch start

11.swatchがサーバ起動時に自動起動するように設定する

# chkconfig --add swatch
# chkconfig swatch on

12.atd起動

# service atd start

以上の作業でDovecot認証アタックが発生した場合には、該当の接続元からのアクセスを
1時間制限することが出来るようになった。

/var/log/secure 以外にも、/var/log/maillog, /var/log/messagesなどで特定のログを
対象に接続制限を行ないたい場合には、上記内容を参考に/etc/swatch/maillog.confなど
を作成すれば同様に処理が行なわれる。

上記内容は以下URLを参考にしました。内容には若干の差異があります。
ログ監視ツール導入(SWATCH)

不明点や質問など有れば、コメントください。

このエントリーをはてなブックマークに追加

  17 コメント

  1. 私が運用しているServersmanのサーバーでも最近、Dovecot認証アタックが急増していて大きな負荷になっていました。大変参考になりました。ありがとうございます

  2. お世話になります。
    /var/log/swatch/swatch.log より動作状況を確認したところ、以下のエラーメッセージが
    表示され動きません。同じようなことはありましたでしょうか?

    Error opening –script-dir=/tmp: そのようなファイルやディレクトリはありません at /root/.swatch_script.3890 line 88

  3. tanakaさん

    コメントありがとうございます。
    /tmpディレクトリは作成したルールに基づいて、Perlスクリプトが作成されるディレクトリです。

    # ls -la /
    の結果に/tmpはありますか?

    ない場合は以下手順で作成しましょう

    # mkdir -m 1777 /tmp

    ディレクトリがある場合は、正しいパーミッションであるか確認してください。

    # ls -ld /tmp
    # stat /tmp

  4. trippyboy様

    ご連絡有難うございます。

    tmpディレクトリについてですがルート直下に存在しており
    またパーミッションは777と書き込みが行える状態です。

    宜しくお願い致します。

  5. tanaka様

    /etc/initd.d/swatchに渡されている各種値が正しく取れているか、/etc/init.d/swatchを編集して、出力してみてください。

    /etc/init.d/swatchの「WATCHLOG=`grep “^# logfile” $conf | awk ‘{ print $3 }’`」の下に以下を追加してください。
    —-
    echo $WATCHLOG >> /tmp/log
    echo “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” >> /tmp/log
    —-

    この状態で、/tmp/logに出力されるswatchのコマンド1行を実行してエラーになるか否かをご確認ください。

  6. お世話になります。
    ログを確認したところ、以下のエラーが記録されていました。対処法がございましたら教えてください。

    Can’t locate File/Tail.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /tmp/.swatch_script.30452 line 90.
    BEGIN failed–compilation aborted at /tmp/.swatch_script.30452 line 90.

    よろしくお願い致します。

  7. saitoさま

    find `perl -e ‘print “@INC”‘` -name ‘Tail.pm’ -print

    上記コマンドを実行して、Tail.pmがあるか確認してください。

  8. ご連絡ありがとうございます。
    Tail.pmをインストールしたら、動作するようになりました。

    ありがとうございました。

  9. お世話になります
    以下のエラーが出てしまいます。
    Unknown option: pid-file
    Unknown option: config-file
    Unknown option: tail-file
    Unknown option: script-dir
    Unknown option: awk-field-syntax
    Unknown option: use-cpan-file-tail
    Unknown option: daemon

  10. すいませんさん。

    コメントありがとうございます。
    service swatch start の時点でのエラーと思われますが、
    よろしければ「/etc/rc.d/init.d/swatch」の中身を見せていただけますでしょうか。

    該当のエラーは、何かのコマンドに与えるオプションが存在しないと言っています。
    設定ファイルを見直して何か気づく部分もあるかもしれません。

    以上よろしくお願いいたします。

  11. お世話になります
    もしかして他サイトでPerlモジュールについて書かれていましたがPerlのモジュールを入れていないからでしょうか?

    最初にエラーが以下です
    /etc/init.d/swatch: line 25: swatch: command not found

    次にエラーのline 25:フルパスを追記しました。

    /usr/sbin/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

    すると以下のエラーとなりますた。
    Unknown option: config-file
    Unknown option: tail-file
    Unknown option: script-dir
    Unknown option: awk-field-syntax
    Unknown option: use-cpan-file-tail
    Unknown option: daemon
    Unknown option: pid-file

    /etc/rc.d/init.d/swatch は基本コピペしてますので相違ないと思います。

  12. 以下を確認してください。

    0.CentOS5.x を利用している。

    1.rpm -qa | grep swatch でswatchがインストールされていること。

    2.which swatchでswatchのパスが参照出来ること

    上記2点をクリアしている場合、initスクリプト内でのswatchの記述を
    /からのフルパスにしてみてください。

  13. すいません以下の0、1、3は既に行なっていました。

    0.CentOS5.x を利用している。
    1.rpm -qa | grep swatch でswatchがインストールされていること。
    2.which swatchでswatchのパスが参照出来ること

    1,2,3行いすると以下のエラーとなりました。

    Unknown option: config-file
    Unknown option: tail-file
    Unknown option: script-dir
    Unknown option: awk-field-syntax
    Unknown option: use-cpan-file-tail
    Unknown option: daemon
    Unknown option: pid-file

    お手数おかけいたします。

  14. 私が利用するswatchのパスは「/usr/bin/swatch」です。

    [root@vps1 ~]# rpm -ql swatch | grep swatch$
    /usr/bin/swatch
    /usr/share/doc/swatch-3.2.3/tools/reswatch
    [root@vps1 ~]#

    エラーとなっている行で指定している「swatch」のパスをlsしてみてください。つまりはファイルがあるかを確認してみてください。
    無い場合、上述の方法でご確認を。

    以上

  15. rpm -ql swatch | grep swatch$
    /usr/sausalito/swatch
    /usr/sbin/swatch

    やはりパッケージか違うようです。。。

  16. rpmforgeのレポジトリを指定してインストールしてみてはいかがでしょう。

    yum –enablerepo=rpmforge install swatch

    その前に現行のswatchの削除を

    yum erase swatch

    [root@vps1 ~]# yum repolist | grep rpm
    rpmforge RHEL 5 – RPMforge.net – dag 11279
    [root@vps1 ~]#
    [root@vps1 ~]# yum –enablerepo=rpmforge info swatch
    Loaded plugins: priorities
    Excluding Packages in global exclude list
    Finished
    Installed Packages
    Name : swatch
    Arch : noarch
    Version : 3.2.3
    Release : 2.el5
    Size : 101 k
    Repo : installed
    Summary : Tool for actively monitoring log files
    URL : http://swatch.sourceforge.net/
    License : GPLv2+
    Description: The Simple WATCHer is an automated monitoring tool that is capable
    : of alerting system administrators of anything that matches the
    : patterns described in the configuration file, whilst constantly
    : searching logfiles using perl.

    [root@vps1 ~]#

  17. swatch-3.2.3.tar.gz を make してインストールしたところ
    動きました。 yumでは違うパッケージがインストールされてしまうようです。
    お騒がせいたしました。

コメント大歓迎!質問も受け付けておりますヽ(*´∀`)ノ