サーバに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/
ドキュメントは、まだありませんが、随時追加していきたいと思います。

追記

ブクマコメントへの反応です。

あー、僕が食らったのはこれなのか?一度DOS認定されたらずっとそのままなんだろうか>はてなの運用」

「ずっとそのまま」ということはなくて、指定時間経ったら解除されます。また、現状では、1分程度に設定されています。また、DoS攻撃と判定しても、アクセス拒否するのではなく、優先度を下げる、という設定になっています。

追記2

Sourceforgeにアップしたファイルがビルドできないという「これはひどい」状態だったものを、修正しました。