スポンサーサイト
投稿日時 : -------- --:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
-------- --:-- | スポンサー広告
WinXP + Apache2でmod_dosevasiveによるDoS攻撃対策
投稿日時 : 2008-02-03 19:46
更新日時 : 2009-08-09 10:33
 数年前から細々と運営していたWebサーバがDoS攻撃された際にとった対策のメモ。
友人にホームページスペースを提供していたんですが、その友人がニコニコ動画でヒットを飛ばしたらしく、予想を上回るアクセスがあった。人が集まると悪意のある人も必ず紛れ込むようで、その中の一人が田代砲でも撃ってるかのような挙動をし始めた。そのときはOutpostでIP指定で遮断したが、根本的な対策をとる必要を感じたので調べてみた。
 

■環境

  Windows XP Professional SP2
  Apache 2.2.8
 

■mod_evasive

 以下のサイトからmod_evasiveというApacheモジュールを入れれば対策できそうなことが分かった。
Apacheに対するサービス拒否攻撃を回避する方法:ITpro
 
mod_evasiveは以下のような動作原理。
ITpro
mod_evasiveはまずURLリクエストをApacheサーバーに送信するIPアドレスの記録を取る。その後,あらかじめ設定した許容範囲を超えるリクエストがいずれかのIPアドレスから送信されていないか測定する。許容範囲を超えるリクエストがあった場合,そのIPアドレスからのリクエストは一時的にブロックされる。

■mod_dosevasiveのダウンロード

 Windows用のコンパイル済みモジュールmod_dosevasiveを以下からダウンロード。
Mod_dosevasive for Apache2 on Windows / Best of Security
 
追記(2009-08-09 10:33):上記サイトではリンク切れになっているとのコメントをいただきました。探してみたところ以下の中国語サイトで発見しました。
 
ZIP内ファイルのmod_dosevasive22.dllのSHA-1ハッシュ(SHA1:275c2f1877e616287214971fbf2df73ffa3bf43e)が、この記事を投稿した2008/02/03の時点で公式サイトから落としたものと同一であることが確認できたので、ほぼ、間違いなく本物です。
 
 
解凍すると以下の2ファイルが入ってる。
  mod_dosevasive22.c
  mod_dosevasive22.dll
.c はソース。.dll の方がコンパイル済みモジュール。自分でコンパイルする場合はapxsというツールを使う必要がある。面倒なのでコンパイル済みを使う。
 

■Apacheのバージョン

 ここで嫌な予感がしたのがファイル名の「22」。これApacheの2.2系用という意味なんじゃないかと思って調べるとやはりそういうことらしい。が、現在運用中のApacheバージョンは2.0.55。大変な作業になることが予想されてうちひしがれる。一応2.0系用のモジュールも探してみたがないっぽい。仕方ないのでサーバマシンのクローン環境で2.0.55から2.2.8(2008年02月03日現在最新)への入れ替え作業実験。httpd.confの2.0系からの変更点を把握するのと、既存のページ・サービスが正常に動作することを確認するので半日かかった。
 

■mod_dosevasiveのインストールと設定

 で、いよいよmod_dosevasiveを組み込む。以下の作業中のパスは環境に応じて読み替えてください。
 
まずmod_dosevasive22.dllをApacheのモジュールフォルダに
D:\_WWW\Apache2\modules\mod_dosevasive22.dll
としてコピー。
 
次にhttpd.confを編集する。128行目あたりのLoadModuleディレクティブが並んでる最後に以下を追記する。
httpd.conf
LoadModule dosevasive22_module D:/_WWW/Apache2/modules/mod_dosevasive22.dll
<IfModule dosevasive22_module>
DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 1
DOSBlockingPeriod 60
DOSWhitelist 127.0.0.1 192.168.0.*
</IfModule>
正直はじめLoadModuleに渡すモジュール名を何にすればいいのかわからなかった。
Mod_dosevasive for Apache2 on Windows / Best of Security
LoadModule dosevasive_module c:\apache2\modules\mod_dosevasive.dll
というふうに書けとあるが、ApacheのTestConfigurationを通すとモジュールのAPIが見つからないみたいなことを言われる。
 
どうしようかと思ってソースファイルのmod_dosevasive22.cを眺めていると最後に
mod_dosevasive22.c
module AP_MODULE_DECLARE_DATA dosevasive22_module =
{
    STANDARD20_MODULE_STUFF,
    NULL,
    NULL,
    create_hit_list,
    NULL,
    access_cmds,
    register_hooks
};
というのがあって、APって書いてあるし、かなりぽいのでdosevasive22_moduleを入力してみたら通った。
 

■mod_dosevasiveの設定項目の意味

DOSHashTableSize 3097ハッシュテーブルのサイズ。増加させるとパフォーマンスが上がるがメモリをたくさん食う。アクセスが多い場合は増加させるべき。
DOSPageCount 5DOSPageIntervalで指定した秒数以内にページをリロードできる回数の上限。ここでは5回に設定。
DOSSiteCount 100DOSSiteIntervalで指定した秒数内にサイト全体で可能なリクエスト数の上限。ここでは100リクエストに設定。
DOSPageInterval 2ここで指定した秒数の間にDOSPageCountで指定した回数ページをリロードするとDoS攻撃と見なす。ここでは2秒に設定。
DOSSiteInterval 1ここで指定した秒数の間にDOSSiteCountで指定した回数のリクエストがあるとDoS攻撃と見なす。ここでは1秒に設定。
DOSBlockingPeriod 60遮断する秒数を指定。ここでは60秒に設定。
DOSWhitelist 127.0.0.1 192.168.0.*ここで登録されたホストの活動はDoS攻撃とみなさない。ここでは127.0.0.1の自分自身と192.168.0.*の192.168.0.0/24のLAN内からのアクセスはDoS攻撃として扱わないという設定。ワイルドカードが使用できる。

■動作確認

 設定が終わったのでLAN内ホストからサーバをDoS攻撃してみる。DOSWhitelistをコメントアウトしてApacheを再起動して設定を反映させる。テストにはメガ粒子田代砲を使うw。
 
tashirohou
 
ちゃんと攻撃を検知して遮断してくれた。
 

■環境に合わせて調整する

 ページの構成や提供しているサービスによってはどんなアクセスをDoSアタックと見なすかは多少変わってくると思うので環境に合わせて設定値を調整する。安定して動作することが確認できるまではDoSWhitelistはコメントアウトしておいた方がいいかも。自分はアクセスできても外部からの通常アクセスが知らずに遮断されているということが起こるかもしれないので。
 
[参考]
Apacheに対するサービス拒否攻撃を回避する方法:ITpro
Apacheに対するDOS攻撃を回避する「mod_evasive」 (ひるねこ日記)
Mod_dosevasive for Apache2 on Windows / Best of Security
Nuclear Elephant: mod_evasive
 
スポンサーサイト
2008-02-03 19:46 | Server | Comment(12) | Trackback(1)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。