Vorgehensweise: Überwachen von Windows Communication Foundation-Sicherheitsereignissen

Windows Communication Foundation (WCF) ermöglicht das Protokollieren von Sicherheitsereignissen im Ereignisprotokoll von Windows. Dieses kann mithilfe der Windows-Ereignisanzeige angezeigt werden. In diesem Thema wird erläutert, wie eine Anwendung so eingerichtet werden kann, dass Sicherheitsereignisse protokolliert werden. Weitere Informationen zur WCF-Überwachung finden Sie unter Überwachung.

So überwachen Sie Sicherheitsereignisse im Code

  1. Geben Sie den Speicherort des Überwachungsprotokolls an. Legen Sie hierzu die AuditLogLocation-Eigenschaft der ServiceSecurityAuditBehavior-Klasse auf einen der AuditLogLocation-Enumerationswerte fest, wie im folgenden Code gezeigt:

    // Create a new auditing behavior and set the log location.
    ServiceSecurityAuditBehavior newAudit =
        new ServiceSecurityAuditBehavior();
    newAudit.AuditLogLocation =
        AuditLogLocation.Application;
    
    ' Create a new auditing behavior and set the log location.
    Dim newAudit As New ServiceSecurityAuditBehavior()
    newAudit.AuditLogLocation = AuditLogLocation.Application
    

    Die AuditLogLocation-Enumeration hat drei Werte: Application, Security oder Default. Mithilfe des Werts wird eines der in der Ereignisanzeige angezeigten Protokolle angegeben: entweder das Sicherheits- oder das Anwendungsprotokoll. Bei Verwendung des Default-Werts ist das tatsächliche Protokoll vom Betriebssystem abhängig, unter dem die Anwendung ausgeführt wird. Ist bei aktivierter Überwachung kein Protokollspeicherort angegeben, wird für Plattformen, von denen das Schreiben in das Sicherheitsprotokoll unterstützt wird, standardmäßig das Security-Protokoll verwendet. Andernfalls wird das Application-Protokoll verwendet. Nur Windows Server 2003 und Windows Vista unterstützen standardmäßig das Schreiben in das Sicherheitsprotokoll.

  2. Richten Sie die zu überwachenden Ereignistypen ein. Ereignisse auf Dienstebene sowie Autorisierungsereignisse auf Nachrichtenebene können gleichzeitig überwacht werden. Legen Sie hierzu die ServiceAuthorizationAuditLevel-Eigenschaft oder die MessageAuthenticationAuditLevel-Eigenschaft auf einen der AuditLevel-Enumerationswerte fest, wie im folgenden Code gezeigt:

    // Create a new auditing behavior and set the log location.
    ServiceSecurityAuditBehavior newAudit =
        new ServiceSecurityAuditBehavior();
    newAudit.AuditLogLocation =
        AuditLogLocation.Application;
    newAudit.MessageAuthenticationAuditLevel =
        AuditLevel.SuccessOrFailure;
    newAudit.ServiceAuthorizationAuditLevel =
        AuditLevel.SuccessOrFailure;
    
    newAudit.MessageAuthenticationAuditLevel = _
        AuditLevel.SuccessOrFailure
    newAudit.ServiceAuthorizationAuditLevel = _
        AuditLevel.SuccessOrFailure
    
  3. Geben Sie an, ob Fehler bei Protokollüberwachungsereignissen unterdrückt oder für die Anwendung verfügbar gemacht werden sollen. Legen Sie die SuppressAuditFailure-Eigenschaft entweder auf true oder auf false fest, wie im folgenden Code gezeigt:

    // Create a new auditing behavior and set the log location.
    ServiceSecurityAuditBehavior newAudit =
        new ServiceSecurityAuditBehavior();
    newAudit.AuditLogLocation =
        AuditLogLocation.Application;
    newAudit.MessageAuthenticationAuditLevel =
        AuditLevel.SuccessOrFailure;
    newAudit.ServiceAuthorizationAuditLevel =
        AuditLevel.SuccessOrFailure;
    newAudit.SuppressAuditFailure = false;
    
    newAudit.SuppressAuditFailure = False
    

    Die standardmäßige SuppressAuditFailure-Eigenschaft ist true. Die Anwendung wird also durch einen Fehler bei der Überwachung nicht beeinträchtigt. Andernfalls wird eine Ausnahme ausgelöst. Für jede erfolgreiche Überwachung wird eine ausführliche Ablaufverfolgung geschrieben. Für jeden Überwachungsfehler wird eine Ablaufverfolgung auf Fehlerebene geschrieben.

  4. Löschen Sie das vorhandene ServiceSecurityAuditBehavior aus der Verhaltensauflistung, die sich in der Beschreibung eines ServiceHost befindet. Der Zugriff auf die Verhaltensauflistung erfolgt über die Behaviors-Eigenschaft, auf die wiederum über die Description-Eigenschaft zugegriffen wird. Fügen Sie der gleichen Auflistung anschließend das neue ServiceSecurityAuditBehavior hinzu, wie im folgenden Code gezeigt:

    // Remove the old behavior and add the new.
    serviceHost.Description.
        Behaviors.Remove<ServiceSecurityAuditBehavior>();
    serviceHost.Description.Behaviors.Add(newAudit);
    
    ' Remove the old behavior and add the new.
    serviceHost.Description.Behaviors.Remove(Of ServiceSecurityAuditBehavior)
    serviceHost.Description.Behaviors.Add(newAudit)
    

So richten Sie die Überwachung in der Konfiguration ein

  1. Fügen Sie zum Einrichten der Überwachung in der Konfiguration dem <behaviors>-Abschnitt der Datei „web.config“ ein <behavior>-Element hinzu. Fügen Sie anschließend ein <serviceSecurityAudit>-Element hinzu, und legen Sie die verschiedenen Attribute wie im folgenden Beispiel gezeigt fest.

    <behaviors>  
       <behavior name="myAuditBehavior">  
          <serviceSecurityAudit auditLogLocation="Application"  
                suppressAuditFailure="false"
                serviceAuthorizationAuditLevel="None"
                messageAuthenticationAuditLevel="SuccessOrFailure" />  
          </behavior>  
    </behaviors>  
    
  2. Geben Sie das Verhalten für den Dienst an, wie im folgenden Beispiel gezeigt:

    <services>  
        <service type="WCS.Samples.Service.Echo"
        behaviorConfiguration=" myAuditBehavior">  
           <endpoint address=""  
                    binding="wsHttpBinding"  
                    bindingConfiguration="CertificateDefault"
                    contract="WCS.Samples.Service.IEcho" />  
        </service>  
    </services>  
    

Beispiel

Mithilfe des folgenden Codes wird eine Instanz der ServiceHost-Klasse erstellt, und der Verhaltensauflistung wird ein neues ServiceSecurityAuditBehavior hinzugefügt.

public static void Main()
{
    // Get base address from appsettings in configuration.
    Uri baseAddress = new Uri(ConfigurationManager.
        AppSettings["baseAddress"]);

    // Create a ServiceHost for the CalculatorService type
    // and provide the base address.
    using (ServiceHost serviceHost = new
        ServiceHost(typeof(CalculatorService), baseAddress))
    {
        // Create a new auditing behavior and set the log location.
        ServiceSecurityAuditBehavior newAudit =
            new ServiceSecurityAuditBehavior();
        newAudit.AuditLogLocation =
            AuditLogLocation.Application;
        newAudit.MessageAuthenticationAuditLevel =
            AuditLevel.SuccessOrFailure;
        newAudit.ServiceAuthorizationAuditLevel =
            AuditLevel.SuccessOrFailure;
        newAudit.SuppressAuditFailure = false;
        // Remove the old behavior and add the new.
        serviceHost.Description.
            Behaviors.Remove<ServiceSecurityAuditBehavior>();
        serviceHost.Description.Behaviors.Add(newAudit);
        // Open the ServiceHostBase to create listeners
        // and start listening for messages.
        serviceHost.Open();

        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();

        // Close the ServiceHostBase to shutdown the service.
        serviceHost.Close();
    }
}
Public Shared Sub Main()
    ' Get base address from appsettings in configuration.
    Dim baseAddress As New Uri(ConfigurationManager.AppSettings("baseAddress"))

    ' Create a ServiceHost for the CalculatorService type 
    ' and provide the base address.
    Dim serviceHost As New ServiceHost(GetType(CalculatorService), baseAddress)
    Try
        ' Create a new auditing behavior and set the log location.
        Dim newAudit As New ServiceSecurityAuditBehavior()
        newAudit.AuditLogLocation = AuditLogLocation.Application
        newAudit.MessageAuthenticationAuditLevel = _
            AuditLevel.SuccessOrFailure
        newAudit.ServiceAuthorizationAuditLevel = _
            AuditLevel.SuccessOrFailure
        newAudit.SuppressAuditFailure = False
        ' Remove the old behavior and add the new.
        serviceHost.Description.Behaviors.Remove(Of ServiceSecurityAuditBehavior)
        serviceHost.Description.Behaviors.Add(newAudit)
        ' Open the ServiceHostBase to create listeners 
        ' and start listening for messages.
        serviceHost.Open()

        ' The service can now be accessed.
        Console.WriteLine("The service is ready.")
        Console.WriteLine("Press <ENTER> to terminate service.")
        Console.WriteLine()
        Console.ReadLine()

        ' Close the ServiceHostBase to shutdown the service.
        serviceHost.Close()
    Finally
    End Try

End Sub

.NET Framework-Sicherheit

Durch Festlegen der SuppressAuditFailure-Eigenschaft auf true werden Fehler beim Generieren von Sicherheitsüberwachungen unterdrückt. (Bei Verwendung von false wird eine Ausnahme ausgelöst). Wird jedoch für Lokale Sicherheitseinstellung die folgende Windows-Eigenschaft aktiviert, führt ein Fehler beim Generieren von Überwachungsereignissen dazu, dass Windows umgehend heruntergefahren wird:

Überwachung: System sofort herunterfahren, wenn Sicherheitsüberprüfungen nicht protokolliert werden können

Öffnen Sie zum Festlegen der Eigenschaft das Dialogfeld Lokale Sicherheitseinstellungen. Wählen Sie unter Sicherheitseinstellungen die Option Lokale Richtlinien aus. Wählen Sie anschließend Sicherheitsoptionen aus.

Wenn die AuditLogLocation-Eigenschaft auf Security festgelegt und für Lokale Sicherheitsrichtlinie nicht die Einstellung Objektzugriffsversuche überwachen aktiviert ist, werden Überwachungsereignisse nicht in das Sicherheitsprotokoll geschrieben. Es wird zwar kein Fehler zurückgegeben, doch die Überwachungseinträge werden nicht in das Sicherheitsprotokoll geschrieben.

Siehe auch