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のディレクティブのチューニング
ディレクティブ | デフォルト値 | 説明 |
---|---|---|
|
|
リクエストが失敗するまでのサーバー待機時間。 |
|
|
クライアントからリクエスト・ヘッダーとリクエスト本体を受信する際のタイムアウト。 「スローHTTP攻撃からのOracle HTTP Serverの保護」を参照してください。 |
|
|
サーバーが永続的な接続で後続のリクエストを待機する時間。 このディレクティブを高い値に設定すると、負荷の高いサーバーでパフォーマンスの問題が発生する可能性があります。タイムアウト値を大きくすると、アイドル・クライアントとの接続を待機して、いくつかのサーバー・プロセスが占有されてしまう可能性があります。 |
|
|
クライアントから送信されたHTTPリクエスト本体の合計サイズを制限します クライアント入力によってトリガーされるリソース消費を制限するように、このディレクティブを構成します。 |
|
|
クライアントから許可されるHTTPリクエスト・ヘッダーのサイズを制限します。 クライアント入力によってトリガーされるリソース消費を制限するように、このディレクティブを構成します。 |
|
|
XMLベースのリクエスト本体のサイズを制限します XMLベースのリクエスト本体の最大サイズを制限するように、このディレクティブを構成します。 |
|
該当なし |
リスニング・ソケットに対してオペレーティング・システム固有の最適化を有効にします noneを引数として使用すると、そのプロトコルの受入れフィルタがすべて無効になります。 |
|
|
同時に処理されるリクエストの数の制限を設定します。 デフォルト値を大きくするには、 |
|
該当なし |
CGIプログラムからの出力が増えるまでの待機時間を制限します。 デフォルトでは、 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
ディレクティブを変更するには:
-
Fusion Middleware Controlアプリケーションの「サーバーの詳細構成」ページまたはテキスト・エディタを使用して、
httpd.conf
ファイルを開きます。 -
ファイルの
LoadModule
セクションで、mod_reqtimeout
がまだ構成されていない場合は、次の行を追加してmod_reqtimeout
モジュールをロードします:LoadModule reqtimeout_module "${PRODUCT_HOME}/modules/mod_reqtimeout.so"
-
構成内の次のディレクティブを編集します:
<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を参照してください。