ApacheにおけるDoS攻撃対策手法
- 出典
- Software Design 2007年 09月号
- テスト環境
- CentOS5 テスト用最小インストール手順参照。
- apacheバージョン
- 2.2系
概要
- 動的なDos攻撃対策モジュール
- 万能ではない、これ重要!
- 以下のサードパーティモジュールを使う
- mod_evasive
- mod_dosdetector
mod_evasive
特徴
- 特定のIPアドレスから同じアドレスにリクエストが集中すると"403 Forbidden"を返す。
- ブラックリスト
- 自動登録・自動解除
インストール
apxsで
# cd /usr/local/src # tar zxvf mod_evasive_1.10.1.tar.gz # cd mod_evasive # apxs -a -i -c mod_evasive20.c
httpd.confを確認
LoadModule evasive20_module /usr/lib/httpd/modules/mod_evasive20.so
設定
<IfModule evasive20_module>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify admin@example.com
DOSSystemCommand "su - someuser -c '/sbin/... %s ...'"
DOSLogDir "/var/lock/mod_evasive"
#DOSWhiteList 127.0.0.1
</IfModule>
- DOSHashTable
- 各子プロセスごとのハッシュテーブルのサイズ。
- DOSPageCount
- 同じページ(URL)へのリクエスト数の上限しきい値。
- DOSSiteCount
- 同じサイトへのリクエスト数の上限しきい値。
- DOSPageInterval
- PageCountしきい値を算出する為の単位時間。デフォルト1秒。
- DOSSiteInterval
- SiteCountしきい値を算出する為の単位時間。デフォルト1秒。
- DOSBlockingPeriod
- IPアドレスをブラックリストに保持しておく時間
- DOSEmailNotify
-
ブラックリスト登録時にメール通知を行うアドレス。こんなメールが届きます。
From apache@test.example.com Tue Sep 11 21:38:19 2007 Date: Tue, 11 Sep 2007 21:38:18 +0900 From: Apache <apache@test.example.com> To: root@test.example.com To: root@test.example.com Subject: HTTP BLACKLIST 127.0.0.1 mod_evasive HTTP Blacklisted 127.0.0.1
- DOSSystemCommand
- ブラックリスト登録時に実行するコマンド。%sが対象IPアドレスに置き換わる。Firewallのルールに登録するなどするとIPSチックになる、と。
- DOSLogDir
- ロック処理のためのディレクトリ。/tmpがデフォルト。メール送信時に大量メールが送信されるのを防ぐためのロックっぽい。試してみたところ、アクセス拒否時間を過ぎても削除されずにメールが送られなかったので削除のタイミングがちと不明。(というか削除してるような箇所がソースにない。まさか手動?)
- DOSWhiteList
- 対象外アドレスを指定。ホワイトリスト。
気になったこと
- ソース内のtest.plでDoSれる。アクセス先が127.0.0.1なのでDOSWhiteListから外すか、test.plのIP変更。
- ブロック時はログにも記録される。/var/adm/messsagesだけど。
Sep 11 21:20:21 test mod_evasive[2597]: Blacklisting address 127.0.0.1: possible DoS attack.
- メール山ほどくるのも嫌だけどロックファイル削除されないのはどうかと。
mod_dosdetector
特徴
- はてな製!
- 二段階判定。
- いきなり拒否らない。
- それぞれの段階でDoSと判定されたら環境変数がフラグとして立つ。それをmod_rewriteでいろいろ使うっていうポリシー。
- 共有メモリを使うのでプロセス単位ではなくサーバ単位で判定。
インストール
apxsで
# cd /usr/local/src # tar zxvf mod_dosdetector-0.2.tar.gz # cd mod_dosdetector-0.2 # make install
httpd.conf確認
LoadModule dosdetector_module /usr/lib/httpd/modules/mod_dosdetector.so
設定
mod_dosdetectorはDoS判定しても環境変数をセットする「だけ」で他は何もしないので、mod_rewriteと組み合わせて使う。
httpd.confを確認して以下のエントリがあること。
LoadModule rewrite_module modules/mod_rewrite.so
以下、mod_dosdetectorの設定
<IfModule dosdetector_module>
DoSDetection on
DoSThreshold 5
DoSHardThreshold 10
DoSPeriod 60
DoSBanPeriod 60
DoSShmemName dosshm
DoSTableSize 100
</IfModule>
RewriteEngine On
RewriteCond %{ENV:SuspectHardDoS} .+
RewriteCond %{REMOTE_ADDR} !^{192¥.168¥.0¥.1}$
RewriteRule .* - [F,L]
RewriteCond %{ENV:SuspectDoS} .+
RewriteRule .* http://〜/ [P,L]
RewriteLog logs/rewrite_log
RewriteLogLevel 0
- DoSDetection
- DoS検出有効化
- DoSThreshold
- 第1段階のしきい値(コネクション数?)
- DoSHardThreshold
- 第2段階のしきい値(コネクション数?)
- DoSPeriod
- 判定時間
- DoSBanPeriod
- ブラックリスト保持時間
- DoSShmemName
- 共有メモリ名
- DoSTableSize
- 共有メモリ上のテーブルの大きさ
動作の仕組み
DoSPeriodの単位時間あたりのコネクション数が、まずDoSThresholdを超えると、SuspectDoS環境変数が設定される。
さらにその後、DoSHardThresholdを超えると、SuspectHardDoS環境変数が設定される。
それをmod_rewriteで参照して、処理を振り分けて使う。
- ちなみにテストしてみたところ、環境変数はそれぞれ別々に設定されるため、SuspectHardDoSの場合のルールを先に、SuspectDoSの場合のルールを後に書くのが正しい?(SuspectDoSを先に書くと、SuspectHardDoSのルールが実行されない?)
- ログはこんな感じ。
[Tue Sep 11 23:48:41 2007] [notice] dosdetector: '10.211.55.6' is suspected as DoS attack! (counter: 6) [Tue Sep 11 23:48:42 2007] [notice] dosdetector: '10.211.55.6' is suspected as Hard DoS attack! (counter: 11)
気になったこと
- ドキュメントなし。公開してみたものの業務が忙しくてドキュメントが追いついてないっぽい。
- 設定ファイルの内容とか間違ってなくない?
- 考え方として非常に運用的スタンスで共感できる。
- 共有メモリ使ってるのでロックのオーバーヘッドが心配だけど、はてなクラスでも問題なしらしい。
- 負荷とかボトルネックが心配だけど、リバースプロキシで動かしている限り、はてなクラスでも問題なしらしい。
その他
- こういうのは便利だけどやっぱり使いどころに注意。

