mod_dosdetectorはDoS攻撃を検知するApacheのモジュールです。
公式サイトは
http://sourceforge.net/projects/moddosdetector/
です。
コンパイルに必要なパッケージをインストール。
yum install make httpd-devel gcc
mod_dosdetectorのソースをダウンロード
curl -LO http://downloads.sourceforge.net/project/moddosdetector/moddosdetector/version-0.2/mod_dosdetector-0.2.tar.gz
※↑は2013/06/18時点でのURLです。
ソースを展開してインストール
tar xzvf mod_dosdetector-0.2.tar.gz
cd mod_dosdetector-0.2
make
make install
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib64/httpd/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/lib64/httpd/modules/mod_dosdetector.so
[activating module `dosdetector' in /etc/httpd/conf/httpd.conf]
usr/lib64/httpd/modulesにモジュールが配置され、httpd.confにもLoadModule行が追加されたことがわかります。
httpdをrestartします。
service httpd restart
これでインストールは完了です。
続いてhttpd.confに設定を入れます。以下が設定サンプルと各設定項目の説明です。
DoSDetection On
DoSPeriod 10
DoSThreshold 10
DoSHardThreshold 20
DoSBanPeriod 15
DoSTableSize 10
DoSIgnoreContentType image/*
DoSDetection
…mod_dosdetectorを使うか。使う場合はOn。
DoSThreshold
…DoS攻撃を検知する際のしきい値。これを越えたクライアントの環境変数にはSuspectDoSに1が設定されます。
DoSHardThreshold
…DoS攻撃を検知する際のしきい値(ハードリミット)。これを越えたクライアントの環境変数にはSuspectHardDoSに1が設定されます。
DoSPeriod
…DoS攻撃を検知するまでの期間。この期間内にDoSThresholdやDoSHardThresholdを超えるとDoS攻撃として検知します。
DoSBanPeriod
…クライアントをBanし続ける期間。これを過ぎればBanは解除されます。
DoSShmemName
…共有メモリの名前。よくわかりませんが設定しなくても動きます。
DoSTableSize
…追跡するクライアントのアドレス数。
DoSIgnoreContentType
…アクセスされてもDoS判定のカウントを上げたくないファイルのMIMEタイプを指定します。
設定のサンプルでは、DoS攻撃検知を有効化し、10秒間の間に10回アクセスがあったらDoS攻撃を検知し、20回アクセスがあったらDoS攻撃のハードリミット超過を検知します。DoS攻撃検知後は15秒間環境変数に値をセットします。追跡するクライアントIP数は10個で、画像へのアクセス時はDoS攻撃のカウントとみなさないようにしています。
なお、mod_dosdetectorはDoS攻撃を検知しても環境変数に値をセットするだけで何もしません。実際にアクセスを拒否したりどこかにリダイレクトさせたりするにはmod_rewriteを使います。
以下が設定例です。
SuspectHardDoSが1の時、503を返すサンプル
RewriteEngine on
RewriteCond %{ENV:SuspectHardDoS} .+
RewriteRule .* - [R=503,L]
SuspectHardDoSが1の時、localhostへリダイレクトさせるサンプル
RewriteEngine on
RewriteCond %{ENV:SuspectHardDoS} .+
RewriteRule .* http://localhost/ [P,L]
ちなみに、実際にDoSを検知すると、mod_dosdetectorはApacheのerror_logに以下のようにログを吐いてくれます。ログを出力するために特に設定などは必要ありません。
[Sat Jan 01 16:32:42 2013] [notice] dosdetector: 'xxx,xxx,xxx,xxx' is suspected as DoS attack! (counter: 11)
[Sat Jan 01 16:32:43 2013] [notice] dosdetector: 'xxx,xxx,xxx,xxx' is suspected as Hard DoS attack! (counter: 21)
ELB使用時の問題
ELBやリバースプロキシなどを間に噛ませた場合、REMOTE_ADDRにはクライアントのIPではなく、ELBやリバースプロキシなどのIPが入ってしまいます。
これにより、mod_dosdetectorはELBなりリバースプロキシなりを攻撃してきたクライアントだと判断してしまい、正常に動作しません。
これを回避するために、X-Forwarded-ForをREMOTE_ADDRに置き換えてくれる、mod_extract_forwardedをインストールします。
yum install mod_extract_forwarded --enablerepo=epel
AmazonLinuxではepelリポジトリの定義が最初から入っているのでこれを利用してyumでインストールが可能です。
インストール後、httpd.confに以下の設定を入れます。
MEFaccept all
MEFacceptには、本来はWebサーバの前段にあるLBやリバースプロキシなどのIPを指定して、アクセスを個別に許可するのですが、ELBの場合、IPが不定でしかも増減してしまうため、allによって全クライアントからのアクセスを許可しています。
service httpd restart
Apacheを再起動して作業完了です。
これでmod_dosdetectorはELB経由でも正常にクライアントのIPを取得してDoS検知することができるようになります。