Best Practices für Sicherheit in WCFBest Practices for Security in WCF

In den folgenden Abschnitten werden die Best Practices aufgeführt, die beim Erstellen sicherer Anwendungen mit Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) zu berücksichtigen sind.The following sections list the best practices to consider when creating secure applications using Windows Communication Foundation (WCF)Windows Communication Foundation (WCF). Weitere Informationen finden Sie unterFor more information aboutSicherheit, finden Sie unter Sicherheitsüberlegungen, Sicherheitsüberlegungen zu Daten, und Sicherheitsüberlegungen für Metadaten. security, see Security Considerations, Security Considerations for Data, and Security Considerations with Metadata.

Identifizieren von Diensten mit Windows-Authentifizierung mithilfe von SPNsIdentify Services Performing Windows Authentication with SPNs

Dienste können entweder mit Benutzerprinzipalnamen (User Principal Names, UPNs) oder mit Dienstprinzipalnamen (Service Principal Names, SPNs) identifiziert werden.Services can be identified with either user principal names (UPNs) or service principal names (SPNs). Dienste, die im Rahmen eines Computerkontos ausgeführt werden (beispielsweise der Netzwerkdienst), besitzen eine SPN-Identität, die dem Computer entspricht, auf dem sie ausgeführt werden.Services running under machine accounts such as network service have an SPN identity corresponding to the machine they're running. Dienste, die im Rahmen eines Benutzerkontos ausgeführt werden, besitzen eine UPN-Identität, die dem Benutzer entspricht, als der sie ausgeführt werden. Mithilfe des setspn-Tool kann dem Benutzerkonto jedoch auch ein SPN zugewiesen werden.Services running under user accounts have a UPN identity corresponding to the user they're running as, although the setspn tool can be used to assign an SPN to the user account. Wird ein Dienst so konfiguriert, dass er mittels SPN identifiziert werden kann, und werden die Clients, von denen eine Verbindung mit dem Dienst herstellt wird, für die Verwendung dieses SPN konfiguriert, lassen sich bestimmte Angriffe erschweren.Configuring a service so it can be identified via SPN and configuring the clients connecting to the service to use that SPN can make certain attacks more difficult. Diese Anleitung gilt für Bindungen mit Kerberos- oder SSPI-Aushandlung.This guidance applies to bindings using Kerberos or SSPI negotiation. Für den Fall, dass von SSPI auf NTLM zurückgegriffen wird, sollte von den Clients auch weiterhin ein SPN angegeben werden.Clients should still specify an SPN in the case where SSPI falls back to NTLM.

Überprüfen von Dienstidentitäten in WSDLVerify Service Identities in WSDL

WS-SecurityPolicy ermöglicht es Diensten, Informationen zu ihren eigenen Identitäten in Metadaten zu veröffentlichen.WS-SecurityPolicy allows services to publish information about their own identities in metadata. Wenn diese Identitätsinformationen mittels svcutil oder mithilfe anderer Methoden wie WsdlImporter abgerufen werden, werde die Daten in die Identitätseigenschaften der Endpunktadressen des WCFWCF-Diensts umgewandelt.When retrieved via svcutil or other methods such as WsdlImporter, this identity information is translated to the identity properties of the WCFWCF service endpoint addresses. Clients, von denen nicht geprüft wird, ob diese Dienstidentitäten korrekt und gültig sind, umgehen die Dienstauthentifizierung.Clients which do not verify that these service identities are correct and valid effectively bypass service authentication. Ein böswilliger Dienst kann solche Clients ausnutzen und Anmeldeinformationen weiterleiten oder andere Man-In-The-Middle-Angriffe ausführen, indem die in der WSDL angegebene Identität geändert wird.A malicious service can exploit such clients to execute credential forwarding and other "man in the middle" attacks by changing the identity claimed in its WSDL.

Verwenden von X.509-Zertifikaten anstelle von NTLMUse X509 Certificates Instead of NTLM

WCFWCF bietet zwei Mechanismen für die Peer-to-Peer-Authentifizierung: X509-Zertifikate (die vom Peerkanal verwendet werden) und Windows-Authentifizierung, bei der eine SSPI-Aushandlung von Kerberos zu NTLM herabgestuft wird. offers two mechanisms for peer-to-peer authentication: X509 certificates (used by peer channel) and Windows authentication where an SSPI negotiation downgrades from Kerberos to NTLM. Die zertifikatbasierte Authentifizierung mit Schlüsselgrößen von 1024 Bits oder mehr wird gegenüber NTLM aus mehreren Gründen vorgezogen:Certificate-based authentication using key sizes of 1024 bits or more is preferred to NTLM for several reasons:

  • Verfügbarkeit der gegenseitigen Authentifizierungthe availability of mutual authentication,

  • Verwendung stärkerer Kryptografiealgorithmenthe use of stronger cryptographic algorithms, and

  • Erschwerte Verwendung weitergeleiteter X509-Anmeldeinformationenthe greater difficulty of utilizing forwarded X509 credentials.

Eine Übersicht über NTLM Angriffe weiterleiten, finden Sie unter http://msdn.microsoft.com/msdnmag/issues/06/09/SecureByDesign/default.aspx.For an overview of NTLM forwarding attacks, go to http://msdn.microsoft.com/msdnmag/issues/06/09/SecureByDesign/default.aspx.

Stellen Sie nach Identitätswechseln immer die ursprüngliche Identität wieder herAlways Revert After Impersonation

Wenn Sie APIs verwenden, die den Identitätswechsel eines Clients ermöglichen, stellen Sie sicher, dass die ursprüngliche Identität wiederhergestellt wird.When using APIs that enable impersonation of a client, be sure to revert to the original identity. Z. B. bei Verwendung der WindowsIdentity und WindowsImpersonationContext, verwenden Sie die C#- using Anweisung oder der Visual BasicVisual Basic Using Anweisung, wie im folgenden Code gezeigt.For example, when using the WindowsIdentity and WindowsImpersonationContext, use the C# using statement or the Visual BasicVisual BasicUsing statement, as shown in the following code. Die WindowsImpersonationContext-Klasse implementiert die IDisposable-Schnittstelle, und daher stellt die CLR (Common Language Runtime) automatisch die ursprüngliche Identität wieder her, sobald die Ausführung des using-Blocks abgeschlossen ist.The WindowsImpersonationContext class implements the IDisposable interface, and therefore the common language runtime (CLR) automatically reverts to the original identity once the code leaves the using block.

WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
using (identity.Impersonate())
{
    // Run code under the caller's identity.
}
Dim identity = ServiceSecurityContext.Current.WindowsIdentity
Using identity.Impersonate()
    ' Run code under the caller's identity.
End Using

Nehmen Sie Identitätswechsel nur bei Bedarf vorImpersonate Only as Needed

Mithilfe der Impersonate-Methode der WindowsIdentity-Klasse ist es möglich, Identitätswechsel in einem sehr eingeschränkten Bereich vorzunehmen.Using the Impersonate method of the WindowsIdentity class, it is possible to use impersonation in a very controlled scope. Dies steht im Gegensatz zum Einsatz der Impersonation-Eigenschaft der OperationBehaviorAttribute-Klasse, die Identitätswechsel im gesamten Vorgangsbereich zulässt.This is in contrast to using the Impersonation property of the OperationBehaviorAttribute, which allows impersonation for the scope of the entire operation. Wenn möglich, kontrollieren Sie mithilfe der präziseren Impersonate-Methode den Bereich des Identitätswechsels.Whenever possible, control the scope of impersonation by using the more precise Impersonate method.

Abrufen von Metadaten aus vertrauenswürdigen QuellenObtain Metadata from Trusted Sources

Stellen Sie sicher, dass die Metadatenquelle vertrauenswürdig ist und dass die Metadaten nicht manipuliert wurden.Be sure you trust the source of your metadata and make sure that no one has tampered with the metadata. Über das HTTP-Protokoll abgerufene Metadaten werden im Klartext gesendet und können manipuliert werden.Metadata retrieved using the HTTP protocol is sent in clear text and can be tampered with. Wenn der Dienst die Eigenschaften HttpsGetEnabled und HttpsGetUrl nutzt, verwenden Sie die URL, die der Dienstersteller zum Herunterladen der Daten über das HTTPS-Protokoll angegeben hat.If the service uses the HttpsGetEnabled and HttpsGetUrl properties, use the URL supplied by the service creator to download the data using the HTTPS protocol.

Veröffentlichen von Metadaten unter Verwendung von SicherheitsfeaturesPublish Metadata Using Security

Damit die veröffentlichten Metadaten eines Diensts nicht manipuliert werden können, schützen Sie den Endpunkt für den Metadatenaustausch mit Sicherheitsfeatures auf Transport- oder Nachrichtenebene.To prevent tampering with a service's published metadata, secure the metadata exchange endpoint with transport or message-level security. Weitere Informationen finden Sie unterFor more information, seeMetadatenendpunkte veröffentlichen und Vorgehensweise: Veröffentlichen von Metadaten für einen Dienstcode. Publishing Metadata Endpoints and How to: Publish Metadata for a Service Using Code.

Sicherstellen der Verwendung eines lokalen AusstellersEnsure Use of Local Issuer

Wenn für eine bestimmte Bindung eine Ausstelleradresse und eine Bindung angegeben werden, wird der lokale Aussteller nicht für Endpunkte genutzt, die diese Bindung verwenden.If an issuer address and binding are specified for a given binding, the local issuer is not used for endpoints that use that binding. Clients, die immer den lokalen Aussteller verwenden möchten, sollten sicherstellen, dass keine solche Bindung verwendet wird oder dass die Bindung so geändert wird, dass die Ausstelleradresse NULL lautet.Clients who expect to always use the local issuer should ensure that they do not use such a binding or that they modify the binding such that the issuer address is null.

Größenkontingente für SAML-TokenSAML Token Size Quotas

Wenn SAML (Security Assertions Markup Language)-Token in Nachrichten serialisiert werden, z. B. wenn sie von einem Sicherheitstokendienst (Security Token Service, STS) ausgestellt werden oder von Clients im Rahmen der Authentifizierung an Dienste übergegeben werden, muss das Kontingent für die maximale Nachrichtengröße groß genug sein, um das SAML-Token und die anderen Teile der Nachricht aufnehmen zu können.When Security Assertions Markup Language (SAML) tokens are serialized in messages, either when they are issued by a Security Token Service (STS) or when clients present them to services as part of authentication, the maximum message size quota must be sufficiently large to accommodate the SAML token and the other message parts. Normalerweise ist das Kontingent für Nachrichten in Standardgröße ausreichend.In normal cases, the default message size quotas are sufficient. Wenn ein SAML-Token allerdings sehr groß ist, weil es mehrere Hundert Ansprüche enthält, sollten Sie das Kontingent erhöhen, damit das serialisierte Token darin Platz findet.However, in cases where a SAML token is large because it contains hundreds of claims, the quotas should be increased to accommodate the serialized token. Weitere Informationen finden Sie unterFor more information aboutKontingente, finden Sie unter Sicherheitsüberlegungen zu Daten. quotas, see Security Considerations for Data.

Festlegen von SecurityBindingElement.IncludeTimestamp für benutzerdefinierte Bindungen auf TRUESet SecurityBindingElement.IncludeTimestamp to True on Custom Bindings

Wenn Sie eine benutzerdefinierte Bindung erstellen, müssen Sie IncludeTimestamp auf true festlegen.When you create a custom binding, you must set IncludeTimestamp to true. Wenn IncludeTimestamp auf false festgelegt ist und der Client ein auf einem asymmetrischen Schlüssel basierendes Token verwendet, z. B. ein X.509-Zertifikat, wird die Nachricht nicht signiert.Otherwise, if IncludeTimestamp is set to false, and the client is using an asymmetric key-based token such as an X509 certificate, the message will not be signed.

Siehe auchSee Also

SicherheitsüberlegungenSecurity Considerations
Sicherheitsüberlegungen zu DatenSecurity Considerations for Data
Sicherheitsüberlegungen für MetadatenSecurity Considerations with Metadata