IIS で要求のフィルタリングを構成する

作成者: Keith Newman および Robert McMurray

このドキュメントでは、一般的な要求フィルター設定を使用して IIS 8 Web サーバーのセキュリティを向上させる方法について説明します。

要求フィルターは、IIS 8 が処理する HTTP 要求の種類を制限します。 要求フィルターは特定の HTTP 要求をブロックすることで、有害な可能性のある要求がサーバーに到達しないようにするのに役立ちます。 要求フィルター モジュールは着信要求をスキャンし、ユーザーが設定した規則に基づいて好ましくない要求を拒否します。

既定では、IIS は重要なコード セグメントを参照する要求を拒否します。 また、一部のファイル名拡張子に対する要求を拒否します。

サーバー全体のレベルで要求フィルターを構成した後、Web サイト レベルで構成をオーバーライドできます。

前提条件

このチュートリアルを最大限に活用するには、次のいずれかのオペレーティング システムを実行しているコンピューターにアクセスできる必要があります。

  • Windows Server® 2012
  • Windows® 8

要求フィルターの一般的な設定

一般的な設定としては、次のような設定があります。

  1. 要求フィルターに記載されていない拡張子を持つファイルへのアクセスを許可するかどうか。
  2. 表示されていない HTTP 動詞を使用する要求を許可するかどうか。
  3. 高位ビット文字 (ASCII 以外) を含む要求を許可するかどうか。
  4. 二重にエンコードされた要求を許可するかどうか。
  5. 要求されるコンテンツの最大長。
  6. URL の最大長。
  7. クエリ文字列の最大サイズ。

UI を使用して要求フィルターの一般的なオプションを構成するには

  1. IIS マネージャーを開き、要求フィルターを構成するレベルを選択します。
  2. [機能ビュー] で、[要求のフィルタリング] をダブルクリックします。
  3. [操作] ウィンドウで、[機能設定の編集] をクリックします。
  4. [要求フィルター設定の編集] ダイアログ、目的に応じて設定を編集し、[OK] をクリックします。

コマンド ラインを使用して要求フィルターの一般的なオプションを構成するには

高位ビット文字を構成する

高位ビット文字を構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /allowhighbitcharacters:true|false

たとえば、高位ビット文字を許可するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /allowhighbitcharacters:true

ダブル エスケープを構成する

ダブル エスケープを構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /allowdoubleescaping:true|false

たとえば、ダブル エスケープを有効にするには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /allowdoubleescaping:true

許可されるコンテンツの最大長を構成する

コンテンツの許可された最大長の値を構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /requestlimits.maxallowedcontentlength:ユニット

変数 requestlimits.maxallowedcontentlength:unit が、コンテンツの最大長を指定します。

たとえば、コンテンツの最大長を 30000000 に設定するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /requestlimits.maxallowedcontentlength:30000000

許可される URL の最大長を構成する

着信 URL の許可される最大長の値を構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /requestlimits.maxurl:ユニット

変数 requestlimits.maxurl:unit が、着信 URL の最大長を指定します。

たとえば、着信 URL の最大長を 4096 に設定するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /requestlimits.maxurl:4096

許可されるクエリ文字列の最大長を構成する

着信クエリ文字列の許可される最大長の値を構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /requestlimits.maxquerystring:ユニット

変数 requestlimits.maxquertystring:unit が、クエリ文字列の最大長を指定します。

たとえば、着信クエリ文字列の最大長を 2048 に設定するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /requestlimits.maxquerystring:2048

HTTP ヘッダーの最大サイズを構成する

特定の HTTP ヘッダーにサイズ制限を構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /+requestlimits.headerLimits.[header='string',sizelimit='unit']

変数 header=string が、この制限が適用されるヘッダーを指定します。 変数 sizelimit=unit が、このヘッダーの最大サイズを指定します。

たとえば、contoso.com の値を含むヘッダーの最大サイズを 2048 に設定するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /+requestlimits.headerLimits.[header='contoso.com',sizelimit='2048']

ファイル名拡張子

追加する各ファイル名拡張子について、その種類のファイルに対する要求を許可するか拒否するかを示すことができます。

UI を使用してファイル名拡張子を構成するには

  1. IIS マネージャーを開き、要求フィルターを構成するレベルを選択します。
  2. [機能ビュー] で、[要求のフィルタリング] をダブルクリックします。
  3. [ファイル名拡張子] タブを選択します。
  4. [操作] ウィンドウで、[ファイル名拡張子の許可] または [ファイル名拡張子の拒否] のいずれかをクリックします。
  5. ボックスにファイル名拡張子を入力し、[OK] をクリックします。

コマンド ラインを使用してファイル名拡張子を構成するには

一覧にないファイル名拡張子を構成する

一覧にないファイル名拡張子を IIS がどのように処理するかを構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /fileExtensions.allowunlisted:true|false

たとえば、一覧にないファイル名拡張子を拒否するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /fileExtensions.allowunlisted:false

WebDAV 要求を構成する

ファイル名拡張子を WebDAV 要求に適用するかどうかを構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /fileExtensions.applyToWebDAV:true|false

たとえば、ファイル名拡張子を WebDAV 要求に適用しないように IIS を構成するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /fileExtensions.applyToWebDAV:false

ファイル名拡張子を追加または削除する

ファイル名拡張子を追加するには、次の構文を使用します。

appcmd set config /section:requestfiltering /+fileExtensions.[fileextension='string',allowed='true | false']

変数 fileextension=string が、追加または拒否するファイル名拡張子です。

たとえば、ファイル名拡張子 .xxx の許可規則を追加するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /+fileExtensions.[fileextension='.xxx',allowed='true']

ファイル名拡張子 .xxx の規則を削除するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /-fileExtensions.[fileextension='.xxx']

フィルタリング規則

IIS 8 では、着信要求に適用するカスタム フィルター規則を定義できます。 この機能を使用して、次のことを行うフィルターを定義できます。

  1. 要求 URL をスキャンします。
  2. URL に含まれるクエリ文字列をスキャンします。
  3. 特定のヘッダー フィールドをスキャンします。
  4. フィルターを適用するファイル名拡張子を定義します。
  5. 拒否する文字列を定義します。

UI を使用してフィルタリング規則を構成するには

  1. IIS マネージャーを開き、要求フィルターを構成するレベルを選択します。
  2. [機能ビュー] で、[要求のフィルタリング] をダブルクリックします。
  3. [ルール] タブを選択します。
  4. [操作] ウィンドウで、[フィルタリング規則の追加] をダブルクリックします。
  5. [名前] ボックスに、フィルタリング規則の名前を入力します。
  6. URL をスキャンする場合は、[URL のスキャン] チェック ボックスをオンにします。
  7. クエリ文字列をスキャンする場合は、[クエリ文字列のスキャン] チェック ボックスをオンにします。
  8. [ヘッダーのスキャン] で、スキャンするヘッダーを 1 つ以上入力します。
  9. [適用先] に、規則を適用するファイル名拡張子を 1 つ以上入力します。
  10. [文字列の拒否] に、拒否する文字列を 1 つ以上入力します。
  11. OK をクリックします。

非表示セグメント

この機能を使用すると、URL セグメント (フォルダー名など) を含む要求を拒否できます。

UI を使用して非表示セグメントを構成するには

  1. IIS マネージャーを開き、要求フィルターを構成するレベルを選択します。
  2. [機能ビュー] で、[要求のフィルタリング] をダブルクリックします。
  3. [非表示セグメント] タブを選択します。
  4. [操作] ウィンドウで、[非表示セグメントの追加] をクリックします。
  5. ボックスに URL セグメントを入力し、[OK] をクリックします。

コマンド ラインを使用して非表示セグメントを構成するには

WebDAV 要求を構成する

非表示セグメントを WebDAV 要求に適用するかどうかを構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /hiddensegments.applyToWebDAV:true|false

たとえば、非表示セグメントを WebDAV 要求に適用しないように IIS を構成するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /hiddensegments.applyToWebDAV:false

非表示セグメントを追加する

非表示セグメントを構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /+hiddensegments.[segment='string']

変数 segment=string が、非表示にする URL セグメントを指定します。

たとえば、/bin を非表示セグメントに指定するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /+hiddensegments.[segment='/bin']

URL フィルタリング

指定した URL を受け入れるように IIS を構成できます。 また、指定した URL シーケンスを拒否するように構成することもできます。

UI を使用して URL フィルタリングを構成するには

  1. IIS マネージャーを開き、要求フィルターを構成するレベルを選択します。
  2. [機能ビュー] で、[要求のフィルタリング] をダブルクリックします。
  3. [URL] タブを選択します。
  4. [操作] ウィンドウで、[許可する URL] または [拒否するシーケンス] を選択します。
  5. ボックスに URL または URL シーケンスを入力し、[OK] をクリックします。

コマンド ラインを使用して URL フィルタリングを構成するには

URL シーケンスを拒否するには、次の構文を使用します。

appcmd set config /section:requestfiltering /+denyurlsequences.[sequence='string']

変数 sequence=string が、IIS による解析を許可しない URL 内の文字のシーケンスを指定します。

たとえば、IIS が 2 つのピリオドを含む URL を解析しないことを指定するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /+denyurlsequences.[sequence='..']

HTTP 動詞

IIS 8 が要求の一部として受け付ける動詞のリストを定義できます。 この機能を基にして IIS が要求を拒否するときに記録されるエラー コードは、404.6 です。

UI を使用して一覧にない HTTP 動詞を構成するには

  1. IIS マネージャーを開き、要求フィルターを構成するレベルを選択します。
  2. [機能ビュー] で、[要求のフィルタリング] をダブルクリックします。
  3. [HTTP 動詞] タブをクリックします。
  4. [操作] ウィンドウで、[動詞の許可] または [動詞の拒否] をクリックします。
  5. ボックスに動詞を入力し、[OK] をクリックします。

コマンド ラインを使用して一覧にない HTTP 動詞を構成するには

一覧にない HTTP 動詞を構成する

一覧にない動詞を IIS がどのように処理するかを構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /verbs.allowunlisted:true|false

たとえば、一覧にない動詞を拒否するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /verbs.allowunlisted:false

WebDAV 要求を構成する

動詞のフィルタリングを WebDAV 要求に適用するかどうかを構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /verbs.applyToWebDAV:true|false

たとえば、動詞のフィルタリングを WebDAV 要求に適用しないように IIS を構成するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /verbs.applyToWebDAV:false

HTTP 動詞を追加する

フィルターする動詞を構成するには、次の構文を使用します。

appcmd set config /section:requestfiltering /+verbs.[verb='string',allowed='true|false']

変数 verb=string が、この制限が適用される動詞を指定します。

たとえば、GET が許可されることを指定するには、コマンド プロンプトで次のように入力し、Enter キーを押します。

appcmd set config /section:requestfiltering /+verbs.[verb='GET',allowed='true']

ヘッダー サイズの制限

HTTP 要求ヘッダーのサイズを制限して、パフォーマンスとセキュリティを向上させることができます。 ヘッダーは、HTTP トランザクションの動作パラメーターを定義する名前と値のペアです。

UI を使用してヘッダー サイズ制限を構成するには

  1. IIS マネージャーを開き、要求フィルターを構成するレベルを選択します。
  2. [機能ビュー] で、[要求のフィルタリング] をダブルクリックします。
  3. [ヘッダー] タブを選択し、[ヘッダーの追加] をクリックします。
  4. [ヘッダー] ボックスに、ヘッダー フィールドの名前を入力します。
  5. [サイズ制限] ボックスに、ヘッダー サイズの制限 (バイト単位) を表す正の整数を入力します。
  6. OK をクリックします。

クエリ文字列

要求された URL に含まれる目的のクエリ文字列を許可または拒否するように IIS 8 を構成できます。 たとえば、拒否したクエリ文字列が要求 URL 内に見つかった場合、その要求は拒否されます。

UI を使用してクエリ文字列を構成するには

  1. IIS マネージャーを開き、要求のフィルタリングを構成するレベルを選択します。
  2. [機能ビュー] で、[要求のフィルタリング] をダブルクリックします。
  3. [クエリ文字列] タブを選択し、[許可するクエリ文字列] または [拒否するクエリ文字列] をクリックします。
  4. [クエリ文字列] ボックスに、クエリ文字列を入力します。
  5. OK をクリックします。

要求フィルターのログ

IIS ログを使用して、要求フィルターの構成を評価し、最適化することができます。

次の表は、ログに記録される要求フィルターのエラー コードを示しています。

エラーの説明 状態コード
要求のフィルタリング: URL シーケンスが拒否されました 404.5
要求のフィルタリング: 動詞が拒否されました 404.6
要求のフィルタリング: ファイル名拡張子が拒否されました 404.7
要求のフィルタリング: 非表示セグメントによって拒否されました 404.8
要求のフィルタリング: URL のダブル エスケープのために拒否されました 404.11
要求のフィルタリング: 高位ビット文字のため拒否されました 404.12
要求のフィルタリング: URL が長すぎるため拒否されました 404.14
要求のフィルタリング: クエリ文字列が長すぎるため拒否されました 404.15
要求のフィルタリング: コンテンツが長すぎるため拒否されました 413.1
要求のフィルタリング: 要求ヘッダーが長すぎるため拒否されました 431

参照