mod_dosdetector でDoS対策

sugimotoです。

Apache のDoS対策として mod_dosdetector を使ったのでメモです。

1. mod_dosdetector の設定

インストールの方法などは「dos対策のmod_dosdetectorで特定のContentTypeは、対象外にする方法」というBlogがあったので参考にしました。

設定の書き方もいろいろなサイトに載っていましたが、静的ファイルをアクセス回数の対象外にする方法が正しくないところが多いようです。

静的ファイルの除外は DoSIgnoreContentType ディレクティブで設定しますが、

<IfModule dosdetector_module>
    ... 省略 ...
    DoSIgnoreContentType .(js|png|jpe?g|gif|css|ico)
</IfModule>

のような設定をしてテストしたところ、設定追加前と同じ回数でDoS判定されてしまいました。

このディレクティブは名前の通り Content-Type を設定するのが正しいので、次のように静的ファイルの Content-Type を設定すると正しく認識されました。

<IfModule dosdetector_module>
    ... 省略 ...
    DoSIgnoreContentType ^(image/|application/|text/javascript|text/css)
</IfModule>

2. 利用可能なディレクティブ

利用可能なすべてのディレクティブは以下の通りです。

DoSDetection
DoS判定をする/しないのフラグ(On/Off)
DoSThreshold
判定の閾値 – 注意レベル(回)
DoSHardThreshold
判定の閾値 – 警告レベル(回)
DoSPeriod
DoS判定をする基準時間(秒)
DoSBanPeriod
DoS認定したクライアントを再度開放するまでの時間(秒)
DoSShmemName
クライアントを保存するために保持するシェアードメモリの名前
DoSTableSize
クライアントを保存するためのテーブルのサイズ
DoSIgnoreContentType
アクセス回数としてカウントしないContent-Typeの指定

3. DoS認定されたクライアントの処理を追加する

Apache の設定ファイルに以下の設定を追加して、DoS認定(警告レベル)となったクライアントを「403 (FORBIDDEN)」にします

    RewriteEngine On
    RewriteCond %{ENV:SuspectHardDoS} .+
    RewriteCond %{REMOTE_ADDR} !^192\.168\.1\. # ローカルネットワークからのアクセスは無視
    RewriteCond %{REMOTE_ADDR} !^xxx\.xxx\.xxx\.xxx$ # テストユーザーからのアクセスは無視
    RewriteCond %{HTTP_USER_AGENT} !Googlebot
    RewriteCond %{HTTP_USER_AGENT} !Yahoo
    RewriteRule .* – [F,L]

なお、以下の場合はDoS判定しないように設定しています

  1. 192.168.1.* : ローカルネットワークからのアクセスは監視サーバーなどの自動アクセスがあるため除外
  2. xxx.xxx.xxx.xxx : 自社オフィスなどのIPアドレスからのアクセスはテストなどで頻繁にアクセスすることがあるため、除外しました
  3. Googlebot : Googleはインデックスされないと困るので。。。除外
  4. Yahoo : Yahooもインデックスされないと困るので。。。

4. DoS対策のテスト

設定のテストは Apache Bench を使うと簡単に実行できます。

> ab -n 1000 -c 3 -k http://xxxx.ciklone.com/xxxx
  • -n 1000 : 1000アクセスする負荷テストを実行
  • -c 3 : 同時アクセス数を 3 に設定

5. その他の負荷対策モジュール

最後にその他の負荷対策モジュールについても書いておきます。

ソフトウェアエンジニアのためのバグトラッキングシステム : Ciklone

ソフトウェアエンジニアのためのバグトラッキングシステム

ソフトウェアエンジニアのためのバグトラッキングシステム

Categorized: Apache

Comments are closed.