Dos攻撃を防ぐ対策としてmod_dosdetectorをApacheに導入するための手順

いやー、マジでDos攻撃する人って何考えてるんだろう。ただの嫌がらせ?
本当に逮捕されますよ。実際2015年7月に逮捕者でてます。
「DDoS攻撃」でサイト閉鎖させた疑い ベトナム人逮捕 警視庁
軽い気持ちでむかつくからと言ってF5連打とかもっとダメです。前科者になりたいの?とグチグチ言いたくなる。

いや、事の顛末はこう。
別で、とある登録型サイトを運営しているんですが、ひと月に一回ぐらい大量のDos攻撃をくらうことがありました。
IPを調べると必ず中国からの攻撃で、なんと1日で200万件越えの攻撃。エラーログだけでその日は352MBもありました。
救いはDDosではなく同一IPだったので、気が付いた時に.htaccessで403して弾いているという古典的な対応策で頑張っていたんですが、それでも共用レンタルサーバーから『いい加減アクセス負荷が大きすぎるから出ていってくれないか』とメールではなく、いきなり電話がかかってきたので、急遽VPSサーバーに移転したという経緯があります。

サーバー移転して、Dos攻撃対策にとmod_dosdetectorを導入すると、すごく気持ちいいぐらい毎日毎日ログに引っかかってくれるんですが、導入する前は気が付かなかった小さな攻撃も多々あり、ビックリしました。
mod_dosdetectorで弾かれすぐに攻撃をやめているだけで、大量のDos攻撃になっていないだけなのかもしれませんが、驚いたことに今まで気が付かなかった小さな攻撃というのが、IPアドレスで検索すると日本からばかり。
なんなんだろう。本当にびっくり。ライバルサイトからなのか?とか勘ぐったりしちゃいますわ。
なんか恨まれてるの?通報してやろうかな。逮捕されればいいのに・・・。
ちなみに、mod_dosdetectorのログは以下のような感じのものが毎日あります。うんざり。

mod_dosdetectorのログ例

mod_dosdetectorの導入手順

mod_dosdetector のインストール

mod_dosdetectorをダウンロードする

# wget http://downloads.sourceforge.net/project/moddosdetector/moddosdetector/version-0.2/mod_dosdetector-0.2.tar.gz?use_mirror=jaist

# tar -xzvf mod_dosdetector-0.2.tar.gz

インストールには、httpd-devel パッケージに含まれる apxs コマンドが必要なので、なければインストールする。

# yum install httpd-devel

apxs コマンドが使える状態になったら、コンパイル・インストールを実行。

# cd mod_dosdetector-0.2
# make
# make install

エラーなく終了すれば、モジュールのインストールは完了。

Apache 設定

問題なくインストールできると、httpd.confにモジュールの読み込みが記述されているので確認する。

# less /etc/httpd/conf/httpd.conf
LoadModule dosdetector_module /usr/lib64/httpd/modules/mod_dosdetector.so

mod_dosdetectorの設定は別ファイルにしておいたほうが後々わかりやすいので、別に設定ファイルを作成する。

# vi /etc/httpd/conf.d/dosdetector.conf

設定内容は以下の通り。

RewriteEngine On
RewriteCond %{ENV:SuspectDoS} .+ [OR]
RewriteCond %{ENV:SuspectHardDoS} .+

# localhostを除外
RewriteCond %{REMOTE_ADDR} !^(127\.0\.0\.1)$
# クラスAのローカルIPアドレス帯を全て除外
RewriteCond %{REMOTE_ADDR} !^(10\.[0-9]+\.[0-9]\.[0-9])$
# クラスBのローカルIPアドレス帯を全て除外
RewriteCond %{REMOTE_ADDR} !^(172\.(1[6-9]|2[0-9]|3[0-1])\.[0-9]+\.[0-9]+)$
# クラスCのローカルIPアドレス帯を全て除外
RewriteCond %{REMOTE_ADDR} !^(192\.168\.[0-9]+\.[0-9]+)$
# 検索botを除外
RewriteCond %{HTTP_USER_AGENT} !(google|yahoo|msn|bing) [NC]

# Dos攻撃と判定した場合
RewriteRule .* - [R=403,L]
ErrorDocument 403 "403 Forbidden."

# デフォルトでは favicon のコンテンツタイプは指定されていないので設定
AddType image/vnd.microsoft.icon .ico

# DoS攻撃の検知を有効にするかどうか。
DoSDetection On

# DoS攻撃の判定を行う時間を設定。(秒)
DoSPeriod 60

# DoSPeriod の間にこの数だけアクセスがあればSuspectDoSに1をセット
DoSThreshold 120

# DoSPeriod の間にこの数だけアクセスがあればSuspectHardDoSに1をセット
DoSHardThreshold 180

# DoS攻撃の疑いが設定されてから解除するまでの時間(秒)
DoSBanPeriod 3600

# 共有メモリ名
DoSShmemName dosshm

# クライアントの追跡記録を保存する数
DoSTableSize 300

# 追跡記録から除外するコンテンツタイプをパターンマッチングな文字列で指定
DoSIgnoreContentType ^(image/|application/|text/javascript|text/css)

# ログの設定
LogFormat "%{SuspectHardDoS}e %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" dosdetector
CustomLog logs/dos_suspect_log dosdetector env=SuspectDoS

自分のサイトのアクセス数などをみて「DoSPeriod」や「DoSThreshold」「DoSHardThreshold」などを調整する。あまりに厳しすぎると普通にアクセスしている人でも引っかかってしまう可能性あるので、設定してからしばらくはエラーログなどをみて閾値を見つけてください。
また、弾いた時のステータスコードを今回は403にしていますが、もし悪意を持って攻撃していない人が引っかかってしまった場合びっくりすると思うので、最初は「ErrorDocument 503 "Server is busy."」にして様子見するのもいいかもしれません。

設定したmod_dosdetectorの設定ファイルをIncludeする

httpd.confを開いて

# vi /etc/httpd/conf/httpd.conf

以下のものを記述する

<IfModule dosdetector_module>
 Include conf.d/dosdetector.conf
</IfModule>

最後にApacheを再起動して有効にする

# service httpd restart

試しに自分でF5を押しっぱなしにしてみて、403が出たら成功です。

mod_dosdetectorのやっていることは単純明快で、設定した時間内に設定した回数以上のアクセスがあれば、設定したステータスコードを返すという、わかりやすくて使いやすい素晴らしいモジュールだと思います。

まあ、狙い撃ちでDDos攻撃なんてされたら大企業様でも落ちてしまうので、一般市民が頑張って防ごうと思っても限界はあるけど、これならある程度の防壁になるので、導入した方がいいです。