Vorgehensweise: Aktivieren der Nachrichtenreplay-Erkennung
Ein Replay-Angriff tritt auf, wenn ein Angreifer einen Nachrichtenstrom zwischen zwei Parteien kopiert und den Strom für eine oder mehrere Parteien wiedergibt. Wenn der Angriff nicht abgeschwächt wird, verarbeiten die angegriffenen Computer den Strom als zulässige Meldungen, was zu einer Reihe negativer Konsequenzen führt, wie z. B. redundanten Bestellungen eines Artikels.
Weitere Informationen zur Replay-Erkennung für Nachrichten finden Sie unter Replay-Erkennung für Nachrichten.
Die folgende Prozedur veranschaulicht verschiedene Eigenschaften, die Sie verwenden können, um die Replay-Erkennung mit Windows Communication Foundation (WCF) zu steuern.
So steuern Sie die Replay-Erkennung für den Client mithilfe von Code
Erstellen Sie ein SecurityBindingElement zur Verwendung in einer CustomBinding. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen einer benutzerdefinierten Bindung mit dem SecurityBindingElement. Im folgenden Beispiel wird eine SymmetricSecurityBindingElement verwendet, die mithilfe der CreateKerberosBindingElement der SecurityBindingElement-Klasse erstellt worden ist.
Verwenden Sie die LocalClientSettings-Eigenschaft, um einen Verweis auf die LocalClientSecuritySettings-Klasse zurückzugeben und die folgenden Eigenschaften nach Bedarf festzulegen:
DetectReplay
. Ein boolescher Wert. Dieser bestimmt, ob der Client Replays vom Server erkennen sollte. Der Standardwert lautettrue
.MaxClockSkew
. Ein TimeSpan-Wert. Bestimmt die Zeitverschiebung, die der Replay-Mechanismus zwischen dem Client und dem Server tolerieren kann. Das Sicherheitsverfahren untersucht den gesendeten Zeitstempel und bestimmt, ob er zu weit in der Vergangenheit zurückliegend gesendet wurde. Die Standardeinstellung ist 5 Minuten.ReplayWindow
. EinTimeSpan
-Wert. Dieser bestimmt, wie lange eine Nachricht im Netzwerk bleiben kann, nachdem sie vom Server (durch Vermittler) gesendet worden ist, bevor sie den Client erreicht. Der Client verfolgt die Signaturen der Nachrichten, die innerhalb des letztenReplayWindow
gesendet wurden, zur Replay-Erkennung.ReplayCacheSize
. Ein Ganzzahlwert. Der Client speichert die Signaturen der Nachricht in einem Cache. Diese Einstellung gibt an, wie viele Signaturen der Cache speichern kann. Wenn die Zahl der Nachrichten, die innerhalb des letzten Replay-Fensters gesendet wurden, das Cachelimit erreicht, werden neue Nachrichten zurückgewiesen, bis die ältesten zwischengespeicherten Signaturen das Zeitlimit überschreiten. Der Standardwert ist 500000.
So steuern Sie die Replay-Erkennung für den Dienst mithilfe von Code
Erstellen Sie ein SecurityBindingElement zur Verwendung in einer CustomBinding.
Verwenden Sie die LocalServiceSettings-Eigenschaft, um einen Verweis auf die LocalServiceSecuritySettings-Klasse zurückzugeben, und legen Sie die Eigenschaften fest, wie zuvor beschrieben.
So steuern Sie die Replay-Erkennung in der Konfiguration für den Client oder den Dienst
Erstellen Sie ein <customBinding>-Element.
Erstellen Sie ein
<security>
-Element.Erstellen Sie entweder localClientSettings<> oder <localServiceSettings>.
Legen Sie die folgenden Attributwerte nach Bedarf fest:
detectReplays
,maxClockSkew
,replayWindow
undreplayCacheSize
. Im folgenden Beispiel werden sowohl die Attribute eines<localServiceSettings>
-Elements festgelegt:<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>
Beispiel
Im folgenden Beispiel wird ein SymmetricSecurityBindingElement mithilfe der CreateKerberosBindingElement-Methode erstellt, und die Replay-Eigenschaften der Bindung werden festgelegt.
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
Replay-Bereich: Nur Nachrichtensicherheit
Beachten Sie, dass die folgenden Prozeduren nur für den Nachrichtensicherheitsmodus gelten. Für den Transportmodus und den Transportmodus mit Nachrichtenanmeldeinformationen erkennen die Transportmechanismen Replays.
Hinweise für die sichere Konversation
Bei Bindungen, die sichere Konversationen ermöglichen, können Sie diese Einstellungen sowohl für den Anwendungskanal als auch für die sichere Konversationsbootstrap-Bindung anpassen. Sie können z. B. Replays für den Anwendungskanal deaktivieren, sie jedoch für den Bootstrapkanal aktivieren, der die sichere Konversation aufbaut.
Wenn Sie keine Sitzungen für sichere Konversation verwenden, kann die Replay-Erkennung nicht garantieren, dass Replays in Serverfarmszenarien und bei der Wiederverwendung des Prozesses erkannt werden. Dies gilt für die folgenden vom System bereitgestellten Bindungen:
WSHttpBinding mit der EstablishSecurityContext-Eigenschaft mit dem Wert
false
.
Kompilieren des Codes
Die folgenden Namespaces sind zum Kompilieren des Codes erforderlich: