mod_dosdetector でDoS攻撃を503 ビジーにする方法

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

コメントを残す