要求のフィルタリング <requestFiltering>

  • 概要
  • 互換性
  • セットアップ
  • 方法
  • 構成
  • サンプル コード

※本ページに挿入されている画像をクリックすると、画像全体が別ウィンドウで表示されます。

概要

要求のフィルタリングは、インターネット インフォメーション サービス (IIS) 7.0 で導入された組み込みのセキュリティ機能で、IIS 6.0 の UrlScan アドオンで提供されていたほとんどの機能の代替となります。要求のフィルタリング機能のすべての設定は、<requestFiltering> 要素に含まれています。その中には、次の各機能分野に対応する複数の子要素があります。

  • <denyUrlSequences> - この要素には、IIS 7.0 が拒否する URL シーケンス パターンのコレクションを含めることができます。たとえば、攻撃者に悪用される可能性のある URL シーケンスの一部分を指定して、それを拒否できます。
  • <fileExtensions> - この要素には、IIS 7.0 が拒否または許可するファイル名拡張子のコレクションを含めることができます。たとえば、Web.config ファイルに対する要求をすべてブロックできます。
  • <hiddenSegments> - この要素には、参照できない URL のコレクションを含めることができます。たとえば、ASP.NET の App_Code フォルダーに対する要求を拒否できます。
  • <requestLimits> - この要素には、URL、コンテンツ、およびクエリ文字列の長さの設定が含まれます。HTTP ヘッダーに関するユーザー定義の最大長のコレクションを含めることもできます。
  • <verbs> - この要素には、IIS 7.0 が拒否または許可する HTTP 動詞のコレクションを含めることができます。たとえば、HTTP TRACE 要求をすべてブロックできます。

: 要求のフィルタリングで HTTP 要求がブロックされると、IIS 7.0 は HTTP 404 エラーをクライアントに返し、HTTP 状態、および要求が拒否された理由を示す固有の副状態をログに記録します。以下に例を示します。

HTTP 副状態 説明
404.5 URL シーケンスが拒否されました。
404.6 動詞が拒否されました。
404.7 ファイル拡張子が拒否されました。
404.8 名前空間が非表示にされています。
404.10 要求ヘッダーが長すぎます。
404.11 URL にダブル エスケープが指定されています。
404.12 URL にハイビット文字が使用されています。
404.13 コンテンツの長さが長すぎます。
404.14 URL が長すぎます。
404.15 クエリ文字列が長すぎます。

Web 管理者は、これらの副状態を使用して IIS ログを分析し、潜在的な脅威を特定することができます。

互換性

  IIS 7.0 IIS 6.0
説明 <requestFiltering> は IIS 7.0 で新たに導入された要素です。

<requestFiltering> 要素は、IIS 6.0 の UrlScan の機能に代わるものです。

セットアップ

IIS 7.0 の既定のインストールには、"要求のフィルタリング" 役割サービスが含まれます。"要求のフィルタリング" 役割サービスがアンインストールされている場合、次の手順を使用して再インストールできます。

Windows Server 2008

  1. タスク バーの [スタート] ボタンをクリックし、[管理ツール] をポイントして [サーバー マネージャー] をクリックします。

  2. [サーバー マネージャー] のツリー表示で、[役割] を展開して [Web サーバー (IIS)] をクリックします。

  3. [Web サーバー (IIS)] ウィンドウで、[役割サービス] セクションまでスクロールして [役割サービスの追加] をクリックします。

  4. 役割サービスの追加ウィザードの [役割サービスの選択] ページで、[要求フィルタ] を選択して、[次へ] をクリックします。

    拡大

  5. [インストール オプションの確認] ページで [インストール] をクリックします。

  6. [結果] ページで [閉じる] をクリックします。

Windows Vista

  1. タスク バーの [スタート] ボタンをクリックし、[コントロール パネル] をクリックします。

  2. [コントロール パネル][プログラムと機能] をクリックして、[Windows の機能の有効化または無効化] をクリックします。

  3. [Internet Information Services][World Wide Web サービス][セキュリティ] の順に展開します。

  4. [要求のフィルタリング] を選択して、[OK] をクリックします。

    拡大

方法

: このセクションの手順を実行するには、要求のフィルタリング用のユーザー インターフェイスが含まれている Microsoft Administration Pack for IIS 7.0 をインストールする必要があります。Microsoft Administration Pack for IIS 7.0 をインストールするには、次の URL を参照してください。

http://learn.iis.net/page.aspx/415/

要求フィルタリング機能の設定と要求の制限を編集する方法

  1. タスク バーの [スタート] ボタンをクリックして、[管理ツール] をポイントし、[インターネット インフォメーション サービス (IIS) マネージャー] をクリックします。

  2. [接続] ウィンドウで、要求のフィルタリングの設定を変更する接続、サイト、アプリケーション、またはディレクトリに移動します。

  3. [ホーム] ウィンドウで [Request Filterin] をダブルクリックします。

    拡大

  4. [操作] ウィンドウで [Edit Feature Settings] をクリックします。

    拡大

  5. オプションを指定し、[OK] をクリックします。

    拡大

    たとえば、次のような変更を行うことができます。

    • URL の最大長を 2 KB に変更します (2048 を指定)。
    • クエリ文字列の最大長を 1 KB に変更します (1024 を指定)。
    • [Allow unlisted verbs] チェック ボックスをオフにして、一覧にない HTTP 動詞に対するアクセスを拒否します。

URL シーケンスを拒否する方法

  1. タスク バーの [スタート] ボタンをクリックして、[管理ツール] をポイントし、[インターネット インフォメーション サービス (IIS) マネージャー] をクリックします。

  2. [接続] ウィンドウで、要求のフィルタリングの設定を変更する接続、サイト、アプリケーション、またはディレクトリに移動します。

  3. [ホーム] ウィンドウで [Request Filtering] をダブルクリックします。

    拡大

  4. [Request Filtering] ウィンドウで、[Deny URL Sequences] タブをクリックし、[操作] ウィンドウの [Add URL Sequence] をクリックします。

    拡大

  5. [Add Deny Sequence] ダイアログ ボックスで、ブロックする URL シーケンスを入力し、[OK] をクリックします。

    拡大

    たとえば、サーバー上のディレクトリ トラバーサルを防ぐには、ダイアログ ボックスに 2 つのピリオド ("..") を入力します。

特定のファイル名拡張子へのアクセスを拒否する方法

  1. タスク バーの [スタート] ボタンをクリックして、[管理ツール] をポイントし、[インターネット インフォメーション サービス (IIS) マネージャー] をクリックします。

  2. [接続] ウィンドウで、要求のフィルタリングの設定を変更する接続、サイト、アプリケーション、またはディレクトリに移動します。

  3. [ホーム] ウィンドウで [Request Filtering] をダブルクリックします。

    拡大

  4. [要求のフィルタリング] ウィンドウで、[File Name Extensions] タブをクリックし、[操作] ウィンドウで [Deny File Name Extension] をクリックします。

    拡大

  5. [Deny File Name Extension] ダイアログ ボックスで、ブロックするファイル名拡張子を入力し、[OK] をクリックします。

    拡大

    たとえば、.inc というファイル名拡張子を持つファイルへのアクセスを防ぐには、ダイアログ ボックスに「inc」と入力します。

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

  1. タスク バーの [スタート] ボタンをクリックして、[管理ツール] をポイントし、[インターネット インフォメーション サービス (IIS) マネージャー] をクリックします。

  2. [接続] ウィンドウで、要求のフィルタリングの設定を変更する接続、サイト、アプリケーション、またはディレクトリに移動します。

  3. [ホーム] ウィンドウで [Request Filtering] をダブルクリックします。

    拡大

  4. [要求のフィルタリング] ウィンドウで、[Hidden Segments] タブをクリックし、[操作] ウィンドウで [Add Hidden Segment] をクリックします。

    拡大

  5. [Add Hidden Segment] ダイアログ ボックスで、非表示にする相対パスを入力し、[OK] をクリックします。

    拡大

HTTP ヘッダーの制限を追加する方法

  1. タスク バーの [スタート] ボタンをクリックして、[管理ツール] をポイントし、[インターネット インフォメーション サービス (IIS) マネージャー] をクリックします。

  2. [接続] ウィンドウで、要求のフィルタリングの設定を変更する接続、サイト、アプリケーション、またはディレクトリに移動します。

  3. [ホーム] ウィンドウで [Request Filtering] をダブルクリックします。

    拡大

  4. [要求のフィルタリング] ウィンドウで、[Headers] タブをクリックし、[操作] ウィンドウで [Add Header] をクリックします。

    拡大

  5. [Add Header] ダイアログ ボックスで、HTTP ヘッダーと、そのヘッダーの制限となる最大サイズを入力し、[OK] をクリックします。

    拡大

    たとえば、"Content-type" ヘッダーには、要求の MIME の種類が含まれます。100 を指定すると、"Content-type" ヘッダーの長さが 100 バイトに制限されます。

HTTP 動詞を拒否する方法

  1. タスク バーの [スタート] ボタンをクリックして、[管理ツール] をポイントし、[インターネット インフォメーション サービス (IIS) マネージャー] をクリックします。

  2. [接続] ウィンドウで、要求のフィルタリングの設定を変更する接続、サイト、アプリケーション、またはディレクトリに移動します。

  3. [ホーム] ウィンドウで [Request Filtering] をダブルクリックします。

    拡大

  4. [Request Filtering] ウィンドウで、[HTTP verbs] タブをクリックし、[操作] ウィンドウで [Deny Verb] をクリックします。

    拡大

  5. [Deny Verb] ダイアログ ボックスで、ブロックする HTTP 動詞を入力し、[OK] をクリックします。

    拡大

    たとえば、サーバーに対する HTTP TRACE 要求を防ぐには、ダイアログ ボックスに「TRACE」と入力します。

構成

属性

属性 説明
allowDoubleEscaping オプションの Boolean 属性。

ダブル エスケープ文字を含む URL を許可するかどうかを指定します。

既定値は false です。
allowHighBitCharacters オプションの Boolean 属性。

URL に ASCII 以外の文字を許可するかどうかを指定します。

既定値は true です。

子要素

要素 説明
denyUrlSequences オプションの要素。

拒否するシーケンスを指定し、Web サーバーに対する URL ベースの攻撃を防ぎます。
fileExtensions オプションの要素。

許可または拒否するファイル名拡張子を指定し、Web サーバーに送信される要求の種類を制限します。
hiddenSegments オプションの要素。

URL の特定のセグメントをクライアントからアクセスできないように指定します。
requestLimits オプションの要素。

Web サーバーが処理する要求に対する制限を指定します。
verbs オプションの要素。

許可または拒否する HTTP 動詞を指定し、Web サーバーに送信される要求の種類を制限します。

構成サンプル

Web.config ファイルから抜粋した次の構成サンプルでは、複数のセキュリティ関連のタスクを実行します。

  • 2 つの URL シーケンスへのアクセスを拒否します。1 つ目のシーケンスはディレクトリ トラバーサルを防ぎ、2 つ目のシーケンスは代替データ ストリームへのアクセスを防ぎます。
  • 一覧にないファイル名拡張子、および一覧にない HTTP 動詞へのアクセスを拒否します。
  • URL の最大長を 2 KB に、クエリ文字列の最大長を 1 KB に設定します。
<configuration>
   <system.webServer>

      <security>
         <requestFiltering>
            <denyUrlSequences>
               <add sequence=".." />
               <add sequence=":" />
            </denyUrlSequences>

            <fileExtensions allowUnlisted="false" />
            <requestLimits maxUrl="2048" maxQueryString="1024" />
            <verbs allowUnlisted="false" />
         </requestFiltering>
      </security>
   </system.webServer>

</configuration>

サンプル コード

次のコード サンプルでは、Default Web Site で 3 つの URL シーケンス (ディレクトリ トラバーサル ("..")、代替データ ストリーム (":")、円記号 ("\")) へのアクセスが拒否されます。

AppCmd.exe

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"denyUrlSequences.[sequence='..']" 

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"denyUrlSequences.[sequence=':']" 

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"denyUrlSequences.[sequence='\']" 

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetWebConfiguration("Default Web Site");

         ConfigurationSection requestFilteringSection = config.GetSection("system.webServer/security/requestFiltering");

         ConfigurationElementCollection denyUrlSequencesCollection = requestFilteringSection.GetCollection("denyUrlSequences");

         ConfigurationElement addElement = denyUrlSequencesCollection.CreateElement("add");
         addElement["sequence"] = @"..";
         denyUrlSequencesCollection.Add(addElement);

         ConfigurationElement addElement1 = denyUrlSequencesCollection.CreateElement("add");
         addElement1["sequence"] = @":";
         denyUrlSequencesCollection.Add(addElement1);

         ConfigurationElement addElement2 = denyUrlSequencesCollection.CreateElement("add");
         addElement2["sequence"] = @"\";
         denyUrlSequencesCollection.Add(addElement2);

         serverManager.CommitChanges();
      }
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample

Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetWebConfiguration("Default Web Site")
      Dim requestFilteringSection As ConfigurationSection = config.GetSection("system.webServer/security/requestFiltering")
      Dim denyUrlSequencesCollection As ConfigurationElementCollection = requestFilteringSection.GetCollection("denyUrlSequences")

      Dim addElement As ConfigurationElement = denyUrlSequencesCollection.CreateElement("add")
      addElement("sequence") = ".."
      denyUrlSequencesCollection.Add(addElement)

      Dim addElement1 As ConfigurationElement = denyUrlSequencesCollection.CreateElement("add")
      addElement1("sequence") = ":"
      denyUrlSequencesCollection.Add(addElement1)

      Dim addElement2 As ConfigurationElement = denyUrlSequencesCollection.CreateElement("add")
      addElement2("sequence") = "\"
      denyUrlSequencesCollection.Add(addElement2)

      serverManager.CommitChanges()
   End Sub

End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site";
var requestFilteringSection = adminManager.GetAdminSection("system.webServer/security/requestFiltering", "MACHINE/WEBROOT/APPHOST/Default Web Site");
var denyUrlSequencesCollection = requestFilteringSection.ChildElements.Item("denyUrlSequences").Collection;

var addElement = denyUrlSequencesCollection.CreateNewElement("add");
addElement.Properties.Item("sequence").Value = "..";
denyUrlSequencesCollection.AddElement(addElement);

var addElement1 = denyUrlSequencesCollection.CreateNewElement("add");
addElement1.Properties.Item("sequence").Value = ":";
denyUrlSequencesCollection.AddElement(addElement1);

var addElement2 = denyUrlSequencesCollection.CreateNewElement("add");
addElement2.Properties.Item("sequence").Value = "\\";
denyUrlSequencesCollection.AddElement(addElement2);

adminManager.CommitChanges();

VBScript

Set adminManager = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site"
Set requestFilteringSection = adminManager.GetAdminSection("system.webServer/security/requestFiltering", "MACHINE/WEBROOT/APPHOST/Default Web Site")
Set denyUrlSequencesCollection = requestFilteringSection.ChildElements.Item("denyUrlSequences").Collection

Set addElement = denyUrlSequencesCollection.CreateNewElement("add")
addElement.Properties.Item("sequence").Value = ".."
denyUrlSequencesCollection.AddElement(addElement)

Set addElement1 = denyUrlSequencesCollection.CreateNewElement("add")
addElement1.Properties.Item("sequence").Value = ":"
denyUrlSequencesCollection.AddElement(addElement1)

Set addElement2 = denyUrlSequencesCollection.CreateNewElement("add")
addElement2.Properties.Item("sequence").Value = "\"
denyUrlSequencesCollection.AddElement(addElement2)

adminManager.CommitChanges()