ApacheのDoS攻撃対策には、色々なモジュールが用意されてる。
有名どころだと、はてな製のmod_dosdetector、ITProでも紹介されたmod_evasiveだろうか。
これまで、mod_dosdetectorを利用してきたけど、今回はmod_evasiveを導入してみた。
モジュール、mod_evasive
サーバ環境は、 CentOS/5.5 (64bit版) , Apache/2.2.15
mod_evasive インストール
apxsコマンドでApacheにモジュールを追加するので、mod_so.cが必要。
mod_so.cがない場合は、yumからhttpd-develを事前にいれておく。
# httpd -l
core.c
prefork.c
http_core.c
mod_so.c ←これがあること
# cd /usr/local/src/
# wget http://www.zdziarski.com/blog/wp-content/uploads/2010/02/mod_evasive_1.10.1.tar.gz
# tar zxvf mod_evasive_1.10.1.tar.gz
# cd mod_evasive
# vi mod_evasive20.c
# define MAILER "/bin/mail %s"
↓
# define MAILER "/bin/mail -s 'DOS Alert! - {*ホスト名*}' %s"
# apxs -i -a -c mod_evasive20.c
# chmod 755 /usr/lib64/httpd/modules/mod_evasive20.so
# rm -rf mod_evasive_1.10.1.tar.gz
デフォルトだと通知メールの件名がなしになるので、
コンパイル前に、mod_evasive20.cを編集して任意の件名をつけておく。
mod_evasive 設定
ログ保管ディレクトリの作成
# mkdir /var/log/mod_evasive/ # chown apache. /var/log/mod_evasive/
mod_evasive設定
下記いづれかの条件にマッチした時に、Dos攻撃とみなして、
600秒アクセス禁止(403error)にし、alert@ijo.ccへ拒否IPをメールで通知する。
- 条件1: 同一ページへ、2秒間に3回のリクエストがあった場合
- 条件2: 同一サイトへ、1秒間に30回のリクエストがあった場合
# vi /etc/httpd/conf/httpd.conf
LoadModule evasive20_module /usr/lib/httpd/modules/mod_evasive20.so <-自動追加される.
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 3
DOSSiteCount 30
DOSPageInterval 2
DOSSiteInterval 1
DOSBlockingPeriod 600
DOSWhitelist 127.0.0.1 192.168.1.*
DOSLogDir "/var/log/mod_evasive"
DOSEmailNotify alert@ijo.cc
</IfModule>
Apache再起動
# httpd -t Syntax OK # service httpd restart
mod_evasive 挙動テスト
mod_evasiveディレクトリにテスト用のPerlが入ってるので、
これを使って、mod_evasiveが正しく動作するか確認する。
httpd.confで、localhostを除外しているなら、外部からテストを行うこと。
Perl実行結果が、下記のように、途中から403が表示されればOK.
# /usr/local/src/mod_evasive/test.pl HTTP/1.1 200 OK HTTP/1.1 200 OK ・ ・ HTTP/1.1 200 OK HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden
mod_evasiveログを確認。拒否IP単位で記録される。
# ll /var/log/mod_evasive/ -rw-r--r-- 1 apache apache 6 11月 3 14:45 dos-xxx.xxx.xxx.xxx
システムログを確認。Blacklistingのログが残る。
# tail -fn10 /var/log/messages Nov 3 14:45:09 sv01 mod_evasive[32399]: Blacklisting address xxx.xxx.xxx.xxx: possible DoS attack.
通知先に下記のようなメールが届く
件名: DOS Alert! - sv01.ijo.cc ───────────────── To: alert@ijo.cc Subject: HTTP BLACKLIST xxx.xxx.xxx.xxx mod_evasive HTTP Blacklisted xxx.xxx.xxx.xxx
あとは、実際に運用してみて、DoS攻撃判定の具合をみながら、適正な値に調整していけばOK。
mod_dosdetectorと違って二段階式の判定方式ではなく、条件マッチで即拒否になるので、
その点を注意したいところ。