DoS攻撃対策でApacheのmod_evasiveモジュールを使ってみました。mod_evasiveは一定時間に同じサイトから来るアクセスをブロックし、一定時間アクセスを禁止するモジュールです。モジュールはソースからインストールしました。

mod_evasiveのダウンロードは、下記のURLからできます。
http://www.zdziarski.com/blog/?page_id=442

1. mod_evasiveのインストール
 ダウンロードしたソースを「/usr/local/src/」に移動してインストールを開始します。
[root@localhost src]# tar zxvf mod_evasive_1.10.1.tar.gz
[root@localhost src]# cd mod_evasive
[root@localhost mod_evasive]# /usr/local/apache2/bin/apxs -i -a -c mod_evasive20.c

(確認作業)
[root@localhost mod_evasive]# ls -la /usr/local/apache2/modules/
c mod_evasive20.c ←が見つかればOK

2. mod_evasiveの設定
[root@localhost ~]# vi /usr/local/apache2/conf/httpd.conf

httpd.confファイルの確認と追記

モジュールが追加されているかどうか確認する
LoadModule evasive20_module modules/mod_evasive20.so

最後に追記
<IfModule mod_evasive20.c>
 DOSHashTableSize 3097
 DOSPageCount 3 (←1秒間に3回アクセスがあった場合)
 DOSSiteCount 50 (←サイトに50回アクセスがあった場合)
 DOSPageInterval 2
 DOSSiteInterval 1
 DOSBlockingPeriod 60 (←60秒間アクセスを拒否)
 DOSWhitelist 127.0.0.1 192.168.1.*
 DOSEmailNotify example@example.com
 DOSLogDir “/usr/local/apache2/logs/mod_evasive_log”
</IfModule>

(設定項目について)
DOSHashTableSize
各子プロセスでのハッシュテーブル・サイズ。サイズを大きくするとパフォーマンスは良くなりますがメモリを消費します

DOSSiteCount
同じサイトから「DOSSiteInterval」で指定した時間(秒)内にアクセスがあった場合「403」を返す

DOSSiteInterval
「DOSSiteCount」の設定値(秒)

DOSPageCount
同じページに「DOSPageInterval」で指定した時間(秒)内にアクセスがあった場合「403」を返す

DOSPageInterval
デフォルト:1秒間隔

DOSBlockingPeriod
IPアドレスを遮断する時間(秒)。この遮断されている間のアクセスには403 (Forbidden)を返します

DOSWhitelist
検出対象外とするIPアドレス

DOSEmailNotify
ブラックリスト登録時にメール通知を行うアドレス

DOSLogDir
ログファイルの設定

アパッチの再起動
[root@web mod_evasive]# /usr/local/apache2/bin/apachectl restart

Apacheのベンチマーク測定(mod_evasiveモジュールの確認)
 Apacheのベンチマーク「ab」コマンドでmod_evasiveモジュールの確認作業をします。今回httpd.confファイルに記述した設定では、「DOSWhitelist」でローカルからのアクセスをスキップしていますので、この一文をコメントアウトするか、外部からベンチマークしてください。

[root@localhost src]# /usr/local/apache2/bin/ab -n 50 -c 10 http://(確認したいwebページ)

(「ad」コマンドの説明)
-n 数字 ←連続アクセス回数
-c 数字 ←同時アクセスする件数
-A ユーザー名:パスワード ←ベーシック認証ページを測定する場合

 以上のようにベンチマークを測定し、mod_evasiveモジュールの入れる前といれた後を比べてみてください。また、アクセスログファイルを見ると、403(Forbidden)になっています。