Apache DoS攻撃対策 – mod_evasive編

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

Leave a Reply

Your email address will not be published. Required fields are marked *