Procédure : activer la détection de réexécution des messages
Une attaque par relecture se produit lorsqu'un intrus copie un flux de messages entre deux correspondants et relit le flux à l'un ou plusieurs des correspondants. Sauf atténuation, les ordinateurs sujets à l'attaque traiteront le flux comme messages légitimes, ce qui a des conséquences néfastes telles que des ordres redondants d'un élément.
Pour plus d’informations sur la détection de réexécution des messages, consultez Détection de réexécution des messages.
La procédure suivante illustre différentes propriétés que vous pouvez utiliser pour contrôler la détection de réexécution à l’aide de Windows Communication Foundation (WCF).
Pour contrôler la détection de relecture sur le client à l'aide du code
Créez un SecurityBindingElement à utiliser dans un CustomBinding. Pour plus d’informations, consultez Guide pratique pour créer une liaison personnalisée à l’aide de SecurityBindingElement. L'exemple suivant utilise un SymmetricSecurityBindingElement créé avec le CreateKerberosBindingElement de la classe SecurityBindingElement.
Utilisez la propriété LocalClientSettings pour retourner une référence à la classe LocalClientSecuritySettings et définir les propriétés suivantes, selon le cas :
DetectReplay
. Valeur booléenne. Elle détermine si le client doit détecter les relectures à partir du serveur. Par défaut, il s’agit detrue
.MaxClockSkew
. Valeur TimeSpan. Détermine l'inclinaison d'horloge que peut tolérer le mécanisme de relecture entre le client et le serveur. Le mécanisme de sécurité examine l'horodatage envoyé et détermine s'il a été envoyé il y a trop longtemps. La valeur par défaut est 5 minutes.ReplayWindow
. ValeurTimeSpan
. Détermine pendant combien de temps un message peut vivre sur le réseau après que le serveur l'a envoyé (par le biais d'intermédiaires) avant d'atteindre le client. Le client effectue le suivi des signatures des messages envoyés dans leReplayWindow
le plus récent pour les besoins de la détection de relecture.ReplayCacheSize
. Valeur entière. Le client stocke les signatures du message dans un cache. Ce paramètre spécifie combien de signatures le cache peut stocker. Si le nombre de messages envoyés dans la dernière fenêtre de relecture atteint la limite de cache, les nouveaux messages sont rejetés jusqu'à ce que les signatures mises en cache les plus anciennes atteignent la limite de temps. La valeur par défaut est 500000.
Pour contrôler la détection de relecture sur le service à l'aide du code
Créez un SecurityBindingElement à utiliser dans un CustomBinding.
Utilisez la propriété LocalServiceSettings pour retourner une référence à la classe LocalServiceSecuritySettings et définissez les propriétés comme décrit précédemment.
Pour contrôler la détection de relecture dans la configuration pour le client ou le service
Créez un <customBinding>.
Créez un élément
<security>
.Créez un <localClientSettings> ou un <localServiceSettings>.
Définissez les valeurs d'attributs suivantes, le cas échéant :
detectReplays
,maxClockSkew
,replayWindow
etreplayCacheSize
. L'exemple suivant définit les attributs d'un élément<localServiceSettings>
et d'un élément<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>
Exemple
L’exemple suivant crée un SymmetricSecurityBindingElement à l’aide de la méthode CreateKerberosBindingElement et définit les propriétés de relecture de la liaison.
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
Étendue de relecture : sécurité de message uniquement
Notez que les procédures suivantes s'appliquent uniquement au mode de sécurité Message. Pour les modes Transport et Transport avec informations d'identification de message, les mécanismes de transport détectent les relectures.
Remarques relatives aux conversations sécurisées
Pour les liaisons qui activent les conversations sécurisées, vous pouvez ajuster ces paramètres à la fois pour le canal d’application et pour la liaison du démarrage de conversation sécurisée. Par exemple, vous pouvez désactiver les relectures pour le canal d'application mais les activer pour le canal de démarrage qui établit la conversation sécurisée.
Si vous n'utilisez pas de sessions de conversation sécurisée, la détection des relectures n'est pas garantie dans les scénarios de batterie de serveurs et lorsque le processus est recyclé. Cela s’applique aux liaisons fournies par le système suivantes :
Objet WSHttpBinding avec la propriété EstablishSecurityContext définie à la valeur
false
.
Compilation du code
Les espaces de noms suivants sont requis pour compiler le code :