本記事「Apacheのmod_dosdetectorでDoS対策」は3部で構成されています。
第1部:①選定
第2部:②インストールと設定
第3部:③パラメータとログ
CONTENTS
ある日突然特定IPから大量のアクセスが!
以前、WEBサーバのCPUが高騰し、アラートが発生したことがありました。
ログを調査してみると、あるIPアドレスから大量にアクセスが。。。
さらにApacheのアクセスログを確認すると、
明らかに人が手で実行しているレベルのリクエスト数ではない!
リクエスト内容もURLエンコードがめちゃくちゃで、大量のExceptionが発生。
けしからん!
結果、通常よりもCPUを大幅に消費していました。
このときは当該のけしからんIPアドレスを
Apacheのアクセス拒否リストに入れて事なきを得たのですが、
毎回アラートが発生するたびに、
アクセスログを確認してIPアドレスを抽出→アクセス拒否リストに手動で追加、、、
というのは、ちょっと運用負担が大きいですし
そもそもアクセスログを目視してDoS攻撃なのかどうかを判断するのも大変ですね。
ということで、
明らかに過度なリクエストは自動的に拒否できるような設定
を導入することに。
導入する上での大前提
まず
★普通にサイトを利用している人やクローラーに影響が出ないようにしたい
が最重要。
過剰に保護する余りサービス提供に支障が出てしまっては本末転倒なので、
WEBサーバの稼動に支障が出ない限りは受け入れるようにしたい。
これを念頭において導入を進めていく。
やりたいこと
1.IPアドレス毎にリクエスト回数の記録をとる
2.設定している許容範囲を超えていないか判定(1秒間に100リクエストとか)
3.許容範囲を超えていたら一時的にブロックする
導入条件
◇指定した条件に合致したアクセスに対し、指定のhttpリターンコードを返す
・403、404、503、静的ページなど
◇検知除外の指定ができること
・IPアドレス
・ユーザエージェント
・URL
◇検知結果をログとして残すことができる
・引っかかったアクセスを見ながら閾値を調整していく
条件に合致するApacheのDoS対策モジュールで
mod_evasive
mod_dosdetector
いうのがあったので、
この2つで比較検討してみる。
mod_evasive
・検出から挙動までを指定するモジュール
・プロセス毎に制限
・最大でリミットxプロセス数(最大でMaxServers)のアクセスを許すことになる。
・制限判定は1段階
・検知除外指定単位
- 可: IPアドレス 、 ユーザエージェント
- 不可:サブネット
・検知除外するMIME type指定不可
・検知ログは/var/log/messages
mod_dosdetector
https://github.com/stanaka/mod_dosdetector
・検出のみを行う。挙動はmod_rewriteで指定する
・全プロセス共通で制限
・制限判定は2段階
・アクセス数に応じて「DoS攻撃の疑いあり」と「激しいDoS攻撃の疑いあり」の2種類のフラグを付与し、
mod_rewriteでフラグによる挙動を設定する
・検知除外指定単位
- 可: IPアドレス 、 サブネット
- 不可: ユーザエージェント※ただし、mod_rewriteで挙動除外指定は可能
・検知除外するMIME type指定可能
・検知ログは任意設定可能
導入検証結果
mod_evasiveだと
アクセス数のカウントがプロセス毎というのがいただけない。
ログ出力先がシステムログというのもいただけない。
mod_dosdetectorの方はフラグを付与するだけで、
アクセス拒否やリダイレクトさせるには
mod_rewriteで記述する必要があるが、むしろ自由度が高いので問題なし。
mod_dosdetectorを選択することにする。
mod_dosdetectorへの追加機能
1.mod_dosdetector raccoonパッチ版
http://techblog.raccoon.ne.jp/archives/36202484.html
主な追加機能は下記の通り。
・検査しないIPアドレスを範囲で指定できる。
・検査するURL/しないURLを指定できる。
・LBやプロキシがはさまっているときの諸問題を解消
以下はraccoonから抜粋。
<DoSIgnoreIpRange>
DoS検査の対象から除外するIP範囲を指定可能で、
下記3種類の指定方法を認識します。
・192.168.0.0/16 、 ・10.0.0.0/255.0.0.0 、 ・203.0.113.56
<IncludePath/ExcludePath>
DoS検査を行う対象をrequest_uriで絞り込みます。
1. ExcludePath優先、ExcludePathにマッチしたらDoS検査を行わない
2. IncludePathを次に検査、IncludePathが1つも設定されていない場合はIncludePathに / が指定されているのと同じ動作をする
3. IncludePathが1つ以上ある場合は明示的にIncludePathに指定されたパスのみDoS検査の対象とする
X-Forwarded-Forに複数IPを含む場合の処理を変更
カンマ区切りでIPを取得して、
IPとして有効な文字列でかつDoSIgnoreIpRangeに含まれない最後のIPを選択します。
DoSForwardedがOnで
X-Forwarded-Forが存在しない場合の処理を変更
X-Forwarded-Forが存在しなければDoS検査を行わないよう変更しています。
2.mod_dosdetector Takayuki Miwa版
DoSチェックの対象としないMIME type を環境変数で指定できる
不要なサブリクエストの生成処理を取り除くことでパフォーマンスが改善されている
共有メモリ処理が改善されている
追加機能の検証結果
1はpatchコマンドでオリジナルに追加する形式、
2はmod_dosdetectorモジュールとして提供されているが、
オリジナルのmod_dosdetectorモジュールより更新日が古い。
オリジナルに1をpatchで追加することにする。
晴れて導入するモジュールが決定。
手順については後日記していきます。
本記事「Apacheのmod_dosdetectorでDoS対策」は3部で構成されています。
第1部:①選定
第2部:②インストールと設定
第3部:③パラメータとログ