Apache で DoS 攻撃を防ぐ - mod_dosdetector -
こんにちは nakamura です。ワールドカップ見過ぎで仕事中もブブゼラの音が聞こえてきます。ワールドカップが終わっても聞こえるようなら病院行こうと思います。
さてさて今も昔も、定番のサーバ攻撃方法 DoS アタック。うちが作っているサイトにもちょくちょくそれらしいアクセスが来ているようです。
DoS 攻撃って?
Denial of Service attack の略です。以下は Wikipedia より。
イメージとしては、ターゲットの持つ電話機に無言電話やいたずら電話を大量に発信して、ターゲットが正常に電話機を使用(受発信)できないような状態を考えると理解しやすい。DoSはネット上のトラフィックを増大させ、通信を処理している回線やサーバの機能(リソース)を占有することで、他の利用者の利便性を妨害したり、その過負荷によってサーバそのものの異常動作を誘発させる。
要はリクエストを大量に送りつけてサーバやネットワークのリソースを溢れさせてしまおう、というとても原始的な攻撃方法です。F5 アタックなんかもこれに入ります。原始的が故になくなる事がないんですねぇ。
mod_dosdetector
DoS 攻撃を防ぐ何かうまい方法ないのかなぁ、と探していたらありました!はてな発の mod_dosdetector という Apache モジュールです。作られたのは 2007 年ですが、今でも充分使える機能を持っています。
インストールしてみる
ソースコードは SourceForge で公開されています。まずはサーバの適当な場所にダウンロードして展開。
cd /usr/local/src
wget http://downloads.sourceforge.net/project/moddosdetector/moddosdetector/version-0.2/mod_dosdetector-0.2.tar.gz?use_mirror=jaist
tar -xzvf mod_dosdetector-0.2.tar.gz
インストールには apxs コマンドが必要です。CentOS の場合、httpd-devel パッケージに含まれています。インストールされていなければしてください。
yum list httpd-devel
yum install httpd-devel
apxs コマンドが使える状態になったら、コンパイル・インストールを実行します。
cd /usr/local/src/mod_dosdetector-0.2
make
make install
エラーなく終了すればモジュールのインストールは終了です。
Apache 設定
インストールしただけではもちろん動かないので、何かしらの設定を行います。一例ですが、httpd.conf に以下のように記述してください。
# デフォルトでは favicon のコンテンツタイプは指定されていないので設定
AddType image/vnd.microsoft.icon .ico
# モジュール読み込み
LoadModule dosdetector_module /usr/lib/httpd/modules/mod_dosdetector.so
# モジュール設定
DoSDetection On
DoSPeriod 60
DoSThreshold 80
DoSHardThreshold 100
DoSBanPeriod 7200
DoSTableSize 100
DoSIgnoreContentType ^(image/|application/|text/javascript|text/css)
設定項目の説明は以下の通りです。
DoSDetection
DoS 攻撃の検知を有効にするかどうか。
DoSPeriod
DoS 攻撃の判定を行う時間を設定。(秒)
DoSThreshold
DoSPeriod の間にこの数だけアクセスがあれば DoS 攻撃の疑いありとみなし、環境変数 SuspectDoS を 1 にセットする。
DoSHardThreshold
DoSPeriod の間にこの数だけアクセスがあれば DoS 攻撃の疑いが強いとみなし、環境変数 SuspectHardDoS を 1 にセットする。
DoSBanPeriod
DoS 攻撃の疑いが設定されてから解除するまでの時間。(秒)
DoSTableSize
クライアントの追跡記録を保存する数。多すぎるとその分リソースを消費する。
DoSIgnoreContentType
追跡記録から除外するコンテンツタイプをパターンマッチングな文字列で指定。
mod_dosdetector は DoS 攻撃と思われるクライアントに対して環境変数をセットするだけで、実際にアクセスをはじく処理は mod_rewrite を使って行います。DoS 攻撃をはじきたいバーチャルホストの VirtualHost ディレクティブ内に以下のように記述します。サーバ全体に適用したければ VirtualHost ディレクティブの外で問題ありません。
RewriteEngine On
RewriteCond %{ENV:SuspectHardDoS} =1
RewriteRule .* - [R=503,L]
ErrorDocument 503 "Server is busy."
以上で Apache の設定は終了です。Apache を再起動した後、Jmeter 等で大量のリクエストを発行して閾値を越えたあたりからステータス 503 が返ってくれば OK !
終わりに
かな~りかゆい所に手が届く、使いやすいモジュールだと思います。フリーで公開してくださったはてなの田中さんには感謝です。
ちなみに似たような機能を持つモジュールが他にもいくつかあるので用途に合わせて使い分けると良いと思います。