Compartir a través de


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 utilizando 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 sobre WCF la auditoría, vea 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.
    Dim newAudit As New ServiceSecurityAuditBehavior()
    newAudit.AuditLogLocation = AuditLogLocation.Application
    
    // Create a new auditing behavior and set the log location.
    ServiceSecurityAuditBehavior newAudit = 
        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 el de la aplicación. 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 permiten escribir de forma predeterminada en el registro de seguridad.

  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.

    newAudit.MessageAuthenticationAuditLevel = _
        AuditLevel.SuccessOrFailure
    newAudit.ServiceAuthorizationAuditLevel = _
        AuditLevel.SuccessOrFailure
    
    // 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;
    
  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.

    newAudit.SuppressAuditFailure = False
    
    // 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;
    

    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(Of ServiceSecurityAuditBehavior)
    serviceHost.Description.Behaviors.Add(newAudit)
    
    // Remove the old behavior and add the new.
    serviceHost.Description.
        Behaviors.Remove<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 element 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 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 
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();
    }
}

Seguridad

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 Local Security Setting de Windows, un error que genere eventos de auditoría provocará el cierre inmediato de Windows:

Auditoría: cierre el sistema inmediatamente 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 como Security y Auditar el acceso a objetos no está definido 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.

Vea también

Referencia

AuditLogLocation
ServiceSecurityAuditBehavior
AuditLogLocation

Conceptos

Auditoría de eventos de seguridad