Cómo auditar los eventos de seguridad de Windows Communication Foundation

Windows Communication Foundation (WCF) permite registrar los eventos de seguridad en el registro de eventos de Windows, que puede consultarse con el Visor de eventos de Windows. Este tema explica cómo configurar una aplicación para que registre los eventos de seguridad. Para obtener más información acerca de las auditorías en WCF, consulte Auditoría de eventos de seguridad.

Para auditar los eventos de seguridad en el código

  1. Especifique la ubicación del registro de auditoría. Para ello, establezca la propiedad AuditLogLocation de la clase ServiceSecurityAuditBehavior en uno de los valores de enumeración AuditLogLocation, como se muestra en el código siguiente.

    // 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
    

    La enumeración AuditLogLocation tiene tres valores: Application, Security o Default. El valor especifica uno de los registros visibles en el visor de eventos, el registro de seguridad o de aplicaciones. Si utiliza el valor Default, el registro real dependerá del sistema operativo en el que se está ejecutando la aplicación. Si se habilita la auditoría y no se especifica la ubicación del registro, el valor predeterminado es el registro de Security en las plataformas que admiten escribir en el registro de seguridad; de lo contrario, se escribirá en el registro Application. Solo Windows Server 2003 y Windows Vista admiten la escritura en el registro de seguridad de forma predeterminada.

  2. Establezca los tipos de eventos que se van a auditar. Puede auditar, simultáneamente, eventos de nivel de servicio o eventos de nivel de autorización. Establezca la propiedad ServiceAuthorizationAuditLevel o la propiedad MessageAuthenticationAuditLevel en uno de los valores de enumeración AuditLevel, como muestra el siguiente código.

    // 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. Especifique si suprimir o exponer los errores a la aplicación relacionados con los eventos de auditoría del registro. Establezca la propiedad SuppressAuditFailure en true o false, como muestra el siguiente código.

    // 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
    

    La propiedad SuppressAuditFailure predeterminada es true, de modo que el error que se audita no afecta a la aplicación. De lo contrario, se inicia una excepción. Para cualquier auditoría realizada correctamente, se escribe con detalle el seguimiento de la traza. Para cualquier error que se audita, se escribe el seguimiento de la traza en el nivel del error.

  4. Elimine el ServiceSecurityAuditBehavior existente de la colección de comportamientos encontrada en la descripción de ServiceHost. A la colección de comportamiento tiene acceso la propiedad Behaviors, a la que a su vez tiene acceso la propiedad Description. A continuación, agregue el nuevo ServiceSecurityAuditBehavior a la misma colección, como se muestra en el código siguiente.

    // 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)
    

Para establecer la auditoría en la configuración

  1. Para establecer la auditoría en la configuración, agregue un elemento <behavior> a la sección <behaviors> del archivo web.config. Después, agregue un elemento <serviceSecurityAudit> y establezca los distintos atributos, como se muestra en el ejemplo siguiente.

    <behaviors>  
       <behavior name="myAuditBehavior">  
          <serviceSecurityAudit auditLogLocation="Application"  
                suppressAuditFailure="false"
                serviceAuthorizationAuditLevel="None"
                messageAuthenticationAuditLevel="SuccessOrFailure" />  
          </behavior>  
    </behaviors>  
    
  2. Debe especificarse el comportamiento del servicio, como se muestra en el ejemplo siguiente.

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

Ejemplo

El siguiente código crea una instancia de la clase ServiceHost y agrega un nuevo ServiceSecurityAuditBehavior a la colección de comportamientos.

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

Seguridad de .NET Framework

Cuando se establece la propiedad SuppressAuditFailure como true, se suprime cualquier error que genere auditorías de seguridad (si se establece como false, se inicia una excepción). Sin embargo, si habilita la siguiente propiedad de la Configuración de seguridad local de Windows, un error al generar eventos de auditoría provocará el cierre inmediato de Windows:

Auditoría: apagar el sistema de inmediato si no se pueden registrar las auditorías de seguridad

Para establecer la propiedad, abra el cuadro de diálogo Configuración de seguridad local. En Configuración de seguridad, haga clic en Directivas locales. A continuación, haga clic en Opciones de seguridad.

Si la propiedad AuditLogLocation está establecida en Security y no se ha establecido Auditar el acceso a objetos en Directiva de seguridad local, los eventos de auditoría no se escribirán en el registro de seguridad. Tenga en cuenta que no se devuelve ningún error, aunque las entradas de auditoría no se escriben en el registro de seguridad.

Consulte también