要求フィルターの使用方法

作成者 : iisteam
発行日 : 2007 年 11 月 22 日 (作業者 : iisteam (英語))
更新日 : 2008 年 3 月 13 日 (作業者 : iisteam (英語))

はじめに

IIS の旧バージョンでは、セキュリティ ツールの URLScan がアドオンとして提供されていたため、管理者は Web サーバーで厳格なセキュリティ ポリシーを施行することが可能でした。IIS 7.0 では、URLScan のすべての主要機能が要求フィルターというモジュールに組み込まれ、非表示セグメントという機能が追加されました。ここでは、要求フィルターの各機能を整理し、お使いの環境で使用する方法を例示します。

この記事には次のような内容が含まれています。

  • 二重エンコードされた要求のフィルター処理
  • ハイビット文字のフィルター処理
  • ファイル拡張子に基づくフィルター処理
  • 要求の限度に基づくフィルター処理
  • 動詞によるフィルター処理
  • URL シーケンスに基づくフィルター処理
  • まとめ

二重エンコードされた要求のフィルター処理

この機能では、二重エンコードされた要求を使用する攻撃を防ぐことができます。この機能は、攻撃側が二重エンコードされた要求を注意深く作成し、それを IIS 7.0 に送信する場合に使用します。このような攻撃が行われた場合、IIS 7.0 は他の場合なら拒否したであろう要求を受け入れる可能性があります。この機能を有効にすると、IIS 7.0 は URL を 2 度正規化し、最初の正規化が次の正規化と異なる場合、要求は拒否されます。この機能により IIS 7.0 が要求を拒否すると、エラー コード 404.11 がログされます。

URLScan での同等オプション

これは、UrlScan の VerifyNormalization オプションに相当します。

この例では、サーバー管理者は二重エンコードされた要求を IIS 7.0 で一切処理しないことを希望しています。このシナリオを実装するには、次の構成を使用します。


<configuration>
 <system.webServer>
  <security>
   <requestFiltering
                  allowDoubleEscaping="false">   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

ハイビット文字のフィルター処理

この機能では、非 ASCII 文字を含む IIS 7.0 へのすべての要求を許可または拒否します。

この機能により IIS 7.0 が要求を拒否すると、エラー コード 404.12 がログされます。

URLScan での同等オプション

これは、UrlScan の AllowHighBitCharacters オプションに相当します。

この例では、サーバー全体ではハイ ビット文字を許可せず、1 つのアプリケーションでのみハイ ビット文字を許可します。そのためには、applicationHost.config では allowHighBitCharacters="false" を設定し、他方、アプリケーション ルート内ではこの単一アプリケーションで非 ASCII 文字を受け入れる web.config を作成します。web.config で使用する構成は、次のとおりです。


<configuration>
 <system.webServer>
  <security>
   <requestFiltering
                  allowHighBitCharacters="true">   
    </requestFiltering>
  </security>
 </system.webServer>
</configuration>

ファイル拡張子に基づくフィルター処理

この機能では、IIS 7.0 が処理できる一連のファイル拡張子を定義します。

この機能により IIS 7.0 が要求を拒否すると、エラー コード 404.7 がログされます。

URLScan での同等オプション

これは、UrlScan の AllowExtensions and DenyExtensions オプションに相当します。

この例では、サーバー管理者は ASP ファイルは処理せず、他のすべては許可することを希望しています。そのためには、fileExtensions の allowUnlisted オプションを "true" に設定し、明示的に ASP を拒否するファイル拡張子エントリを定義します。以下を参照してください。


<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <fileExtensions allowUnlisted="true" >
     <add fileExtension=".asp" allowed="false"/>
    </fileExtensions>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

要求の限度に基づくフィルター処理

このフィルターでは、次の 3 つの機能を組み合わせています。

1. maxAllowedContentLength - コンテンツ サイズの上限です。

2. maxUrl - URL の長さの上限です。

3. maxQueryString - クエリ文字列の長さの上限です。

この機能により IIS 7.0 が要求を拒否すると、次のエラー コードがログされます。

ステータス コード 理由

404.13

コンテンツの長さが長すぎます

404.14

URL が長すぎます

404.15

クエリ文字列が長すぎます

URLScan での同等オプション

これらの各値は、URLScan で同じ名前で使用可能でした。

  • maxAllowedContentLength
  • maxUrl
  • maxQueryString

企業では、購入したソフトウェアのソース コードにアクセスできないことがよくあります。そのうちに、コードに脆弱性が検出されたとします。影響を受けたコードの更新プログラムを入手することは、一般に容易ではありません。こうした脆弱性は一般に、単にアプリケーションに送信された URL やクエリ文字列が長すぎる、または送信されたコンテンツが多すぎることが原因となっています。サーバー管理者は安全な上限を設定した後、アプリケーションのバイナリに修正プログラムを適用することなく、以下の構成を使用してこれらの限度を適用できます。

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <requestLimits
       maxAllowedContentLength="30000000"       
       maxUrl="260"       
       maxQueryString="25"/>   
    </requestFiltering>
  </security>
 </system.webServer>
</configuration>

動詞によるフィルター処理

この機能では、IIS 7.0 が要求の一部として受け入れる動詞のリストを定義します。

この機能により IIS 7.0 が要求を拒否すると、エラー コード 404.6 がログされます。

URLScan での同等オプション

これは、UrlScan の UseAllowVerbs、AllowVerbs、および DenyVerbs オプションに相当します。

管理者は、サーバーで GET という動詞のみを許可したいと考えています。そのためには、まず allowUnlisted="false" オプションを設定して、動詞をすべて許可しないように構成をロックダウンします。次に、明示的に許可する動詞をリストします。この例では、動詞 GET のみを許可します。

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <verbs
       allowUnlisted="false" >     
       <add verb="GET" allowed="true" />
    </verbs>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

URL シーケンスに基づくフィルター処理

この機能では、要求にシーケンスが含まれる場合に、IIS 7.0 が拒否するシーケンスのリストを定義します。

この機能により IIS 7.0 が要求を拒否すると、エラー コード 404.5 がログされます。

URLScan での同等の機能

これは、UrlScan の DenyUrlSequences 機能に相当します。

これは、非常に強力な機能です。以下の構成を使用して、IIS 7.0 で特定の文字シーケンスが処理されるのを防ぐことができます。

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <denyUrlSequences>
     <add sequence=".."/>
    </denyUrlSequences>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

この例では '..' シーケンスを拒否していますが、より現実的なシナリオとして、営業を終了したベンダーからアプリケーションを購入したが、特定の文字シーケンスが送信されたときに、そのアプリケーションに脆弱性があることが判明した場合が考えられます。この機能を使用すれば、アプリケーション コードに修正プログラムを適用しなくても、URL シーケンスを拒否リストに追加するだけでアプリケーションを保護できます。

非表示セグメントをフィルターで除外

この機能では、処理可能なセグメントを定義できます。

この機能により IIS 7.0 が要求を拒否すると、エラー コード 404.8 がログされます。

URLScan での同等の機能

これは IIS 7.0 の新機能で、URLScan には含まれていませんでした。

サーバー上に次の 2 つの URL がある例を考えてみます。

http://site.com/bin

http://site.com/binary

binary ディレクトリのコンテンツは許可しますが、bin ディレクトリのコンテンツは許可しないことを希望しています。URL シーケンスを使用してシーケンス "bin" を拒否する場合は、両方の URL へのアクセスが拒否されます。以下の構成を使用することで、bin へのアクセスは拒否し、binary のコンテンツは引き続き処理することができます。

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <hiddenSegments>
     <add segment="BIN"/>
    </hiddenSegments>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

まとめ

旧バージョンでは、IIS の管理者はグローバル レベルで URLScan を使用して、システムで施行するセキュリティ ポリシーを定義できました。IIS 7.0 の管理者は、引き続きグローバル レベルでこれらのポリシーを実装できるほか、さらに URL ごとにポリシーを実装し、新しい委任モデルが提供する利点をすべて活用できます。

このドキュメントでは、要求を拒否する際に要求のフィルタリングが返す新しいエラー コードをいくつか紹介しました。容易に参照できるように、以下に IIS 7.0 でログされるすべてのエラー コードを示します。

エラー 状態コード

サイトが見つかりません

404.1

ポリシーによって拒否されました

404.2

MIME マップによって拒否されました

404.3

ハンドラーがありません

404.4

要求のフィルタリング : URL シーケンスが拒否されました

404.5

要求のフィルタリング : 動詞が拒否されました

404.6

要求のフィルタリング : ファイル拡張子が拒否されました

404.7

要求のフィルタリング : 非表示セグメントによって拒否されました

404.8

非表示ファイル属性が設定されているため、拒否されました

404.9

要求のフィルタリング : 要求ヘッダーが長すぎるため、拒否されました

404.10

要求のフィルタリング : URL ダブル エスケープのため拒否されました

404.11

要求のフィルタリング : ハイ ビット文字のため、拒否されました

404.12

要求のフィルタリング : コンテンツの長さが長すぎるため、拒否されました

404.13

要求のフィルタリング : URL が長すぎるため、拒否されました

404.14

要求のフィルタリング : クエリ文字列が長すぎるため、拒否されました

404.15