Fail2BanでDoS対策を試みる

投稿者 akira 2005-10-06 15:00:00 GMT

ここ二、三日、ふと見るとHTTPサーバが重くなっているというのが続いていて、なんだろうな思ってログを見てみると、何が目的なのか、日記をGETしまくっているクライアントがいる。しかも複数。さらにログを見てみると、どうもしばらく放っておけばそのうちおさまるという感じでもなさそうなので、対策を考える。

最初に考えたのはmod_evasive。でもこれは、前にも思ったのだけど、ひっかけかたがおおまかすぎる。ホンモノのDoSには有効なのだろうけど、今回はせいぜい一分間に4〜5回*1のアクセスで、これをひっかけようとすると正常なアクセスまでひっかかってしまう*2

それで、cronか何かで定期的にaccess.logを参照して、tail -1000の範囲で一定割り合いを占めるようなのをiptablesで排除するか、などと考えてみたのだけど、いいかげんに作ったのでは穴があきそうでいまいち。あ、そういえば、と思い付いたのが、先日設定してみたFail2Ban。もともとはSSHに対するスキャン対策でいれてみたのだが、SSHに限らず他のログを見てもくれるのでこれで何とかやってみようと。

デフォルトの設定ファイルにHTTPの認証エラーをひっかけるような例が入っているので、まずはこれをベースにする。ただし、認証エラーではなく、通常のアクセスに対するログエントリをそのままひっかけるようパターン(failregex)を変更する。ついでに日記に対するアクセスだけをひっかけるようにしておく。その上で、ひっかけたIPアドレスを覚えておく時間(findtime、デフォルトは600秒)を短くし、さらにこの数よりも多くひっかかったらエラーとみなすという設定(maxfailures、デフォルトは5)をある程度増やした。あと、日時を得るためのパターンなどが違っているのでこれも調整しておく。

ふむ、どうやらそれなりにひっかかっているようだ。あとでFail2Banのログを確認して、ひっかけすぎてないか、もらしすぎていなか、確認してみよう。

*1 ただし、一分間に4〜5回がえんえんと続く。

*2 ひっか方が同一URLへのアクセス頻度と同一ホストからのアクセス頻度の二種類しかないので、たとえばイメージがいくつかあると、正常なアクセスまでひっかけてしまうことになるし、proxyがはさまっているサイトからのアクセスもダメそう。

トラックバック

トラックバックリンク:
http://arika.org/diary/trackbacks?article_id=1707