Apache 2.4 の DoS攻撃対策 mod_dosdetector 設定メモ

Linux
Linux
スポンサーリンク

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 パッケージに含まれています。

sudo yum -y install httpd-devel

mod_rewrite が有効になっていることを確認

Apache httpd を yum などでパッケージからインストールしていれば mod_rewrite が有効になっていると思いますが、念のため確認しておきます。

sudo httpd -M | grep rewrite
rewrite_module (shared) ← mod_rewrite が有効

mod_dosdetector のインストール

mod_dosdetector は、はてなの元CTO Shinji Tanaka さんが開発されています。(現在はメルカリに転職されているそうです)

TanakaさんのGitHubで mod_dosdetector のソースコードが公開されていますので、ダウンロードします。

cd /usr/local/src/
sudo git clone https://github.com/stanaka/mod_dosdetector.git

コンパイルしてインストールします。

cd mod_dosdetector/
sudo make install

インストールでエラーが発生する場合

環境によっては apxsコマンドが見つからない旨のエラーが発生してインストールできないことがあります。

/usr/sbin/apxs -c mod_dosdetector.c
make: /usr/sbin/apxs: Command not found
make: *** [mod_dosdetector.so] Error 127

その場合は apxsコマンドのパスを確認し、Makefile を修正してから「sudo make install」を実行しましょう。

which apxs
/usr/bin/apxs ← apxsコマンドのパス

・Makefileを修正
sudo vi Makefile

APXS=/usr/sbin/apxs
 ↓
APXS=/usr/bin/apxs

mod_dosdetector の設定

mod_dosdetector のロード

mod_dosdetector のインストール時に、モジュールをロードする設定を Apache httpdの設定ファイルに追加してくれるはずですが、設定ファイルのコメントを削除していると追加されないこともあります。その場合は下の設定を Apache httpdの設定ファイルに追加してください。

sudo vi /etc/httpd/conf/httpd.conf

LoadModule dosdetector_module /usr/lib64/httpd/modules/mod_dosdetector.so

DoS攻撃検出のしきい値設定

同一IPアドレスからのアクセスが、ここで設定したしきい値を超えると mod_dosdetector はDoS攻撃と判断し、環境変数「SuspectDoS」もしくは「SuspectHardDoS」に 1 をセットします。

sudo vi /etc/httpd/conf/httpd.conf

DoSDetection on
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 を再起動します。

sudo systemctl restart httpd

mod_dosdetector のログ

mod_dosdetector が DoS攻撃を検出すると Apache httpd のエラーログに、アクセス元のIPアドレスやアクセス数が出力されます。mod_rewrite でDoS攻撃を遮断する前に、しきい値をじっくり調整できますね(^^)

sudo grep dosdetector /var/log/httpd/error_log
 
[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

RewriteEngine On
RewriteCond %{ENV:SuspectHardDoS} =1
RewriteRule ^.*$ - [R=503,L]
RewriteCond %{ENV:SuspectDoS} =1
RewriteRule ^.*$ - [L]

設定が終わったら apache を再起動します。

sudo systemctl restart httpd

上の設定では、「SuspectHardDoS」が 1 の場合は、HTTPステータスコード 503(一時的にサーバーにアクセスできない)エラーを返します。また「SuspectDoS」が 1 の場合はなにもリダイレクトさせませんので、DoS攻撃を検出したことをログに記録するのみとなります。

おわりに

mod_dosdetector の開発者 Tanakaさんの著書に「[Web開発者のための]大規模サービス技術入門」があります。サーバーハードウェアやネットワーク、ミドルウェアなどの基本技術をわかりやすく解説されているオススメの書籍です。この本が発行されたのは2010年なので技術書としては少し古くなりますが、基本技術はそうそう変わりません。インフラの主流がオンプレミスからクラウドサービスに変わった今でもいつも手元に置いて参考にしています。

コメント

タイトルとURLをコピーしました