Apache2.4にDos攻撃対策のmod_dosdetector-forkをインストール
Apache2.4にDos攻撃対策のmod_dosdetector-forkをRPMパッケージからインストールした時のメモ
mod_dosdetector-forkはIPアドレスごとに同時接続数を制限するモジュールです。
Apache 2.4版 mod_dosdetector-fork バージョン1.1.0
https://github.com/tkyk/mod_dosdetector-fork
RPMパッケージの作成時に必要なコマンド・ライブラリ
インストールされていない場合は、以下のコマンドでインストール
# yum install wget # yum install rpm-build # yum install gcc # yum install openldap-devel # yum install expat-devel # yum install libdb-devel # yum install apr-devel IUSリポジトリ使ってApacheをインストールしたのでhttpd-develもIUSリポジトリからインストール # yum --disablerepo=base,extras,updates --enablerepo=ius install httpd-devel
rpmbuild専用のユーザを作成
rpmbuildコマンドは、rootユーザでは実行しないほうがいいようなので専用ユーザを作成します。
ユーザ作成
# useradd rpmbuilder
パスワード設定
# passwd rpmbuilder 新しいパスワード: [パスワード設定][Enter] 新しいパスワードを再入力してください: [パスワード再入力][Enter]
RPMの作成
rpmbuild専用のユーザに切換えます
# su rpmbuilder
作業用ディレクトリ作成
$ cd /home/rpmbuilder/ $ mkdir -p src/mod_dosdetector-fork/
mod_dosdetector-fork ダウンロード
$ cd src/mod_dosdetector-fork/ $ wget https://github.com/tkyk/mod_dosdetector-fork/archive/1.1.0.tar.gz
RPMを作成
$ mv 1.1.0.tar.gz mod_dosdetector-fork-1.1.0.tar.gz $ rpmbuild -tb --clean mod_dosdetector-fork-1.1.0.tar.gz
※「/home/rpmbuilder/rpmbuild/RPMS/x86_64/」にRPMが作成されます。
作成したRPMのインストール
rootユーザに戻ります
$ exit
rootユーザでインストール
# rpm --install /home/rpmbuilder/rpmbuild/RPMS/x86_64/mod_dosdetector-fork-1.1.0-1.x86_64.rpm
dosdetector.confの設定
/etc/httpd/conf.d/dosdetector.conf
変更前にバックアップ
# cp -p /etc/httpd/conf.d/dosdetector.conf /etc/httpd/conf.d/dosdetector.conf_`date "+%Y%m%d%H%M%S"`
LoadModule dosdetector_module modules/mod_dosdetector.so <IfModule setenvif_module> SetEnvIf Request_URI "\.(gif|jpe?g|png|ico|js|css)$" NoCheckDoS </IfModule> DoSDetection on DoSPeriod 10 DoSThreshold 20 #DoSHardThreshold 15 DoSBanPeriod 60 DoSTableSize 100 #DoSShmemName mod_dosdetector #LogFormat "%{SuspectHardDoS}e %a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" dosdetector #LogFormat "[%{%Y-%m-%d %H:%M:%S}t] %a:%p %u %D %m %H %>s %U%q \"%{Referer}i\" \"%{User-Agent}i\"" dosdetector_space LogFormat "[%{%Y-%m-%d %H:%M:%S}t]\t%a:%p\t%u\t%D\t%m\t%H\t%>s\t%U%q\t\"%{Referer}i\"\t\"%{User-Agent}i\"" dosdetector_tab
※同一IPアドレスから10秒間に20回以上のアクセスがあった場合「DoS攻撃」と見なし、その後60秒間のアクセスに対しては環境変数「SuspectDoS」に「1」をセットします。
「DoS攻撃」と判定してから60秒が経過したら、次のアクセスでもう一度判定をやり直し、直近10秒のアクセスが20回を下回っていればリセットします。
VirtualHost設定
# mkdir -p /var/www/ip/html/
/etc/httpd/conf.d/11-ip.conf
mod_dosdetectorの設定を追加
<VirtualHost XXX.XXX.XXX.XXX:80> ServerName XXX.XXX.XXX.XXX DocumentRoot /var/www/ip/html <Directory /var/www/ip> AllowOverride none Options None Require all denied </Directory> <Directory /var/www/ip/html> Require method GET POST Options FollowSymLinks RewriteEngine On ### 簡易WAF ### Include conf.d/00-security.inc ### mod_dosdetector ### # RewriteCond %{ENV:SuspectHardDoS} =1 RewriteCond %{ENV:SuspectDoS} =1 RewriteCond %{HTTP_USER_AGENT} !(google|yahoo|msn|bing) [NC] RewriteRule .* - [R=503,L] </Directory> <Directory /var/www/ip/html/phpMyAdmin> RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L] ### IP制限 ### <RequireAll> <RequireAny> Require all denied Require ip 999.999.999.999 </RequireAny> Require method GET POST </RequireAll> </Directory> CustomLog logs/ip_access_log combined_tab env=!nolog ErrorLog logs/ip_error_log ### mod_dosdetector ### CustomLog logs/ip_dos_log dosdetector_tab env=SuspectDoS </VirtualHost>
※上の設定で、「SuspectDoS」が「1」の場合「HTTPステータスコード=503」を返します。
「XXX.XXX.XXX.XXX」はサーバのIPアドレスを設定します。
「999.999.999.999」は接続元(会社/自宅等)のIPアドレスを設定します。
/etc/httpd/conf.d/51-ip-ssl.conf
mod_dosdetectorの設定を追加
<VirtualHost XXX.XXX.XXX.XXX:443> ServerName XXX.XXX.XXX.XXX DocumentRoot /var/www/ip/html SSLEngine on SSLVerifyClient none SSLCompression off SSLHonorCipherOrder on # SSLProtocol ALL -SSLv2 -SSLv3 # SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA SSLProtocol ALL -SSLv2 -SSLv3 SSLCipherSuite HIGH:!aNULL:!eNULL:!DH:!3DES SSLCertificateKeyFile /etc/tls/apache.key SSLCertificateFile /etc/tls/apache.crt Header always set Strict-Transport-Security "max-age=31536000" <Directory /var/www/ip> AllowOverride none Options None Require all denied </Directory> <Directory /var/www/ip/html> Require method GET POST Options FollowSymLinks RewriteEngine On ### 簡易WAF ### Include conf.d/00-security.inc ### mod_dosdetector ### # RewriteCond %{ENV:SuspectHardDoS} =1 RewriteCond %{ENV:SuspectDoS} =1 RewriteCond %{HTTP_USER_AGENT} !(google|yahoo|msn|bing) [NC] RewriteRule .* - [R=503,L] </Directory> <Directory /var/www/ip/html/phpMyAdmin> ### ベーシック認証・IP制限 ### AuthType Basic AuthName "Input ID and Password." AuthUserFile /var/www/ip/.htpasswd <RequireAll> <RequireAny> Require all denied Require ip 999.999.999.999 </RequireAny> Require method GET POST Require valid-user </RequireAll> </Directory> CustomLog logs/ip_ssl_access_log combined_tab env=!nolog ErrorLog logs/ip_ssl_error_log ### mod_dosdetector ### CustomLog logs/ip_ssl_dos_log dosdetector_tab env=SuspectDoS </VirtualHost>
※上の設定で、「SuspectDoS」が「1」の場合「HTTPステータスコード=503」を返します。
「XXX.XXX.XXX.XXX」はサーバのIPアドレスを設定します。
「999.999.999.999」は接続元(会社/自宅等)のIPアドレスを設定します。
シンタックスチェック
# service httpd configtest Syntax OK
※シンタックスエラーがないことを確認
設定ファイルの再読み込み
# systemctl reload httpd.service
Dos攻撃対策の確認
程度にF5攻撃して「HTTPステータスコード=503」となればOKです。
くれぐれも自分のサイトで試してください。
mod_dosdetector-forkリファレンス
・DoSDetection
DoS攻撃チェックの有効/無効(on/off)を切り替える。
・DoSPeriod
DoS攻撃チェックの基準となる間隔。(秒)
・DoSThreshold
DoS攻撃の疑いありと見なすアクセス数の値。DoSPeriod秒以内にDoSThreshold回以上のアクセスがあると、環境変数「SuspectDoS」に「1」をセットします。
・DoSHardThreshold
より強いDoS攻撃の疑いありと見なすアクセス数の値。DoSPeriod秒以内にDoSHardThreshold回以上のアクセスがあると、環境変数「SuspectHardDoS」に「1」をセットします。
※今回の設定では使用していません
・DoSBanPeriod
一度DoS攻撃の疑いがかかってから、チェックをリセットするまでの秒数。(環境変数SuspectDoSが保持される秒数)
・DoSTableSize
同時に追跡するIPアドレスの数。(多すぎるとその分リソースを消費する)
・DoSShmemName
共有メモリの名前。省略した場合は匿名の共有メモリが使用される。(匿名の共有メモリをサポートしていないプラットフォームでのみ設定してください)
※今回の設定では使用していません