方法 : メッセージ リプレイ検出を有効にする
リプレイ攻撃は、攻撃者がメッセージのストリームを 2 つのパーティ間でコピーし、そのストリームを他の 1 つ以上のパーティにリプレイすることで発生します。攻撃が止むまで、攻撃対象になったコンピューターはストリームを正当なメッセージとして処理しようとし、その結果、命令が重複するなど、望ましくない状況に陥ります。
メッセージ リプレイ検出詳細情報、「メッセージ リプレイ検出」を参照してください。
以下の手順では、Windows Communication Foundation (WCF) でリプレイ検出を制御するために使用できるさまざまなプロパティを示します。
コードを使用してクライアントでのリプレイ検出を制御するには
CustomBinding で使用する SecurityBindingElement を作成します。詳細については、次のトピックを参照してください。 方法 : SecurityBindingElement を使用してカスタム バインディングを作成する.次の例では、SecurityBindingElement クラスの CreateKerberosBindingElement を使用して作成された SymmetricSecurityBindingElement を使用します。
LocalClientSettings プロパティを使用して LocalClientSecuritySettings クラスへの参照を返し、次のプロパティを適切な値に設定します。
DetectReplay.ブール値。サーバーからのリプレイをクライアントが検出するかどうかを制御します。既定値は true です。
MaxClockSkew.TimeSpan 値。リプレイ機構に許容されるクライアントとサーバー間の時刻のずれを制御します。セキュリティ機構は送信されたメッセージのタイム スタンプを調べ、メッセージが古すぎるかどうかを決定します。既定値は 5 分です。
ReplayWindow.TimeSpan 値。メッセージがサーバーによって送信されてから (中継局を通過して) クライアントに到達するまで、ネットワーク内に存在できる期間を制御します。クライアントは、リプレイ検出のため、最新の ReplayWindow 内で送信されたメッセージの署名を追跡します。
ReplayCacheSize.整数値。クライアントは、メッセージの署名をキャッシュに格納します。この設定は、キャッシュに格納できる署名の数を指定します。最新のリプレイ ウィンドウ内の送信されたメッセージの数がキャッシュ制限に達すると、キャッシュされた最も古い署名が制限時間に達するまで、新しいメッセージは拒否されます。既定値は 500000 です。
コードを使用してサービスでのリプレイ検出を制御するには
CustomBinding で使用する SecurityBindingElement を作成します。
LocalServiceSettings プロパティを使用して LocalServiceSecuritySettings クラスへの参照を返し、前述のように各プロパティを設定します。
クライアントまたはサービスの構成でリプレイ検出を制御するには
customBinding Elementを作成します。
<security> 要素を作成します。
localClientSettings elementまたは localServiceSettings elementを作成します。
detectReplays、maxClockSkew、replayWindow、および replayCacheSize の各属性値を適切に設定します。<localServiceSettings><localClientSettings> 要素と 要素の両方の属性を設定する例を次に示します。
<customBinding> <binding name="NewBinding0"> <textMessageEncoding /> <security> <localClientSettings replayCacheSize="800000" maxClockSkew="00:03:00" replayWindow="00:03:00" /> <localServiceSettings replayCacheSize="800000" maxClockSkew="00:03:00" replayWindow="00:03:00" /> <secureConversationBootstrap /> </security> <httpTransport /> </binding> </customBinding>
例
次の例は、CreateKerberosBindingElement メソッドを使用して SymmetricSecurityBindingElement を作成し、作成されたバインディングのリプレイ プロパティを設定します。
Private Function CreateSymetricBindingForClient() As SecurityBindingElement
Dim b = SecurityBindingElement.CreateKerberosBindingElement()
With b.LocalClientSettings
.DetectReplays = True
.MaxClockSkew = New TimeSpan(0, 3, 0)
.ReplayWindow = New TimeSpan(0, 2, 0)
.ReplayCacheSize = 10000
End With
Return b
End Function
private SecurityBindingElement CreateSymetricBindingForClient()
{
SymmetricSecurityBindingElement b = SecurityBindingElement.CreateKerberosBindingElement();
b.LocalClientSettings.DetectReplays = true;
b.LocalClientSettings.MaxClockSkew = new TimeSpan(0, 3, 0);
b.LocalClientSettings.ReplayWindow = new TimeSpan(0, 2, 0);
b.LocalClientSettings.ReplayCacheSize = 10000;
return b;
}
リプレイのスコープ : メッセージ セキュリティのみ
次の手順は、メッセージ セキュリティ モードにのみ適用されます。トランスポート モードとメッセージ資格情報付きトランスポート モードでは、トランスポート機構がリプレイを検出します。
セキュリティで保護されたメッセージ交換に関するメモ
セキュリティで保護されたメッセージ交換を有効にするバインディングでは、アプリケーション チャネルとセキュリティで保護されたメッセージ交換のブートストラップ バインディングの両方で、上記の設定を調整できます。たとえば、アプリケーション チャネルに対するリプレイを無効にして、セキュリティで保護されたメッセージ交換を確立するブートストラップ チャネルに対するリプレイを有効にできます。
セキュリティで保護されたメッセージ交換セッションを使用しない場合、サーバー ファームのシナリオでのリプレイや、プロセスをリサイクルしたときのリプレイについては、リプレイ検出による検出が保証されません。これは、次のシステム指定のバインディングに当てはまります。
EstablishSecurityContext プロパティが false に設定された WSHttpBinding。
コードのコンパイル方法
コードのコンパイルには次の名前空間が必要です。
参照
リファレンス
LocalClientSecuritySettings
LocalServiceSecuritySettings
概念
セキュリティ保護されたメッセージ交換とセッション
方法 : SecurityBindingElement を使用してカスタム バインディングを作成する