WebサイトへのDoS攻撃に対処するため mod_dosdetector-fork をインストールしてみたけど、RewriteRule で 503 に飛ばせないとお嘆きの諸氏に。
■ mod_dosdetector-fork インストール
(1) ビルド環境などの準備
yum -y install make gcc gcc-c++ yum -y install unzip yum -y install httpd-devel yum -y install git
(2) Apache2.2環境にインストール
Apache 2.2で使用したい場合は maint-1.0.0 を入れる。
cd /usr/local/src wget https://codeload.github.com/tkyk/mod_dosdetector-fork/zip/maint-1.0.0 mv maint-1.0.0 mod_dosdetector-fork-maint-1.0.0.zip unzip mod_dosdetector-fork-maint-1.0.0.zip cd mod_dosdetector-fork-maint-1.0.0 make make install
(3) Apache2.4環境にインストール
Apache 2.4で使用したい場合は git で最新を入れる。
cd /usr/local/src git clone git://github.com/tkyk/mod_dosdetector-fork.git cd mod_dosdetector-fork make make install
■ mod_dosdetector-fork 設定
設定ファイルサンプルをコピー
cp dosdetector-sample.conf /etc/httpd/conf.d/dosdetector.conf
vi /etc/httpd/conf.d/dosdetector.conf
...
# Mod_DoSDetector configuration
DoSDetection on
DoSPeriod 5
DoSThreshold 20
DoSHardThreshold 35
DoSBanPeriod 30
DoSTableSize 100
DoSShmemName mod_dosdetector
...
# send a 503 response with mod_rewrite
# ↓サンプルの問題はここ
# <Directory>などで囲まれていないけど、
# <Directory>か<VirtualHost>に書かないと有効にならない
<Directory /home>
RewriteEngine On
RewriteCond %{ENV:SuspectHardDoS} =1
RewriteRule .* - [R=503,L]
RewriteCond %{ENV:SuspectDoS} =1
RewriteRule .* - [R=503,L]
</Directory>
対象のディレクトリ配下に .htaccess がある場合はさらに注意!
.htaccess の中でも RewriteEngine On して独自にルールを書いている場合は、そこに dosdetector のぶんも書かないと有効にならないです。
DoSBanPeriod は、DoS判定されたIPをBANする時間ですが、これは SuspectDoS=1 を維持する時間であって、SuspectHardDoS=1 を維持する時間ではないことに注意!
SuspectHardDoS は、アクセス数が DoSHardThreshold より少なくなったら直ちに解除されるようなので、これを使って 503 へ飛ばすルールしか書いていないと DoSBanPeriod より早く解除される挙動になります。
あと、RewriteRule でエラードキュメントに飛ばすには、
httpd.conf のほうの Directory “/var/www/error” に FollowSymLinks が必要です。
■ 503エラーHTML変更
vi /var/www/error/503.html
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <h2>現在、ページが閲覧しにくい状態となっております。</h2> <p>ご迷惑をおかけして大変申し訳ございません。</p> <p>これは障害やサーバーダウンではなく、アクセス集中によるビジー状態です。</p> <p>しばらくお時間をおいて再度アクセスしていただけますよう、よろしくお願い申し上げます。</p> </body> </html>
vi /etc/httpd/conf/httpd.conf
...
<Directory "/var/www/error">
#Options IncludesNoExec
Options IncludesNoExec FollowSymLinks
...
...
ErrorDocument 503 /error/503.html
...
