4 既知のWebサーバー攻撃からのOracle HTTP Serverの保護

この章では、DoS攻撃およびスローHTTP攻撃からOracle HTTP Serverを保護するためのガイダンスを提供します。

Webサーバー攻撃は、アクセス頻度の高いURIを監視してリクエストを拒否することによって検出できます。攻撃からWebサーバーを保護する方法の一部を次に示します:

DoS攻撃からのOracle HTTP Serverの保護

サービス拒否(DoS)とは、攻撃を実行して、システムが正規のユーザーにサービスを提供できないようにする行為です。

すべてのネットワーク・サーバーは、サーバーのリソースを占有することでクライアントへのレスポンスを妨害しようとする、DoS攻撃を受ける可能性があります。このような攻撃を完全に防ぐことはできませんが、攻撃によって生じる問題を軽減することは可能です。

多くの場合、最適なアンチDoSツールは、ファイアウォールやその他のオペレーティング・システム構成になります。たとえば、ほぼすべてのファイアウォールでは、1つのIPアドレスまたはネットワークからの同時接続数を制限するように構成できるため、単純な攻撃を少なからず回避できます。

表4-1は、Oracle HTTP Serverのパフォーマンス向上のためのチューニングに役立つディレクティブのリストを示します。また、これらのディレクティブにより、サーバー管理者は異常なクライアント・リクエストに対する制御を強化できるようになり、潜在的なDoS攻撃から保護できます。これらのディレクティブのチューニングによって、アプリケーションのパフォーマンスの一部に影響を与える可能性があります。適切に動作すること確認するには、適切なテストを行う必要があります。ほとんどの場合、各ディレクティブに指定されているデフォルト値を使用できます。

表4-1 Oracle HTTP Serverのディレクティブのチューニング

ディレクティブ デフォルト値 説明

TimeOut

60秒

リクエストが失敗するまでのサーバー待機時間。

RequestReadTimeout

header=5-40秒、MinRate=500秒

body=10秒、MinRate=500秒

クライアントからリクエスト・ヘッダーとリクエスト本体を受信する際のタイムアウト。

「スローHTTP攻撃からのOracle HTTP Serverの保護」を参照してください。

KeepAliveTimeout

5リ秒

サーバーが永続的な接続で後続のリクエストを待機する時間。

このディレクティブを高い値に設定すると、負荷の高いサーバーでパフォーマンスの問題が発生する可能性があります。タイムアウト値を大きくすると、アイドル・クライアントとの接続を待機して、いくつかのサーバー・プロセスが占有されてしまう可能性があります。

LimitRequestBody

0

クライアントから送信されたHTTPリクエスト本体の合計サイズを制限します

クライアント入力によってトリガーされるリソース消費を制限するように、このディレクティブを構成します。

LimitRequestFieldSize

8190バイト

クライアントから許可されるHTTPリクエスト・ヘッダーのサイズを制限します。

クライアント入力によってトリガーされるリソース消費を制限するように、このディレクティブを構成します。

LimitXMLRequestBody

1000000バイト

XMLベースのリクエスト本体のサイズを制限します

XMLベースのリクエスト本体の最大サイズを制限するように、このディレクティブを構成します。

AcceptFilter

該当なし

リスニング・ソケットに対してオペレーティング・システム固有の最適化を有効にします

noneを引数として使用すると、そのプロトコルの受入れフィルタがすべて無効になります。

MaxRequestWorkers

250

同時に処理されるリクエストの数の制限を設定します。

デフォルト値を大きくするには、ServerLimitディレクティブも呼び出す必要があります

CGIDScriptTimeout

該当なし

CGIプログラムからの出力が増えるまでの待機時間を制限します。

デフォルトでは、Timeoutディレクティブの値が使用されます。デフォルト値を上書きするように、CGIDScriptTimeoutディレクティブを構成します。

CGIアプリケーションを使用している場合は、『Oracle HTTP Serverの管理』CGIDScriptTimeoutディレクティブに関する項を参照してください。

パフォーマンス・チューニングの詳細は、『パフォーマンスのチューニング』Oracle HTTP Serverのチューニングに関する項を参照してください。

ディレクティブの詳細は、Apache HTTP Serverのドキュメントを参照してください。

スローHTTP攻撃からのOracle HTTP Serverの保護

スローHTTP POSTサービス拒否(DoS)攻撃とは、アプリケーションレベルのDoS攻撃の1つであり、低速のトラフィックをサーバーに送信し、長期間にわたってオープン接続を維持することでサーバー・リソースを消費します。

スローHTTP POST DoS攻撃の場合、帯域幅消費型のDoS攻撃とは異なり、大量のトラフィックをサーバーに送信する必要がありません。必要なのは、クライアントがオープン接続を数分間維持できることのみです。サーバーが維持しているオープン接続が多すぎると、新規の正当な接続に応答できない可能性があります。

この攻撃では、大きな値が指定されたcontent-lengthヘッダーを含む精巧なHTTP POSTヘッダーを送信して、予想されるデータ量をWebサーバーに通知することにより、サーバー接続をオープンのまま維持します。HTTP POSTヘッダーが完全に送信された後、HTTP POSTメッセージ本体が低速で送信されるので、接続が完了するまで時間がかかり、サーバーのリソースが占有されます。

完全なリクエスト本体を待機することにより、クライアントは低速の接続や断続的な接続でもリクエストを完了できるようになりますが、サーバーが攻撃にさらされます。

スローHTTP攻撃に対処するには、mod_reqtimeoutモジュールによって提供されるRequestReadTimeoutディレクティブをチューニングすることをお薦めします。このディレクティブは、クライアントからリクエスト・ヘッダーとリクエスト本体を受信する際の様々なタイムアウトを指定します。構成されている時間内にクライアントがヘッダーまたは本体を送信できない場合は、408 Request Timeoutエラーが送信されるため、サービス拒否攻撃が防止されます。

RequestReadTimeoutディレクティブを変更するには:

  1. Fusion Middleware Controlアプリケーションの「サーバーの詳細構成」ページまたはテキスト・エディタを使用して、httpd.confファイルを開きます。

  2. ファイルのLoadModuleセクションで、mod_reqtimeoutがまだ構成されていない場合は、次の行を追加してmod_reqtimeoutモジュールをロードします:

    LoadModule reqtimeout_module "${PRODUCT_HOME}/modules/mod_reqtimeout.so"

  3. 構成内の次のディレクティブを編集します:

    <IfModule reqtimeout_module>
      RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
     </IfModule>

ノート:

このディレクティブのチューニングによって、アプリケーションのパフォーマンスの一部に影響を与える可能性があります。適切に動作すること確認するには、適切なテストを行う必要があります。My Oracle SupportのドキュメントID 2350321.1の「必要なテスト」を参照してください。

Hostヘッダー攻撃からのOracle HTTP Serverの保護

HTTP Hostヘッダー攻撃は、Hostヘッダーの値を安全でない方法で処理する脆弱なWebサイトを悪用します。サーバーがHostヘッダーを暗黙的に信頼し、適切に検証またはエスケープできない場合、攻撃者はこの入力を使用して、サーバー側の動作を操作する有害なペイロードを挿入できる可能性があります。

攻撃が発生する可能性があるのは、アプリケーションがHostまたはX-Forwarded-Hostリクエスト・ヘッダーからの入力を、適切な検証を行わずにレスポンスの一部として使用する場合です。これらのヘッダーからの情報は、攻撃者が改ざんできる別のクライアント側の値であり、意図しない動作が発生する可能性があるため、信頼できません。これは、httpd.confファイルに次のディレクティブを追加することで緩和できます:

  • RewriteCond %{HTTP_HOST} !^<Webサイト>
  • RewriteRule ^(.*)$ - [F,L]

RewriteCondディレクティブは、リクエストとともに送信されるHostヘッダーをチェックし、ディレクティブで指定された2番目の引数<Webサイト>に一致させます。RewriteRuleディレクティブは、RewriteCondディレクティブが設定されている場合にのみ実行されます。RewriteRuleディレクティブは、次の3つの引数を取ります:

  • 最初の引数は、置き換えるURLを指定します。値^(.*)$は、存在するすべてのURLを置き換えます。
  • 2番目の引数は、最初のURLを置き換えるURLを指定します。値-は、最初のURLを他の値に置き換えないことを指定します。
  • 3番目の引数はフラグ用です。最初のフラグFはForbiddenを示し、ユーザーはリクエストで403 Forbiddenステータス・コードを受け取ります。2番目のフラグLはLastを示し、これは構成で考慮される最後のRewriteRuleになることを意味します。Lフラグの後に多数のRewriteRuleを指定した場合、それらは考慮されません。

ノート:

RewriteCondおよびRewriteRulesは継承されません。これらは、VirtualHostごとに個別に指定する必要があります。VirtualHostごとにRewriteRuleを指定せず、構成全体で同じルールを保持する場合は、各VirtualHostsに次の行を追加することで、前述の構成のスコープをグローバルにできます:

  • RewriteEngine On
  • RewriteOptions Inherit #this will inherit global configuration

これを実現するもう1つの方法は、グローバル・コンテキストでInheritDownまたはInheritDownBeforeの値を使用してRewriteOptionsを指定することです。ただし、VirtualHostsにRewriteEngine Onを追加する必要があります。

My Oracle Support (ドキュメントID 2356329.1)およびApache Module mod_rewriteを参照してください。