2007-02-04
サーバにDoS耐性を付ける
ウェブサービスでは、アクセスが集中して、サイトが落ちる、というのは、よくある話です。純粋に人気が出てアクセス集中するなら、サーバ管理側の責任と言われても、しかたないと思います。しかし、botやF5アタックによる突発的な集中アクセスで、落ちてしまう、というのは、運営側としても、あまり納得がいくものではありません。
そのような突発的なアクセスに対応するために、大量のアクセスをしてくるクライアントを検出し、優先度を落すか、アクセス禁止にする方法などがあります。
というわけで、Apacheモジュールでそれを検出するためのmod_dosdetectorを開発しました。(ちなみにコア部分の開発期間は、Apacheモジュールって、どう書くんだっけ、という状態から、3日でした。)
mod_dosdetectorは、Apacheモジュールとして動作し、クライアントのIPアドレスごとにアクセス頻度を測定し、設定した閾値を越えると、DoS攻撃と判定します。詳細には、以下の機能を持っています。
データを共有メモリに配置し、サーバ単位で計測することにより、preforkモデルのApacheで多数のプロセスを立ち上げている場合でも、正確に計測できます。また、環境変数に結果を設定するため、mod_rewriteにより、煮るなる焼くなり、自由にリクエストを処理できます。例えば、リクエストを処理するサーバを隔離し、他のユーザへの影響を抑えたり、特定のページを表示させたり、そもそもアクセスを禁止したりなどなど。また、特定のIPアドレスからのアクセスや、特定のURLへのアクセスを特別扱いしたりすることも柔軟にできます。
Apache過去に類似のモジュールは複数あるのですが、Apache2.0に対応していなかったり、細かい制御ができなかったり、などと使い勝手が悪いものでした。その点、mod_dosdetectorは、柔軟に設定できるところが売りです。はてなのサーバ群へ順次適用しており、稼働実績も今後積まれる予定です。
mod_dosdetectorは、オープンソースで公開していますので、是非ご利用ください。
http://sourceforge.net/projects/moddosdetector/
ドキュメントは、まだありませんが、随時追加していきたいと思います。
追記
ブクマコメントへの反応です。
「ずっとそのまま」ということはなくて、指定時間経ったら解除されます。また、現状では、1分程度に設定されています。また、DoS攻撃と判定しても、アクセス拒否するのではなく、優先度を下げる、という設定になっています。
追記2
Sourceforgeにアップしたファイルがビルドできないという「これはひどい」状態だったものを、修正しました。
- http://d.hatena.ne.jp/hiro-ueda/20070204
- http://d.hatena.ne.jp/fifth_moon/20070204
- http://d.hatena.ne.jp/pokoweb/20070204
- Apache2: mod_dosdetector
- http://d.hatena.ne.jp/hider34/20070205
- [linux]DoS対策
- http://d.hatena.ne.jp/deepfolte/20070205
- http://d.hatena.ne.jp/peppon/20070205
- 月間10万アクセスのモンスターブログ作成方法
- 【DoS攻撃の知識】
- 509エラー
- Apache2 で DoSアタック を華麗にかわしたい。オーレッ!!
- 5roumilesの日記 - mod_dos
