CONTACT
お問い合わせ

Apache Mod Dosdetector でDOS攻撃対策を行う

ApacheのMod Dosdetectorを使用し大量リクエストを拒否する設定を行う。

目次

1.概要
2.構成図
3.前提
4.Mod Dosdetectorインストール
5.Apache設定
6.Mod Dosdetector設定ファイル編集
7.Mod Dosdetector設定適用
8.設定確認

1.概要

ApacheのMod Dosdetectorを使用し、同一IPアドレスの一定数以上のリクエストを拒否する設定を行う。

2.構成図

構成図は以下の通り。

OS CentOS 7
Apache 2.4.46
apr 1.6.5
mod dosdetector 1.1.0

3.前提

・OSがCentOSであること
・Apacheがインストールされていること
・aprがインストールされていること
・apr-utilがインストールされていること
・Apache、Tomcatが稼働している場合は停止していること

4.Mod Dosdetectorインストール

Githubよりソースコードを取得(今回はmod_dosdetector-fork-1.1.0.tar.gz)
  ◎ Mod Dosdetector配布サイト(Github)

アップロードを行い、解凍する

[root@Server1 ~]# cd /usr/local/src ※アップロード先
[root@Server1 ~]# tar -xvf mod_dosdetector-fork-1.1.0.tar.gz

必要モジュールのインストール

[root@Server1 ~]# yum install lynx

インストール済Apacheのapachectlコマンドとapxsコマンドのパスを確認する

[root@Server1 ~]# ll /usr/local/httpd-2.4.46/bin/apachectl
-rwxr-xr-x 1 apache apache 3452  3月 25 22:02 /usr/local/httpd-2.4.46/bin/apachectl
[root@Server1 ~]# ll /usr/local/httpd-2.4.46/bin/apxs
-rwxr-xr-x 1 apache apache 23889  3月 25 22:02 /usr/local/httpd-2.4.46/bin/apxs

Mod Dosdetectorの「Makefile」を編集する

[root@Server1 ~]# cd mod_dosdetector-fork-1.1.0
[root@Server1 ~]# vi Makefile

「Makefile」にapachectlコマンドとapxsコマンドのパスを追記する

~略~
#    the used tools
APXS=/usr/local/httpd-2.4.46/bin/apxs
APACHECTL=/usr/local/httpd-2.4.46/bin/apachectl
~略~

Mod Dosdetectorのビルド・デプロイ(各コマンド実行時にでエラーメッセージが出なければOK)
 ※「make test」コマンドは正常にmakeできているかのテストであり、時間がかかる為スキップしても良い。

[root@Server1 ~]# make
[root@Server1 ~]# make test
[root@Server1 ~]# make install

Apache設定ファイル「httpd.conf」に下記のmod_dosdetector.so読み込み行が追記されていることを確認する

確認ファイル {Apacheインストールディレクトリ}/conf/httpd.conf
確認対象文字列 LoadModule dosdetector_module modules/mod_dosdetector.so

5.Apache設定

必要モジュールがApacheインストールディレクトリ内に存在するか確認

[root@Server1 ~]# ll /usr/local/httpd-2.4.46/modules/mod_rewrite.so

Apache設定ファイル「httpd.conf」を編集する

編集対象ファイル {Apacheインストールディレクトリ}/conf/httpd.conf

「httpd.conf」に記載のmod_rewrite.so読み込み行のコメント「#」を解除する

LoadModule rewrite_module modules/mod_rewrite.so

「httpd.conf」にMod Dosdetectorの設定ファイルのパスを記載

<IfModule dosdetector_module>
 Include conf/mod_dosdetector.conf
</IfModule>
~略~
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule security2_module modules/mod_security2.so
LoadModule dosdetector_module modules/mod_dosdetector.so
~略~

6.Mod Dosdetector設定ファイル編集

Mod Dosdetector設定ファイル「dosdetector.conf」を編集する。

編集対象ファイル {Apacheインストールディレクトリ}/conf/extra/dosdetector.conf

<dosdetector.conf 設定プロパティ>

DoSDetection on
DoS検出設定を有効にする
DoSPeriod 3600
DoS検出する時間単位(秒):3600秒(1時間)
DoSThreshold 100
警告発生させるアクセス回数:100回
※指定した秒数の間にDoSThreshold回以上のアクセスがあるとSuspectDoS=1がセットされる
DoSHardThreshold 200
アクセス不可とするアクセス回数:200回
※DoSHardThreshold回以上のアクセスがあるとSuspectHardDoS=1がセットされる
DoSBanPeriod 300
規制解除時間:300秒(5分)
※DoS判定されるとDoSBanPeriodで指定した秒数の間SuspectDoS=1がセットされ続け、指定時間経過後に規制がクリアされる
DoSTableSize 100
保持するIP一覧の数:100個
※共有メモリに領域を確保し保管される
RewriteEngine On
リライトを有効にする
RewriteCond %{ENV:SuspectHardDoS} =1
SuspectHardDoSに1がセットされたらリライトする
RewriteRule .* – [R=503,L]
503エラーとしてリライトする
# Usualy apxs will add this line automatically in httpd.conf
#LoadModule dosdetector_module modules/mod_dosdetector.so

# Exclude images, stylesheets and javascript files
<IfModule setenvif_module>
    SetEnvIf Request_URI "\.(gif|jpe?g|ico|js|css|png)$" NoCheckDoS
</IfModule>

# Mod_DoSDetector configuration
DoSDetection     on
DoSPeriod        3600
DoSThreshold     100
DoSHardThreshold 200
DoSBanPeriod     300
DoSTableSize     100

# If you want to use named shared memory, uncommet this line.
#DoSShmemName

#<IfModule !setenvif_module>
#    DoSIgnoreContentType  image|javascript|css
#</IfModule>

# You can customize mutex configuration by Mutex directive.
#Mutex flock:/var/run/httpd dosdetector-shm

# You can log requests which are suspected to be DoS attacks
#LogFormat "%{SuspectHardDoS}e %a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" dosdetector
#CustomLog logs/dos_suspect_log dosdetector env=SuspectDoS

# send a 503 response with mod_rewrite
RewriteEngine On
RewriteCond %{ENV:SuspectHardDoS} =1
RewriteRule .*  - [R=503,L]

7.Mod Dosdetector設定適用

Apache・Tomcatを起動

[root@Server1 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@Server1 ~]# /usr/local/tomcat/bin/startup.sh
[root@Server1 ~]# /usr/local/src/modsecurity-2.9.3/bin/apachectl start

8.設定確認

Mod Dosdetectorを設定したサーバへ、別サーバから設定値を超過する量のリクエストを送り、設定した通り300リクエストほどが200以外のHTTPステータスで返却されることを確認する。

[root@Server2 ~]# cd /usr/local/apache/bin/
[root@Server2 ~]# ./ab -n 500 -c 100  http://{Server1のIPアドレス}:80/
This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.x.xx (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Finished 500 requests


Server Software:
Server Hostname:        192.168.x.xx
Server Port:            80

Document Path:          /
Document Length:        45 bytes

Concurrency Level:      100
Time taken for tests:   0.423 seconds
Complete requests:      500
Failed requests:        301
   (Connect: 0, Receive: 0, Length: 301, Exceptions: 0)
Non-2xx responses:      301
Total transferred:      194598 bytes
HTML transferred:       98954 bytes
Requests per second:    1181.19 [#/sec] (mean)
Time per request:       84.660 [ms] (mean)
Time per request:       0.847 [ms] (mean, across all concurrent requests)
Transfer rate:          448.94 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    7   6.2      5      25
Processing:     7   36  31.2     30     236
Waiting:        2   31  29.6     24     210
Total:         18   44  31.8     37     247

Percentage of the requests served within a certain time (ms)
  50%     37
  66%     43
  75%     48
  80%     51
  90%     65
  95%     96
  98%    211
  99%    215
 100%    247 (longest request)

Mod Dosdetectorを設定したサーバのApacheログ「error_log」にエラーログが出力されていることを確認する

確認ログ {Apacheインストールディレクトリ}/logs/error_log
[Fri May 28 17:26:25.188479 2021] [dosdetector:notice] [pid 30383:tid 139724180457216] [client 192.168.x.xx:60648] '192.168.x.xx' is suspected as DoS attack! (counter: 101)
[Fri May 28 17:26:25.235703 2021] [dosdetector:notice] [pid 30385:tid 139724172064512] [client 192.168.x.xx:60812] '192.168.x.xx' is suspected as Hard DoS attack! (counter: 201)