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