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と違って二段階式の判定方式ではなく、条件マッチで即拒否になるので、
その点を注意したいところ。