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 ...