Apacheのmod_dosdetectorでDoS対策~導入までの道のり ①選定

無断転載禁止 Apacheのmod_dosdetectorでDoS対策~導入までの道のり ①選定
pic by pixabay

本記事「Apacheのmod_dosdetectorでDoS対策」は3部で構成されています。
第1部:①選定
第2部:②インストールと設定
第3部:③パラメータとログ

ある日突然特定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部:③パラメータとログ

Pocket
LINEで送る