要求フィルタリングを使用する
IIS チームが作成
はじめに
セキュリティ ツールである UrlScan は、以前のバージョンのインターネット インフォメーション サービス (IIS) のアドオンとして提供されていたため、管理者は Web サーバーにより厳密なセキュリティポリシーを適用することができました。 IIS 7 以降では、URLScan のすべてのコア機能が要求のフィルタリングと呼ばれるモジュールに組み込まれ、非表示セグメント機能が追加されました。 この記事では、要求のフィルタリングの各機能について説明し、お使いの環境で機能を適用する方法の例を示します。
IIS には、URL リライト用のモジュールも含まれていることに注意してください。 これらの 2 つのモジュールには次のような違いがあります。要求のフィルタリングはセキュリティ シナリオ向けに設計および最適化されていますが、URL リライトはさまざまなシナリオに適用できます (セキュリティ シナリオはこれらのサブセットにすぎません)。 この違いの詳細については、「IIS 7.0 以降の要求のフィルタリングと URL リライト」を参照してください。
二重にエンコードされた要求をフィルター処理する
この機能は、二重にエンコードされた要求に依存する攻撃を防ぎ、攻撃者が慎重に細工された二重にエンコードされた要求を IIS に送信した場合に適用されます。 二重にエンコードされた要求のフィルター処理が有効になっている場合、IIS によって URL が 2 回正規化されます。最初の正規化が 2 回目の正規化と異なる場合、要求は拒否され、ログに記録されるエラー コードは 404.11 になります。 UrlScan では、二重にエンコードされた要求のフィルター処理は VerifyNormalization オプションでした。
IIS で二重にエンコードされた要求の処理を許可しない場合は、次のコマンドを使用します。
<configuration>
<system.webServer>
<security>
<requestFiltering
allowDoubleEscaping="false">
</requestFiltering>
</security>
</system.webServer>
</configuration>
高位ビット文字をフィルター処理する
この機能では、ASCII 以外の文字を含むすべての IIS への要求が許可または拒否され、エラー コード 404.12 がログに記録されます。 UrlScan での同等の機能は AllowHighBitCharacters です。
たとえば、1 つのアプリケーションに対して高位ビット文字を許可し、サーバー全体には許可しないとします。 ApplicationHost.config ファイルで allowHighBitCharacters="false" を設定します。ただし、アプリケーション ルート内に、1 つのアプリケーションが ASCII 以外の文字を受け入れることを許可する Web.config ファイルを作成します。 その Web.config ファイルで以下を使用します。
<configuration>
<system.webServer>
<security>
<requestFiltering
allowHighBitCharacters="true"
>
</requestFiltering>
</security>
</system.webServer>
</configuration>
ファイル拡張子に基づいてフィルター処理する
この機能では、IIS で処理される、許可されているファイル拡張子のセットを定義します。 IIS がファイル拡張子に基づいて要求を拒否した場合、ログに記録されるエラー コードは 404.7 になります。 UrlScan での同等の機能は、AllowExtensions および 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 つの機能 (UrlScan では同じ名前を持つ) を組み合わせたものです。
- maxAllowedContentLength – コンテンツ サイズの上限
- maxUrl - URL の長さの上限
- maxQueryString – クエリ文字列の長さの上限
IIS が要求の制限に基づいて要求を拒否すると、ログに記録されるエラー コードは次のようになります。
- コンテンツが長すぎる場合は 413.1。
- URL が長すぎる場合は 404.14。
- クエリ文字列が長すぎる場合は 404.15。
たとえば、ソース コードにアクセスできないソフトウェアを企業が購入するのは非常に一般的なことです。 時間が経つとともに、そのコードに脆弱性が見つかる場合があります。 影響を受けるコードの更新プログラムを取得することは、多くの場合、簡単ではありません。 この問題は、URL またはクエリ文字列が長すぎることや、アプリケーションに送信されるコンテンツが多すぎることが原因でよく発生します。 安全な上限を決定したら、以下の構成を使用して制限を適用できます。アプリケーション バイナリにパッチを適用する必要はありません。
<configuration>
<system.webServer>
<security>
<requestFiltering>
<requestLimits
maxAllowedContentLength="30000000"
maxUrl="260"
maxQueryString="25"
/>
</requestFiltering>
</security>
</system.webServer>
</configuration>
動詞によるフィルター処理
この機能では、IIS が要求の一部として受け入れる動詞の一覧を定義します。 この機能を基にして IIS が要求を拒否するときに記録されるエラー コードは、404.6 です。 これは、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 で拒否されるシーケンスの一覧を定義します。 この機能によって IIS が要求を拒否した場合、ログに記録されるエラー コードは 404.5 です。これは UrlScan の DenyUrlSequences 機能に相当します。
これは非常に強力な機能です。 次のコードを使用すると、特定の文字シーケンスが IIS によって処理されないようにすることができます。
<configuration>
<system.webServer>
<security>
<requestFiltering>
<denyUrlSequences>
<add sequence=".."/>
</denyUrlSequences>
</requestFiltering>
</security>
</system.webServer>
</configuration>
前の例では、".." シーケンスが拒否されます。 廃業したベンダーからアプリケーションを購入し、特定の文字シーケンスが送信された場合にそのアプリケーションが脆弱であることを発見したとします。 この機能を使用すると、アプリケーションのコードに修正プログラムを適用することなく、拒否リストにその URL シーケンスを追加するだけで、そのアプリケーションを保護できます。
非表示セグメントをフィルターで除外する
この機能を使用すると、"処理可能" なセグメントを定義できます。この機能を基にして IIS が要求を拒否するときに記録されるエラー コードは、404.8 です。 この機能は IIS 7 以降の新機能であり、UrlScan には備わっていません。
サーバーに URL が 2 つあるという次の例を考えてみましょう。
http://site.com/bin
http://site.com/binary
バイナリ ディレクトリ内のコンテンツを許可し、bin ディレクトリ内のコンテンツは許可しないとします。 URL シーケンスを使用し、シーケンス "bin" を拒否する場合は、両方の URL へのアクセスを拒否します。 以下に示す構成を使用すると、bin へのアクセスを拒否できますが、バイナリ内のコンテンツは引き続き処理されます。
<configuration>
<system.webServer>
<security>
<requestFiltering>
<hiddenSegments>
<add segment="BIN"/>
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
</configuration>
IIS 7 以降のエラー コード
以前のバージョンでは、グローバル レベルで UrlScan を使用して、システムに適用するセキュリティ ポリシーを定義できました。 IIS 7 以降では、これらのポリシーを引き続きグローバル レベルで実装できますが、URL ごとに実装することもできます。 そのため、新しいリッチ委任モデルが提供するすべての利点を活用できます。
次の表に、IIS ログのエラー コードの概要を示します。
エラー | 状態コード |
---|---|
サイトが見つかりません | 404.1 |
ポリシーによって拒否されました | 404.2 |
MIME マップによって拒否されました | 404.3 |
ハンドラーがありません | 404.4 |
要求のフィルタリング: URL シーケンスが拒否されました | 404.5 |
要求のフィルタリング: 動詞が拒否されました | 404.6 |
要求のフィルタリング: ファイル拡張子が拒否されました | 404.7 |
要求のフィルタリング: 非表示セグメントによって拒否されました | 404.8 |
隠しファイル属性が設定されているため拒否されました | 404.9 |
要求のフィルタリング: URL のダブル エスケープのために拒否されました | 404.11 |
要求のフィルタリング: 高位ビット文字のため拒否されました | 404.12 |
要求のフィルタリング: URL が長すぎるため拒否されました | 404.14 |
要求のフィルタリング: クエリ文字列が長すぎるため拒否されました | 404.15 |
要求のフィルタリング: コンテンツが長すぎるため拒否されました | 413.1 |
要求のフィルタリング: 要求ヘッダーが長すぎるため拒否されました | 431 |