はじめに
IIS 7.0 以降の動的 IP 制限 (DIPR) モジュールは、Web サーバーと Web サイトに対するサービス拒否攻撃やブルート フォース攻撃に対する保護を提供します。 この保護を提供するために、モジュールは、通常とは異なる数の同時要求を行う HTTP クライアントの IP アドレス、または少数の期間に多数の要求を行う HTTP クライアントの IP アドレスを一時的にブロックします。
動的 IP 制限を使用する場合
IP アドレスからの同時要求の数、または一定期間内の要求の数に基づいて、ウェブサイトへのアクセスを許可または拒否する必要がある場合(すべてを許可し、条件が満たされた場合にログを記録する場合)。
特徴
動的 IP 制限モジュールには、次の主な機能が含まれています。
- 同時要求の数に基づく IP アドレスのブロック - HTTP クライアントが許可されている同時要求の数を超えた場合、そのクライアントの IP アドレスは一時的にブロックされます。
- 一定期間の要求数に基づく IP アドレスのブロック - HTTP クライアントが指定された期間に行われた要求の数を超えた場合、そのクライアントの IP アドレスは一時的にブロックされます。
- ブロックされない IP アドレスの許可リスト - 他の構成に関係なく、モジュールによってブロックされないように除外するクライアントの IP アドレスの一覧を追加できます。
- さまざまな拒否アクション - IP アドレスをブロックする HTTP クライアントに返す応答を指定できます。 モジュールは、状態コード 403 と 404 を返すか、HTTP 接続を終了するだけで応答を返しません。
- プロキシの背後にある Web サーバーのサポート - Web サーバーがプロキシの背後にある場合は、X-Forwarded-For ヘッダーのクライアント IP アドレスを使用するようにモジュールを構成できます。
- IPv6 - モジュールは IPv6 アドレスを完全にサポートします。
DIPR モジュールのインストール
動的 IP 制限をインストールするには、次の方法を試してください。
[役割サービスの選択] 画面で、Web Server (IIS) > Web Server > Security に移動します。 [IP とドメインの制限] チェック ボックスをオンにし、[次へ] をクリックして続行します。
前提条件
次のいずれかのオペレーティング システムが必要です。
- Windows Server 2008
- Windows Vista SP1
- Windows Server 2008 R2
- Windows 7
DIPR モジュールのベータ 版をアンインストールする
DIPR モジュールの最初のベータ リリースを使用している場合は、リリース候補をインストールする前にアンインストールする必要があります。そうしないと、エラーが発生してインストールが失敗します。 ベータ版をアンインストールする前に、必ず構成をバックアップしてください。
DIPR モジュールの ベータ 2 リリースを使用している場合は、最終リリースに直接アップグレードできます。 構成設定は保持されます。
動的 IP 制限へのアクセスと構成
注: IP 制限を構成するときは、サイト レベルが IIS レベルをオーバーライドするため、IIS レベルとサイト レベルの両方の構成を考慮する必要があります (これは一般的な IIS 動作であり、IP 制限機能に固有ではありません)。
動的 IP 制限は、IIS マネージャー、IIS 構成 API、またはコマンド ライン ツール appcmd を使用して構成できます。
IIS マネージャーで動的 IP 制限設定にアクセスするには、次の手順に従います。
- IIS マネージャーを開く
- サーバー全体の設定を構成する場合は、左側のツリー ビューでサーバー ノードを選択するか、サイトノードを選択してサイト固有の設定を構成します。
- 機能ビューで、[動的 IP 制限] をクリックします。
例 1: appcmd を使用した同時要求の数に基づく IP アドレスのブロック
このオプションを使用すると、サーバーは、任意のクライアントの IP アドレスが構成可能な数の同時要求のみを行うことを許可します。 指定された制限を超える追加の要求は拒否されます。
この機能をテストする簡単な方法は、appcmd コマンドを実行して同時要求の最大数を 2 に設定することです。
%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/security/dynamicIpSecurity
/denyByConcurrentRequests.enabled:"True"
/denyByConcurrentRequests.maxConcurrentRequests:"2"
/commit:apphost
重要
実際の Web アプリケーションに対して同時要求の数を構成する場合は、有効な HTTP クライアントがブロックされないように、選択した制限を十分にテストします。 これは、AJAX が有効な Web ページを持ち、メディア コンテンツを提供するリッチ インターネット アプリケーションにとって特に重要です。
例 2: appcmd を使用した一定期間の要求数に基づく IP アドレスのブロック
このオプションを使用すると、サーバーは、一定期間に構成可能な数を超える要求を行う HTTP クライアントの IP アドレスからの要求を拒否します。 一定期間内の要求の数が構成された制限を下回るまで、IP アドレスはブロックされたままになります。
この機能をテストするには、appcmd コマンドを実行して、"要求の最大数" を 5 に、"期間" を 5000 に設定します。
%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/security/dynamicIpSecurity /denyByRequestRate.enabled:"True" /denyByRequestRate.maxRequests:"5" /denyByRequestRate.requestIntervalInMilliseconds:"5000" /commit:apphost
Web ブラウザーを開き、 http://localhost/welcome.png を要求し、F5 キーを押してページを継続的に更新します。 これにより、5 秒間に 5 件を超える要求が生成されるため、サーバーは 403 - 禁止状態コードで応答します。
前のすべての要求が実行されたときにさらに 5 秒間待ってから要求を行うと、要求は成功します。
重要
実際の Web アプリケーションに対して時間の経過と同時に許可される要求の数を構成する場合は、選択した制限を十分にテストして、有効な HTTP クライアントがブロックされないようにします。 これは、AJAX が有効な Web ページを持ち、メディア コンテンツを提供するリッチ インターネット アプリケーションにとって特に重要です。
例 3: UI を使用した同時要求の数に基づく IP アドレスのブロック
IIS レベルでは、次の構成があります。
[機能設定の編集] から:
[動的制限設定の編集]..." から:
私のサイトレベルでは、私は以下の構成を持っています:
つまり、ブラウザー開発者ツールで確認できるように、サイトに対して最大 2 つの同時要求が許可され (上記の数値 2 が設定されているため)、その他の同時要求に対して 403 の状態コードが受信されます (上記で構成された "禁止" アクションが原因です)。これを明確にし、ブラウザー側のキャッシュを回避するために [キャッシュを無効にする] をクリックしました)。
注: 2 つだけでなく、3 つの許可された要求が表示される理由を疑問に思うかもしれません。これは、最初の 2 つの要求が同時に開き、完了すると、3 番目の要求がアプリケーションに到達したためです。つまり、3 番目の要求が発生したときに 1 つだけ (したがって、同時要求は 1 つだけ) でした。
上記で構成した "許可" アクションは、すべての IP アドレスが要求を送信でき、これらの許可された IP がアクセスを拒否する条件に対して構成された規則によって指定されることを意味します。
お気付きのように、サイト レベル構成の「許可」が IIS のレベル「拒否」をオーバーライドし、サイトのレベル構成の「禁止」によって IIS のレベル構成「見つかりません」がオーバーライドされたため、403 状態コードが 404 の代わりに送信されました。
ただし、サイトのレベル "許可" を "拒否" に変更すると、2 つの同時要求を行ったかどうかに関係なく、すべての IP がアクセスを拒否されます。
例 4: UI を使用した同時要求数と時間経過に伴う要求数に基づく IP アドレスのブロック
次に、サイト レベルで構成を例 3 から少し変更してみましょう。 IIS レベルは、例 3 の前と同じです。
サイト レベルの構成は次のようになります。
ブラウザーから要求を行うとき:
色付きの各行 (強調表示されている例) は、1 つの要求の有効期間を表します。 このルールでは、ご覧のように 2 つの条件が指定されています。 つまり、最初に満たされた条件が満たされると、拒否が適用されます。 このルールでは、200 ミリ秒以内に最大 2 つの要求のみが許可され、この期間内のそれ以降の要求は拒否されます。 ご覧のように、3 番目の要求は最初の要求の後にほぼ 20 ミリ秒後にトリガーされました。つまり、200 ミリ秒フレーム内に 2 つ以上の要求があるため、3 番目の要求は拒否され、4 番目と 5 番目と 6 番目になります。
ロギング(記録)
IIS ログに次の情報が表示されます (上の例 2)。
2024-07-22 14:17:48 ::1 GET / - 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 - 200 0 0 1
2024-07-22 14:17:48 ::1 GET /Content/css v=7n95mJcoE9tVcdjbEUwG1-urp8oL9Yf2bFpa2lb4Nq41 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 http://localhost:8090/ 200 0 0 3
2024-07-22 14:17:48 ::1 GET /bundles/modernizr v=inCVuEFe6J4Q07A0AcRsbJic_UE5MwpRMNGcOtk94TE1 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 http://localhost:8090/ 403 502 0 5
2024-07-22 14:17:48 ::1 GET /bundles/jquery v=JVBM4Dk7eZ-fjWvmxvoCeVR5MAt_3YXn4K7MRdHsuR81 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 http://localhost:8090/ 403 502 0 7
2024-07-22 14:17:48 ::1 GET /bundles/bootstrap v=X8gnNIYDSsAzCxLBuTaZy64JJqo9mzWM5GPsE4TJLNI1 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 http://localhost:8090/ 403 502 0 7
2024-07-22 14:17:48 ::1 GET /favicon.ico - 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 http://localhost:8090/ 403 502 0 0
2024-07-22 14:17:48 ::1 GET /Content/bootstrap.min.css.map - 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 - 403 502 0 0
この例で拒否された要求の Http 状態コードは 403 になり、サブ状態コードは 502 になります。 この方法では、アプリケーション コードによって設定された通常の禁止状態コードと、IIS IP 制限機能によって設定された Forbidden の違いを確認できます。 IP 制限機能によって設定される (状態コード) の一覧については、以下で説明します。
拒否アクション
このモジュールは、IP アドレスの要求を拒否するときに次のアクションを実行するように構成できます。
• 禁止: 403 • 未承認: 401 • 見つかりません: 404 • 中止: TCP 接続はリセットされ、http は確立されません。 これは、メイン ページが拒否され、エンド ユーザーにサブステータス コード 502 を表示させたくない場合にも便利です (IP 制限機能が原因であるとはわかりません)。 ユーザーは代わりに次のように表示されます。
IP 制限機能によって可能な (サブステータス コード) は次のとおりです。501、502。
Substatus コードは、満たされた 2 つの条件のいずれかに応じて 501 または 502 になります。そのため、クライアントはアクセスを拒否されました: 501 -> 動的 IP 制限: 同じクライアント IP から同時要求が多すぎます。
502 -> 動的 IP 制限: 指定された制限時間内に同じクライアント IP からの要求の最大数に達しました。
上記のコード類についての情報は、HTTP 状態コードの概要 - インターネット インフォメーション サービス | Microsoft Learn に記載されています。
ログのみのモードを有効にする:
"ログのみのモードを有効にする" の場合、この機能によってクライアントが拒否されることはありません。つまり、状態コードは予想される結果になります (通常は 200 ですが、アプリケーションによっても異なります)、クライアントは予期される通常の応答を受け取りますが、2 つの条件のいずれかが満たされたことを示す副ステータス コードは IIS ログに記録されます。 次に例を示します。
2024-07-28 06:57:35 ::1 GET / - 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 - 200 0 0 3 2024-07-28 06:57:35 ::1 GET /bundles/modernizr v=inCVuEFe6J4Q07A0AcRsbJic_UE5MwpRMNGcOtk94TE1 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 http://localhost:8090/ 200 501 0 3
2024-07-28 06:57:35 ::1 GET /bundles/bootstrap v=X8gnNIYDSsAzCxLBuTaZy64JJqo9mzWM5GPsE4TJLNI1 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 http://localhost:8090/ 200 502 0 8
2024-07-28 06:57:35 ::1 GET /Content/css v=7n95mJcoE9tVcdjbEUwG1-urp8oL9Yf2bFpa2lb4Nq41 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 http://localhost:8090/ 200 0 0 9
2024-07-28 06:57:35 ::1 GET /bundles/jquery v=JVBM4Dk7eZ-fjWvmxvoCeVR5MAt_3YXn4K7MRdHsuR81 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 http://localhost:8090/ 200 50 1 0 8 2024-07-28 06:57:35 ::1 GET /Content/bootstrap.min.css.map - 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 - 200 502 0 19
2024-07-28 06:57:35 ::1 GET /Content/bootstrap.min.css.map - 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 - 200 502 0 37
2024-07-28 06:57:35 ::1 GET /bundles/bootstrap.min.js.map - 8090 - ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/126.0.0.0+Safari/537.36+Edg/126.0.0.0 - 404 502 2 0
クライアント側でこれを取得します。
プロキシの背後にある Web サーバーのサポート
Web サーバーがファイアウォールまたはプロキシ コンピューターの内側にある場合、すべての要求のクライアント IP がプロキシまたはファイアウォール サーバーの IP として表示されることがあります。 これにより、動的 IP 制限モジュールの機能が役に立ちません。 ただし、そのようなサーバーのほとんどは、元のクライアントの IP アドレスを含む XForwarded-For ヘッダーを HTTP 要求に追加します。 [動的 IP 制限] 構成ページで [プロキシ] モードのチェック ボックスをオンにすると、最初にこのヘッダーのクライアント IP アドレスがチェックされます。