Freigeben über


Vorgehensweise: Sperren von Endpunkten im Unternehmen

Von Großunternehmen wird oft gefordert, dass Anwendungen unter Einhaltung der Sicherheitsrichtlinien der Unternehmen entwickelt werden. In diesem Thema wird behandelt, wie eine Clientendpunktbestätigung entwickelt und installiert wird, die zur Validierung aller auf Computern installierten Windows Communication Foundation (WCF)-Clientanwendungen verwendet werden kann.

In diesem Fall handelt es sich bei der Bestätigung um eine Clientbestätigung, da dieses Endpunktverhalten dem Clientabschnitt <commonBehaviors> der Datei „machine.config“ hinzugefügt wird. WCF lädt gemeinsames Endpunktverhalten nur für Clientanwendungen und gemeinsames Dienstverhalten nur für Dienstanwendungen. Um diese Bestätigung für Dienstanwendungen installieren zu können, muss es sich bei der Bestätigung um ein Dienstverhalten handeln. Weitere Informationen finden Sie im Abschnitt <commonBehaviors>.

Wichtig

Dienst- oder Endpunktverhaltensweisen, die nicht mit dem Attribut AllowPartiallyTrustedCallersAttribute (APTCA) gekennzeichnet sind und dem Abschnitt <commonBehaviors> einer Konfigurationsdatei hinzugefügt wurden, werden nicht ausgeführt, wenn die Anwendung in einer teilweise vertrauenswürdigen Umgebung ausgeführt wird. In diesem Fall wird auch keine Ausnahme ausgelöst. Um die Ausführung gemeinsamer Verhalten, wie z. B. Bestätigungen, zu erzwingen, müssen Sie einen der beiden folgenden Schritte ausführen:

  • Markieren Sie das gemeinsame Verhalten mit dem AllowPartiallyTrustedCallersAttribute-Attribut, damit es ausgeführt werden kann, wenn es als teilweise vertrauenswürdige Anwendung bereitgestellt wird. Beachten Sie, dass auf dem Computer ein Registrierungseintrag festgelegt werden kann, um die Ausführung von mit APTCA markierten Assemblys zu verhindern.

  • Wenn die Anwendung als voll vertrauenswürdige Anwendung bereitgestellt wird, stellen Sie sicher, dass die Benutzer*innen die Sicherheitseinstellungen für den Codezugriff nicht dahingehend ändern können, dass die Anwendung in einer teilweise vertrauenswürdigen Umgebung ausgeführt werden kann. Wenn sie dies können, dann wird die benutzerdefinierte Bestätigung nicht ausgeführt, und es wird keine Ausnahme ausgelöst. Eine Möglichkeit, dieses sicherzustellen, ist die levelfinal-Option des Sicherheitsrichtlinientools für den Codezugriff (Caspol.exe).

Weitere Informationen finden Sie unter Empfehlungen für eine teilweise vertrauenswürdige Umgebung und Unterstützte Bereitstellungsszenarios.

So erstellen Sie eine Endpunktbestätigung

  1. Erstellen Sie ein IEndpointBehavior mit den gewünschten Validierungsschritten in der Validate-Methode. Der folgende Code gibt ein Beispiel. (Das InternetClientValidatorBehavior stammt aus dem Beispiel Sicherheitsvalidierung.)

    public class InternetClientValidatorBehavior : IEndpointBehavior
    {
        public void AddBindingParameters(ServiceEndpoint serviceEndpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { }
        public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, System.ServiceModel.Dispatcher.ClientRuntime behavior) { }
        public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) { }
    
        public void Validate(ServiceEndpoint endpoint)
        {
            BindingElementCollection elements = endpoint.Binding.CreateBindingElements();
    
            if (EndpointIsDual(endpoint, elements))
                throw new InvalidOperationException("InternetClientValidator: endpoint uses 'dual' mode. This mode is disallowed for use with untrusted services.");
    
            if (EndpointAllowsNtlm(endpoint, elements))
                throw new InvalidOperationException("InternetClientValidator: endpoint allows NTLM. This mode is disallowed for use with untrusted services.");
    
            if (EndpointAllowsTransactionFlow(endpoint, elements))
                throw new InvalidOperationException("InternetClientValidator: endpoint flows transaction ids. This mode is disallowed for use with untrusted services.");
        }
    
  2. Erstellen Sie ein neues BehaviorExtensionElement, des die in Schritt 1 erstellte Endpunktbestätigung registriert. Dies wird im folgenden Codebeispiel gezeigt. (Der ursprüngliche Code für dieses Beispiel befindet sich im Codebeispiel Sicherheitsvalidierung.)

    public class InternetClientValidatorElement : BehaviorExtensionElement
    {
        public override Type BehaviorType
        {
            get { return typeof(InternetClientValidatorBehavior); }
        }
    
        protected override object CreateBehavior()
        {
            return new InternetClientValidatorBehavior();
        }
    }
    
  3. Stellen Sie sicher, dass die kompilierte Assembly mit einem starken Namen signiert wird. Ausführliche Informationen finden Sie unter Strong Name-Tool (SN.EXE) und den Compilerbefehlen für Ihre Sprache.

So installieren Sie die Bestätigung auf dem Zielcomputer

  1. Installieren Sie die Endpunktbestätigung mithilfe des entsprechenden Mechanismus. In einem Unternehmen kann dies die Verwendung der Gruppenrichtlinie und des Systems Management Server (SMS) sein.

  2. Installieren Sie mithilfe von Gacutil.exe (Tool für den globalen Assemblycache) die Assembly mit starkem Namen im globalen Assemblycache.

  3. Verwenden Sie die System.Configuration-Namespacetypen, um Folgendes durchzuführen:

    1. Fügen Sie die Erweiterung dem Abschnitt <behaviorExtensions> unter Angabe eines vollqualifizierten Typnamens hinzu, und sperren Sie das Element.

      // Register our validator configuration element.
      ExtensionsSection extensions
        = machine.GetSection(@"system.serviceModel/extensions") as ExtensionsSection;
      if (extensions == null)
        throw new Exception("not extensions section.");
      ExtensionElement validator
        = new ExtensionElement(
          "internetClientValidator",
          "Microsoft.ServiceModel.Samples.InternetClientValidatorElement, InternetClientValidator, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
        );
      validator.LockItem = true;
      if (extensions.BehaviorExtensions.IndexOf(validator) < 0)
        extensions.BehaviorExtensions.Add(validator);
      
    2. Fügen Sie das Verhaltenselement der EndpointBehaviors-Eigenschaft des <commonBehaviors>-Abschnitts hinzu, und sperren Sie das Element. (Um die Validierung auf dem Dienst zu installieren, muss die Validierung ein IServiceBehavior sein und der ServiceBehaviors-Eigenschaft hinzugefügt werden.) Das folgende Codebeispiel zeigt die richtige Konfiguration nach den Schritten a. und b. mit der einzigen Ausnahme, dass kein starker Name vorhanden ist.

      // Add a new section for our validator and lock it down.
      // Behaviors for client applications must be endpoint behaviors.
      // Behaviors for service applications must be service behaviors.
      CommonBehaviorsSection commonBehaviors
        = machine.GetSection(@"system.serviceModel/commonBehaviors") as CommonBehaviorsSection;
      InternetClientValidatorElement internetValidator = new InternetClientValidatorElement();
      internetValidator.LockItem = true;
      commonBehaviors.EndpointBehaviors.Add(internetValidator);
      
    3. Speichern Sie die Datei machine.config. Das folgende Codebeispiel führt alle Aufgaben in Schritt 3 durch, speichert aber eine lokale Kopie der geänderten Datei machine.config.

      // Write to disk.
      machine.SaveAs("newMachine.config");
      
      // Write our new information.
      SectionInformation cBInfo = commonBehaviors.SectionInformation;
      Console.WriteLine(cBInfo.GetRawXml());
      Console.WriteLine(extensions.SectionInformation.GetRawXml());
      Console.Read();
      

Beispiel

Das folgende Codebeispiel veranschaulicht, wie ein gemeinsames Verhalten zu einer machine.config-Datei hinzugefügt und wie eine Kopie auf der Festplatte gespeichert wird. Das InternetClientValidatorBehavior stammt aus dem Beispiel Sicherheitsvalidierung.

Configuration machine = ConfigurationManager.OpenMachineConfiguration();
// Register our validator configuration element.
ExtensionsSection extensions
  = machine.GetSection(@"system.serviceModel/extensions") as ExtensionsSection;
if (extensions == null)
  throw new Exception("not extensions section.");
ExtensionElement validator
  = new ExtensionElement(
    "internetClientValidator",
    "Microsoft.ServiceModel.Samples.InternetClientValidatorElement, InternetClientValidator, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
  );
validator.LockItem = true;
if (extensions.BehaviorExtensions.IndexOf(validator) < 0)
  extensions.BehaviorExtensions.Add(validator);

// Add a new section for our validator and lock it down.
// Behaviors for client applications must be endpoint behaviors.
// Behaviors for service applications must be service behaviors.
CommonBehaviorsSection commonBehaviors
  = machine.GetSection(@"system.serviceModel/commonBehaviors") as CommonBehaviorsSection;
InternetClientValidatorElement internetValidator = new InternetClientValidatorElement();
internetValidator.LockItem = true;
commonBehaviors.EndpointBehaviors.Add(internetValidator);
// Write to disk.
machine.SaveAs("newMachine.config");

// Write our new information.
SectionInformation cBInfo = commonBehaviors.SectionInformation;
Console.WriteLine(cBInfo.GetRawXml());
Console.WriteLine(extensions.SectionInformation.GetRawXml());
Console.Read();

.NET Framework-Sicherheit

Sie können darüber hinaus die Elemente der Konfigurationsdatei verschlüsseln. Weitere Informationen finden Sie im Abschnitt "Siehe auch".

Siehe auch