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)
    

気になったこと

  • ドキュメントなし。公開してみたものの業務が忙しくてドキュメントが追いついてないっぽい。
  • 設定ファイルの内容とか間違ってなくない?
  • 考え方として非常に運用的スタンスで共感できる。
  • 共有メモリ使ってるのでロックのオーバーヘッドが心配だけど、はてなクラスでも問題なしらしい。
  • 負荷とかボトルネックが心配だけど、リバースプロキシで動かしている限り、はてなクラスでも問題なしらしい。

その他

  • こういうのは便利だけどやっぱり使いどころに注意。