備忘録

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

共有メモリの名前。省略した場合は匿名の共有メモリが使用される。(匿名の共有メモリをサポートしていないプラットフォームでのみ設定してください)

※今回の設定では使用していません