mod_dosdetector は、DoS攻撃を検出することができる Apache httpd のモジュールです。mod_dosdetector で検出したDoS攻撃のアクセスを mod_rewrite でエラーページなどにリダイレクトさせることで、DoS攻撃対策をすることもできます。そこで今回は、mod_dosdetector のインストール方法と設定手順をまとめてみました。
下準備
今回のサーバー環境は以下の通りです。
- CentOS 7.3 (1611)
- Apache httpd 2.4
apxs コマンドのインストール
mod_dosdetector をインストールするにあたって apxsコマンド(Apacheのモジュールをコンパイルしれくれるツールです)が必要になりますので、インストールしておきます。apxsコマンド は httpd-devel パッケージに含まれています。
mod_rewrite が有効になっていることを確認
Apache httpd を yum などでパッケージからインストールしていれば mod_rewrite が有効になっていると思いますが、念のため確認しておきます。
rewrite_module (shared) ← mod_rewrite が有効
mod_dosdetector のインストール
mod_dosdetector は、はてなの元CTO Shinji Tanaka さんが開発されています。(現在はメルカリに転職されているそうです)
TanakaさんのGitHubで mod_dosdetector のソースコードが公開されていますので、ダウンロードします。
sudo git clone https://github.com/stanaka/mod_dosdetector.git
コンパイルしてインストールします。
sudo make install
インストールでエラーが発生する場合
環境によっては apxsコマンドが見つからない旨のエラーが発生してインストールできないことがあります。
make: /usr/sbin/apxs: Command not found
make: *** [mod_dosdetector.so] Error 127
その場合は apxsコマンドのパスを確認し、Makefile を修正してから「sudo make install」を実行しましょう。
/usr/bin/apxs ← apxsコマンドのパス
・Makefileを修正
sudo vi Makefile
↓
APXS=/usr/bin/apxs
mod_dosdetector の設定
mod_dosdetector のロード
mod_dosdetector のインストール時に、モジュールをロードする設定を Apache httpdの設定ファイルに追加してくれるはずですが、設定ファイルのコメントを削除していると追加されないこともあります。その場合は下の設定を Apache httpdの設定ファイルに追加してください。
sudo vi /etc/httpd/conf/httpd.conf
DoS攻撃検出のしきい値設定
同一IPアドレスからのアクセスが、ここで設定したしきい値を超えると mod_dosdetector はDoS攻撃と判断し、環境変数「SuspectDoS」もしくは「SuspectHardDoS」に 1 をセットします。
sudo vi /etc/httpd/conf/httpd.conf
DoSPeriod 60
DoSThreshold 5
DoSHardThreshold 10
DoSBanPeriod 60
DoSTableSize 100
DoSIgnoreContentType ^(image/|application/|text/javascript|text/css)
DoSDetection on
mod_dosdetector モジュールを有効にします。
DoSPeriod(単位:秒)
このパラメータで指定した期間のアクセス数をカウントします。
DoSThreshold
DoSPeriod の間にここで指定したアクセス数があると、環境変数「SuspectDoS」に 1 がセットされます。
DoSHardThreshold
DoSPeriod の間にここで指定したアクセス数があると、環境変数「SuspectHardDoS」に 1 がセットされます。
DoSBanPeriod(単位:秒)
環境変数「SuspectDoS」または「SuspectHardDoS」に 1 がセットされ続ける秒数を指定します。言いかえればDoS攻撃判定が解除される期間の設定です。
DoSTableSize
IPアドレスを格納するテーブルサイズを指定します。
DoSIgnoreContentType
DoS攻撃の検出から除外するコンテンツタイプを指定します。
上の設定の場合は、同一IPアドレスから1分間に5回アクセスがあれば「SuspectDoS」に 1 がセットされ、1分間に10回アクセスがあれば「SuspectHardDoS」に 1 がセットされます。この設定だと、おそらく通常のアクセスもDoS攻撃と判定されてしまうので調整が必要です。これらのしきい値の調整が mod_dosdetector を導入する際のキモになります。
設定が終わったら apache を再起動します。
mod_dosdetector のログ
mod_dosdetector が DoS攻撃を検出すると Apache httpd のエラーログに、アクセス元のIPアドレスやアクセス数が出力されます。mod_rewrite でDoS攻撃を遮断する前に、しきい値をじっくり調整できますね(^^)
[Mon May 16 5:03:44.589246 2017] [:notice] [pid 6809] dosdetector: '192.168.56.1' is suspected as DoS attack! (counter: 6)
[Mon May 16 5:03:45.975950 2017] [:notice] [pid 6809] dosdetector: '192.168.56.1' is suspected as Hard DoS attack! (counter: 11)
mod_rewrite の設定
mod_dosdetector の環境変数「SuspectDoS」または「SuspectHardDoS」の値を使って、DoS攻撃と判定されたアクセスを mod_rewrite でリダイレクトさせることで、DoS攻撃を遮断します。
sudo vi /etc/httpd/conf/httpd.conf
RewriteCond %{ENV:SuspectHardDoS} =1
RewriteRule ^.*$ - [R=503,L]
RewriteCond %{ENV:SuspectDoS} =1
RewriteRule ^.*$ - [L]
設定が終わったら apache を再起動します。
上の設定では、「SuspectHardDoS」が 1 の場合は、HTTPステータスコード 503(一時的にサーバーにアクセスできない)エラーを返します。また「SuspectDoS」が 1 の場合はなにもリダイレクトさせませんので、DoS攻撃を検出したことをログに記録するのみとなります。
おわりに
mod_dosdetector の開発者 Tanakaさんの著書に「[Web開発者のための]大規模サービス技術入門」があります。サーバーハードウェアやネットワーク、ミドルウェアなどの基本技術をわかりやすく解説されているオススメの書籍です。この本が発行されたのは2010年なので技術書としては少し古くなりますが、基本技術はそうそう変わりません。インフラの主流がオンプレミスからクラウドサービスに変わった今でもいつも手元に置いて参考にしています。
コメント