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判定しないように設定しています
- 192.168.1.* : ローカルネットワークからのアクセスは監視サーバーなどの自動アクセスがあるため除外
- xxx.xxx.xxx.xxx : 自社オフィスなどのIPアドレスからのアクセスはテストなどで頻繁にアクセスすることがあるため、除外しました
- Googlebot : Googleはインデックスされないと困るので。。。除外
- Yahoo : Yahooもインデックスされないと困るので。。。
4. DoS対策のテスト
設定のテストは Apache Bench を使うと簡単に実行できます。
> ab -n 1000 -c 3 -k http://xxxx.ciklone.com/xxxx
- -n 1000 : 1000アクセスする負荷テストを実行
- -c 3 : 同時アクセス数を 3 に設定
5. その他の負荷対策モジュール
最後にその他の負荷対策モジュールについても書いておきます。
- mod_cband : 帯域と同時接続の制限
- mod_limitipconn : 同一IPからの同時接続を制限する
- mod_bwshare : 同一IPの帯域、接続数を制限する
- mod_access_limit : 全アクセス数を制限?? – 活動していないかも。。