最近、流行っているのか知らないけれど、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)
不明点や質問など有れば、コメントください。
コメント
私が運用しているServersmanのサーバーでも最近、Dovecot認証アタックが急増していて大きな負荷になっていました。大変参考になりました。ありがとうございます
お世話になります。
/var/log/swatch/swatch.log より動作状況を確認したところ、以下のエラーメッセージが
表示され動きません。同じようなことはありましたでしょうか?
Error opening –script-dir=/tmp: そのようなファイルやディレクトリはありません at /root/.swatch_script.3890 line 88
tanakaさん
コメントありがとうございます。
/tmpディレクトリは作成したルールに基づいて、Perlスクリプトが作成されるディレクトリです。
# ls -la /
の結果に/tmpはありますか?
ない場合は以下手順で作成しましょう
# mkdir -m 1777 /tmp
ディレクトリがある場合は、正しいパーミッションであるか確認してください。
# ls -ld /tmp
# stat /tmp
trippyboy様
ご連絡有難うございます。
tmpディレクトリについてですがルート直下に存在しており
またパーミッションは777と書き込みが行える状態です。
宜しくお願い致します。
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行を実行してエラーになるか否かをご確認ください。
お世話になります。
ログを確認したところ、以下のエラーが記録されていました。対処法がございましたら教えてください。
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.
よろしくお願い致します。
saitoさま
find `perl -e ‘print “@INC”‘` -name ‘Tail.pm’ -print
上記コマンドを実行して、Tail.pmがあるか確認してください。
ご連絡ありがとうございます。
Tail.pmをインストールしたら、動作するようになりました。
ありがとうございました。
お世話になります
以下のエラーが出てしまいます。
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
すいませんさん。
コメントありがとうございます。
service swatch start の時点でのエラーと思われますが、
よろしければ「/etc/rc.d/init.d/swatch」の中身を見せていただけますでしょうか。
該当のエラーは、何かのコマンドに与えるオプションが存在しないと言っています。
設定ファイルを見直して何か気づく部分もあるかもしれません。
以上よろしくお願いいたします。
お世話になります
もしかして他サイトで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 は基本コピペしてますので相違ないと思います。
以下を確認してください。
0.CentOS5.x を利用している。
1.rpm -qa | grep swatch でswatchがインストールされていること。
2.which swatchでswatchのパスが参照出来ること
上記2点をクリアしている場合、initスクリプト内でのswatchの記述を
/からのフルパスにしてみてください。
すいません以下の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
お手数おかけいたします。
私が利用する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してみてください。つまりはファイルがあるかを確認してみてください。
無い場合、上述の方法でご確認を。
以上
rpm -ql swatch | grep swatch$
/usr/sausalito/swatch
/usr/sbin/swatch
やはりパッケージか違うようです。。。
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 ~]#
swatch-3.2.3.tar.gz を make してインストールしたところ
動きました。 yumでは違うパッケージがインストールされてしまうようです。
お騒がせいたしました。