質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

apache mod_dosdetectorが動かない

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 3,026

score 13

apacheの設定でDos対策としてmod_dosdetectorを設定しましたがうまく動作しません
原因切り分けの方法についてご教授いただけますでしょうか。

環境:
Red Hat Enterprise Linux Server release 6.6 (Santiago) 
Apache/2.4.12 (Red Hat)

httpd.confに以下設定を追加

#################

DoSDetection on
DoSPeriod 10
DoSThreshold 20
DoSHardThreshold 20
DoSBanPeriod 30
DoSTableSize 3000
DoSIgnoreContentType image|javascript|css

LogLevel alert rewrite:trace8

RewriteEngine On
RewriteCond %{ENV:SuspectHardDoS} =1
RewriteRule .* - [R=503,L]
ErrorDocument 503 "Server is busy.(SuspectHardDoS)"

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
CustomLog "logs/dos_suspect_log" combined

RewriteCond %{ENV:SuspectDoS} =1
RewriteRule .* - [R=503,L]
ErrorDocument 503 "Server is busy.(SuspectDoS)"

############################################

想定では、Topページ(ログインページ)に対して10秒間に20回以上のアクセスをされた場合、
閾値を超え"Server is busy"を表示させようとしていますが、思うように動作しません。
操作としてはIEでTopページを表示し、F5キー連打でアクセス数をあげようとしています。
原因切り分けの方法などありましたらよろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

Apache の 2.4.Xと理解して回答します。
まず本来のこのオプションの目的はDos攻撃に対してのサーバーの挙動制限です。
このオプションが出来る事をまず理解。

  1. クライアントのIPアドレス一覧を共有メモリに保持
  2. IPに紐付けてアクセス数やアクセス時間を記録
  3. 一定時間内のアクセス数が設定した閾値を超えたらSuspectDoSという環境変数に1をセットする

さて、このオプションを正常動作させるための設定は?
貴殿は"httpd.conf"の設定を示されています。
ではそのディレクティブに関しての設定を確認します。
本オプションでは
<DoSIgnoreIpRange>
を用いてDoS検査の対象から除外するIP範囲を指定。
これは複数行の記述が可能です。
まあ既知のつなぐべきマシンのIPを列挙。
続いて
<IncludePath/ExcludePath>
DoS検査を行う対象をrequest_uriで絞り込み。

  1. ExcludePath優先、ExcludePathにマッチしたらDoS検査を行わない。
  2. IncludePathを次に検査、IncludePathが1つも設定されていない場合はIncludePathに / が指定されているのと同じ動作をする。
  3. IncludePathが1つ以上ある場合は明示的にIncludePathに指定されたパスのみDoS検査の対象とします。
    この設定は”OR”設定ですのでどれか条件が当てはまったら動作。

続いて
X-Forwarded-Forに複数IPを含む場合の処理を変更します。
X-Forwarded-Forヘッダの末尾からIP候補を探します。カンマ区切りで順に取得して、IPとして無効な文字列やDoSIgnoreIpRangeに含まれるIPを除外した最初(より末尾に近い)のIPをDoS検査対象とします。
これで X-Forwarded-Forヘッダを偽装されても正しくDoS検査を行うことができます。

DoSForwardedがOnでX-Forwarded-Forが存在しない場合の処理を変更。
DoSForwardedがONの場合は、X-Forwarded-Forが存在しなければDoS検査を行わないようになってます。

詳しくは”mod_dosdetector”の設定を確認して下さい。
ここら辺が怪しいと思いましたので。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/24 12:20

    コメントありがとうございます。指摘いただきました、<DoSIgnoreIpRange><IncludePath/ExcludePath>ともに使っておりません。したがって全てのアクセスが検査対象となると認識しております。
    検証のうごきからすると、Topページに対しては閾値設定が有効でない(きいてない)ように思えます。
    一方Webサーバから他サーバへリクエストを投げているのですがそこは有効になっている(エラー画面503busyが表示される)ような動きです。
    httpd.confを掲載します(一部変更しています)何か無効設定となってしまう箇所があるのでしょうか
    ServerRoot "/opt/rh/httpd24/root/etc/httpd"

    Listen 80

    LoadModule dosdetector_module /opt/rh/httpd24/root/usr/lib64/httpd/modules/mod_dosdetector.so
    Include conf.modules.d/*.conf

    User apache
    Group apache

    ServerAdmin root@localhost

    ServerName 127.0.0.1

    <Directory />
    AllowOverride none
    Require all denied
    </Directory>

    DocumentRoot "/opt/rh/httpd24/root/var/www/html"

    <Directory "/opt/rh/httpd24/root/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
    </Directory>

    <Directory "/opt/rh/httpd24/root/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
    </Directory>

    <IfModule dir_module>
    DirectoryIndex index.html
    </IfModule>

    <Files ".ht*">
    Require all denied
    </Files>

    ErrorLog "logs/error_log"

    LogLevel info

    <IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
    # You need to enable mod_logio.c to use %I and %O
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    CustomLog "logs/access_log" combined
    </IfModule>

    <IfModule alias_module>

    Alias /○○○○/image /var/lib/tomcat6/webapps/○○○○/image
    Alias /○○○○/script /var/lib/tomcat6/webapps/○○○○/script
    Alias /○○○○/style /var/lib/tomcat6/webapps/○○○○/style
    Alias /image /var/lib/tomcat6/webapps/○○○○/image
    Alias /script /var/lib/tomcat6/webapps/○○○○/script
    Alias /style /var/lib/tomcat6/webapps/○○○○/style

    ScriptAlias /cgi-bin/ "/opt/rh/httpd24/root/var/www/cgi-bin/"

    </IfModule>

    <Directory "/opt/rh/httpd24/root/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
    </Directory>
    <Directory "/var/lib/tomcat6/webapps/○○○○/image">
    AllowOverride None
    Options None
    Require all granted
    </Directory>
    <Directory "/var/lib/tomcat6/webapps/○○○○/script">
    AllowOverride None
    Options None
    Require all granted
    </Directory>
    <Directory "/var/lib/tomcat6/webapps/○○○○/style">
    AllowOverride None
    Options None
    Require all granted
    </Directory>

    <IfModule mime_module>
    TypesConfig /etc/mime.types

    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz

    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
    </IfModule>

    AddDefaultCharset UTF-8

    <IfModule mime_magic_module>
    MIMEMagicFile conf/magic
    </IfModule>


    EnableSendfile on

    IncludeOptional conf.d/*.conf


    <Files ~ "\.(css|js)$">
    FileEtag None
    RequestHeader unset If-Modified-Since
    Header set Cache-Control no-store
    </Files>

    ProxyTimeout 1200
    ProxyPass /iwfm/servlet/FMServlet http://192.168.XXX.XX:8080/iwfm/servlet/FMServlet max=20 smax=5
    ProxyPassReverse /iwfm/servlet/FMServlet http://192.168.XXX.XX:8080/iwfm/servlet/FMServlet

    ProxyPass /test_print ajp://localhost:8009/test_print/

    ProxyPass /○○○○/image !
    ProxyPass /○○○○/script !
    ProxyPass /○○○○/style !
    ProxyPass /image !
    ProxyPass /script !
    ProxyPass /style !
    ProxyPass /○○○○ ajp://localhost:8009/○○○○/
    ProxyPassReverse /○○○○ ajp://localhost:8009/○○○○/


    DoSDetection on

    DoSPeriod 10
    DoSThreshold 20
    DoSHardThreshold 20
    DoSBanPeriod 30

    DoSTableSize 3000

    DoSIgnoreContentType ^(image/|application/|script/javascript|style/css)

    ############################################################################
    LogLevel alert rewrite:trace8

    RewriteEngine On

    RewriteCond %{ENV:SuspectHardDoS} =1
    RewriteRule .* - [R=503,L]
    ErrorDocument 503 "Server is busy.(SuspectHardDoS)"

    LogFormat "%{SuspectHardDoS}e %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" dos_suspect
    CustomLog logs/dos_suspect_log dos_suspect env=SuspectDoS
    CustomLog logs/access_log combined env=!SuspectDoS

    RewriteCond %{ENV:SuspectDoS} =1
    RewriteRule .* - [R=503,L]
    ErrorDocument 503 "Server is busy.(SuspectDoS)"

    #############################################################################

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る