Recoger registros de Microsoft SQL Server

Disponible en:

En este documento se explica cómo ingerir registros de Microsoft SQL Server en Google Security Operations mediante Bindplane. El analizador gestiona los registros de Microsoft SQL Server estructurados (JSON, pares clave-valor) y semiestructurados (syslog). Extrae campos, normaliza marcas de tiempo, gestiona diferentes formatos de registro en función del contenido de SourceModuleType y Message (incluidos los eventos de auditoría, inicio de sesión y base de datos) y los asigna al modelo de datos unificado. También realiza una lógica de análisis específica para los registros de auditoría, los intentos de inicio de sesión y las operaciones de la base de datos, lo que enriquece los datos con contexto adicional e información sobre la gravedad.Recoge los registros de auditoría y de errores de SQL Server del registro de eventos de Windows mediante un reenviador de syslog (NXLog) y los envía al agente de BindPlane para que los entregue a Google SecOps.

Antes de empezar

Asegúrate de que cumples los siguientes requisitos previos:

  • Una instancia de Google SecOps
  • Un host con Windows Server 2016 o una versión posterior que ejecute Microsoft SQL Server
  • Acceso de administrador para instalar y configurar el agente de BindPlane y NXLog
  • Si se ejecuta a través de un proxy, asegúrese de que los puertos del cortafuegos estén abiertos según los requisitos del agente de Bindplane.

Obtener el archivo de autenticación de ingestión de Google SecOps

  1. Inicia sesión en la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Agentes de recogida.
  3. Descarga el archivo de autenticación de ingestión. Guarda el archivo de forma segura en el sistema en el que se instalará Bindplane.

Obtener el ID de cliente de Google SecOps

  1. Inicia sesión en la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Perfil.
  3. Copia y guarda el ID de cliente de la sección Detalles de la organización.

Instalar el agente de Bindplane

Instala el agente de Bindplane en tu sistema operativo Windows o Linux siguiendo las instrucciones que se indican a continuación.

Instalación de ventanas

  1. Abre el símbolo del sistema o PowerShell como administrador.
  2. Ejecuta el siguiente comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Recursos de instalación adicionales

Para ver más opciones de instalación, consulta la guía de instalación.

Configurar el agente de BindPlane para ingerir Syslog y enviarlo a Google SecOps

  1. Accede al archivo de configuración:
    • Busca el archivo config.yaml. Normalmente, se encuentra en el directorio `C:\Program Files\observIQ\bindplane-agent` en Windows.
    • Abre el archivo con un editor de texto (por ejemplo, nano, vi o Bloc de notas).
  2. Edita el archivo config.yaml de la siguiente manera:

      receivers:
      udplog:
         # Replace the port and IP address as required
         listen_address: "0.0.0.0:1514"
    
      exporters:
      chronicle/chronicle_w_labels:
         compression: gzip
         # Adjust the path to the credentials file you downloaded in Step 1
         creds_file_path: '/path/to/ingestion-authentication-file.json'
         # Replace with your actual customer ID from Step 2
         customer_id: <YOUR_CUSTOMER_ID>
         endpoint: malachiteingestion-pa.googleapis.com
         # Add optional ingestion labels for better organization
         log_type: 'MICROSOFT_SQL'
         raw_log_field: body
         ingestion_labels:
    
      service:
      pipelines:
         logs/source0__chronicle_w_labels-0:
            receivers:
            - udplog
            exporters:
            - chronicle/chronicle_w_labels
    

Reinicia el agente de Bindplane para aplicar los cambios

  • Para reiniciar el agente de Bindplane en Windows, puedes usar la consola Servicios o introducir el siguiente comando:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Habilitar la auditoría de SQL Server en el registro de eventos de Windows

Puede habilitar la auditoría de SQL Server mediante la interfaz gráfica de usuario (GUI) de SQL Server Management Studio (SSMS) o con comandos T-SQL. Elige la opción que mejor se adapte a tu entorno.

Opción 1: Habilitar la auditoría de SQL Server mediante la interfaz gráfica de usuario de SSMS

Crear una auditoría de servidor en la interfaz de usuario de SQL Server Management Studio

  1. Abre SQL Server Management Studio (SSMS) y conéctate a tu instancia de SQL Server.
  2. En el Explorador de objetos, despliega la instancia del servidor.
  3. Despliega la carpeta Seguridad.
  4. Haz clic con el botón derecho en Auditorías y selecciona Nueva auditoría.
  5. En el cuadro de diálogo Crear auditoría, proporcione los siguientes detalles de configuración:
    • Nombre de la auditoría: introduce ChronicleAudit.
    • Latencia de la cola (en milisegundos): introduce 1000.
    • Si falla el registro de auditoría: selecciona Continuar.
    • Destino de la auditoría: selecciona Registro de aplicaciones.
  6. Haz clic en Aceptar para crear la auditoría.
  7. En Explorador de objetos, haz clic con el botón derecho en ChronicleAudit, que acabas de crear, y selecciona Habilitar auditoría.

Crear una especificación de auditoría de servidor mediante la interfaz gráfica de usuario de SSMS

  1. En el Explorador de objetos, expanda Seguridad.
  2. Haz clic con el botón derecho en Especificaciones de auditoría del servidor y selecciona Nueva especificación de auditoría del servidor.
  3. En el cuadro de diálogo Crear especificación de auditoría del servidor, proporcione los siguientes detalles de configuración:
    • Nombre: escribe ChronicleAuditSpec.
    • Auditoría: selecciona ChronicleAudit en el menú.
  4. En la sección Tipo de acción de auditoría, haga clic en Añadir y seleccione los siguientes grupos de acciones de auditoría (añada cada uno por separado haciendo clic en Añadir después de seleccionar cada uno):
    • FAILED_LOGIN_GROUP
    • SUCCESSFUL_LOGIN_GROUP
    • LOGOUT_GROUP
    • SERVER_ROLE_MEMBER_CHANGE_GROUP
    • DATABASE_OBJECT_CHANGE_GROUP
    • DATABASE_PRINCIPAL_CHANGE_GROUP
    • SCHEMA_OBJECT_CHANGE_GROUP
    • DATABASE_PERMISSION_CHANGE_GROUP
  5. Haz clic en Aceptar para crear la especificación de auditoría.
  6. En el Explorador de objetos, haz clic con el botón derecho en el ChronicleAuditSpec que acabas de crear y selecciona Habilitar especificación de auditoría del servidor.

Verificar la configuración de auditoría

  1. En el Explorador de objetos, expanda Seguridad > Auditorías.
  2. Haz clic con el botón derecho en ChronicleAudit y selecciona Propiedades.
  3. Comprueba que el Estado sea Iniciado o Habilitado.
  4. Expande Seguridad > Especificaciones de auditoría del servidor.
  5. Haz clic con el botón derecho en ChronicleAuditSpec y selecciona Propiedades.
  6. Verifica que aparezcan los ocho grupos de acciones de auditoría y que la especificación esté habilitada.

Opción 2: Habilitar la auditoría de SQL Server mediante T-SQL

  1. Abre SQL Server Management Studio (SSMS) y conéctate a tu instancia de SQL Server.
  2. Ejecuta los siguientes comandos de T-SQL para crear una auditoría del servidor que escriba en el registro de aplicaciones de Windows:

    USE master;
    GO
    
    CREATE SERVER AUDIT ChronicleAudit
    TO APPLICATION_LOG
    WITH (QUEUE_DELAY = 1000, ON_FAILURE = CONTINUE);
    GO
    
    ALTER SERVER AUDIT ChronicleAudit WITH (STATE = ON);
    GO
    
  3. Crea una especificación de auditoría para registrar los eventos de seguridad relevantes:

    CREATE SERVER AUDIT SPECIFICATION ChronicleAuditSpec
    FOR SERVER AUDIT ChronicleAudit
    ADD (FAILED_LOGIN_GROUP),
    ADD (SUCCESSFUL_LOGIN_GROUP),
    ADD (LOGOUT_GROUP),
    ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP),
    ADD (DATABASE_OBJECT_CHANGE_GROUP),
    ADD (DATABASE_PRINCIPAL_CHANGE_GROUP),
    ADD (SCHEMA_OBJECT_CHANGE_GROUP),
    ADD (DATABASE_PERMISSION_CHANGE_GROUP);
    GO
    
    ALTER SERVER AUDIT SPECIFICATION ChronicleAuditSpec WITH (STATE = ON);
    GO
    

Esta configuración asegura que los eventos de autenticación, los cambios de permisos y las modificaciones de objetos se registren en el registro de eventos de Windows.

Instalar y configurar NXLog para reenviar eventos a Bindplane

  1. Descarga NXLog Community Edition desde nxlog.co/downloads.
  2. Ejecuta el instalador y completa el asistente de instalación.
  3. Abre el archivo de configuración de NXLog, que se encuentra en:

    C:\Program Files\nxlog\conf\nxlog.conf
    
  4. Sustituye el contenido por la siguiente configuración:

    define ROOT C:\Program Files\nxlog
    Moduledir %ROOT%\modules
    CacheDir %ROOT%\data
    Pidfile %ROOT%\data\nxlog.pid
    SpoolDir %ROOT%\data
    LogFile %ROOT%\data\nxlog.log
    
    <Extension _json>
       Module      xm_json
    </Extension>
    
    <Input in_eventlog>
       Module      im_msvistalog
       Query       <QueryList>\
                      <Query Id="0">\
                            <Select Path="Application">*[System[Provider[@Name='MSSQLSERVER']]]</Select>\
                      </Query>\
                   </QueryList>
    </Input>
    
    <Output out_syslog>
       Module      om_udp
       Host        127.0.0.1
       Port        1514
       Exec        to_json();
    </Output>
    
    <Route r1>
       Path        in_eventlog => out_syslog
    </Route>
    
    • Sustituye el valor actual de Host 127.0.0.1 por la dirección IP del agente de Bindplane.
    • Asegúrate de que el valor de Puerto coincida con el puerto del receptor de Bindplane udplog que has configurado anteriormente.
  5. Guarda el archivo y reinicia el servicio NXLog:

    net stop nxlog && net start nxlog
    

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
AccountName principal.user.userid Se usa para principal.user.userid si está presente en los registros, como Starting up database o Log was backed up.
AgentDevice additional.fields Se ha añadido como par clave-valor a additional.fields con la clave "AgentDevice".
AgentLogFile additional.fields Se ha añadido como par clave-valor a additional.fields con la clave "AgentLogFile".
agent.hostname observer.asset.hostname Se asigna al nombre de host del observador.
agent.id observer.asset_id Se concatena con agent.type para formar observer.asset_id.
agent.type observer.asset_id Se concatena con agent.id para formar observer.asset_id.
agent.version observer.platform_version Se asigna a la versión de la plataforma del observador.
ApplicationName principal.application Se asigna a la aplicación principal.
application_name target.application Asigna la aplicación de destino.
client_address principal.ip Se usa para la IP principal si es diferente del host y no es local ni una canalización con nombre.
client_ip principal.ip Se asigna a la IP principal.
computer_name about.hostname Se asigna al nombre de host.
correlationId security_result.detection_fields Se añade como par clave-valor a security_result.detection_fields con la clave "correlationId".
Date metadata.event_timestamp Se combina con Time para crear la marca de tiempo del evento.
database_name target.resource_ancestors.name Se usa para el nombre del ancestro del recurso de destino si está presente en los registros de auditoría.
durationMs network.session_duration.seconds Convertido de milisegundos a segundos y asignado.
ecs.version metadata.product_version Asigna la versión del producto.
error security_result.detection_fields Se ha añadido como par clave-valor a security_result.detection_fields con la clave "error".
err_msg security_result.description Asigna la descripción del resultado de seguridad.
EventID metadata.product_event_type Se usa para crear el tipo de evento de producto si no hay otros campos disponibles. Tiene el prefijo "EventID: ".
event.action Source Se usa como fuente si está presente.
event.code metadata.product_event_type Se ha combinado con event.provider para formar metadata.product_event_type.
event.provider metadata.product_event_type Se ha combinado con event.code para formar metadata.product_event_type.
EventReceivedTime metadata.ingested_timestamp Se analiza y se usa como marca de tiempo de ingestión.
event_time metadata.event_timestamp Se analiza y se usa como marca de tiempo del evento.
file_name principal.process.file.full_path Asigna la ruta completa del archivo del proceso principal.
file_path target.file.full_path Se usa para la ruta completa del archivo de destino si se encuentra en los registros de copia de seguridad.
first_lsn target.resource.attribute.labels Se ha añadido como par clave-valor a target.resource.attribute.labels con la clave "First LSN".
host principal.hostname, observer.hostname Se usa para el nombre de host principal o de observador si no es una IP. También se usa para el nombre de host o la IP de destino, en función de si es una IP o no.
host.ip principal.ip Se ha combinado en la IP principal.
host.name host Se usa como host si está presente.
Hostname principal.hostname, target.hostname Se usa para el nombre de host principal o de destino, si está presente.
hostinfo.architecture principal.asset.hardware.cpu_platform Se asigna a la plataforma de CPU del hardware del recurso principal.
hostinfo.os.build additional.fields Se ha añadido como par clave-valor a additional.fields con la clave "os_build".
hostinfo.os.kernel principal.platform_patch_level Se asigna al nivel de parche de la plataforma principal.
hostinfo.os.name additional.fields Se ha añadido como par clave-valor a additional.fields con la clave "os_name".
hostinfo.os.platform principal.platform En mayúsculas y asignado a la plataforma principal.
hostinfo.os.version principal.platform_version Asigna la versión principal de la plataforma.
last_lsn target.resource.attribute.labels Se ha añadido como par clave-valor a target.resource.attribute.labels con la clave "Last LSN".
level security_result.severity Si es "Informativa", asigna el valor "INFORMATIONAL" a security_result.severity.
log.level security_result.severity_details Asigna la gravedad de los resultados de seguridad.
LoginName principal.user.userid Se usa para el ID de usuario principal si está presente en los registros de KV.
login_result security_result.action Determina la acción del resultado de seguridad (ALLOW o BLOCK).
logon_user principal.user.userid Se usa para el ID de usuario principal si está presente en los registros de inicio de sesión.
logstash.process.host intermediary.hostname Se asigna al nombre de host intermediario.
Message metadata.description, security_result.description Se usa para la descripción del evento o la descripción del resultado de seguridad, según el tipo de registro.
msg metadata.description Se usa para la descripción del evento, si está presente.
ObjectName target.resource.name Asigna el nombre del recurso de destino.
object_name target.resource.name Se usa para el nombre del recurso de destino si está presente en los registros de auditoría.
ObjectType target.resource.type Asigna el tipo de recurso de destino.
operationId security_result.detection_fields Se ha añadido como par clave-valor a security_result.detection_fields con la clave "operationId".
operationName metadata.product_event_type Se asigna al tipo de evento de producto.
operationVersion additional.fields Se añade como un par clave-valor a additional.fields con la clave "operationVersion".
ProcessInfo additional.fields Se añade como par clave-valor a additional.fields con la clave "ProcessInfo".
properties.apiVersion metadata.product_version Asigna la versión del producto.
properties.appId target.resource.product_object_id Se asigna al ID de objeto de producto del recurso de destino.
properties.clientAuthMethod extensions.auth.auth_details Se usa para determinar los detalles de autenticación.
properties.clientRequestId additional.fields Se añade como par clave-valor a additional.fields con la clave "clientRequestId".
properties.durationMs network.session_duration.seconds Se ha convertido a segundos y se ha asignado.
properties.identityProvider security_result.detection_fields Se ha añadido como par clave-valor a security_result.detection_fields con la clave "identityProvider".
properties.ipAddress principal.ip, principal.asset.ip Se analiza para obtener la IP y se combina con la IP principal y la IP del recurso principal.
properties.location principal.location.name Asigna el nombre de la ubicación principal.
properties.operationId security_result.detection_fields Se ha añadido como par clave-valor a security_result.detection_fields con la clave "operationId".
properties.requestId metadata.product_log_id Se asigna al ID de registro del producto.
properties.requestMethod network.http.method Se asigna al método HTTP de la red.
properties.requestUri target.url Se asigna a la URL de destino.
properties.responseSizeBytes network.received_bytes Se ha convertido en un número entero sin signo y se ha asignado.
properties.responseStatusCode network.http.response_code Se ha convertido en un número entero y se ha asignado.
properties.roles additional.fields Se añade como par clave-valor a additional.fields con la clave "roles".
properties.servicePrincipalId principal.user.userid Se usa para el ID de usuario principal si no está presente properties.userId.
properties.signInActivityId network.session_id Se corresponde con el ID de sesión de la red.
properties.tenantId metadata.product_deployment_id Se asigna al ID de implementación del producto.
properties.tokenIssuedAt additional.fields Se ha añadido como par clave-valor a additional.fields con la clave "tokenIssuedAt".
properties.userAgent network.http.user_agent Se asigna al user-agent HTTP de la red.
properties.userId principal.user.userid Se usa para el ID de usuario principal, si está presente.
properties.wids security_result.detection_fields Se añade como par clave-valor a security_result.detection_fields con la clave "wids".
reason security_result.summary Se usa para el resumen de resultados de seguridad en eventos de inicio de sesión.
resourceId target.resource.attribute.labels Se ha añadido como par clave-valor a target.resource.attribute.labels con la clave "Resource ID".
schema_name target.resource_ancestors.resource_subtype Se usa para el subtipo de ancestro del recurso de destino si está presente en los registros de auditoría.
security_result.description metadata.description Se usa para la descripción del evento si no es un evento de auditoría.
security_result.severity security_result.severity Maps directamente, si está disponible. Se asigna el valor "LOW" a los registros de KV, "INFORMATIONAL" a determinados mensajes de error y se deriva de los campos level o Severity.
security_result.severity_details security_result.severity_details Maps directamente, si está disponible.
security_result.summary security_result.summary Maps directamente, si está disponible. Se establece en "Conexión realizada mediante autenticación de Windows" o en motivos específicos de los eventos de inicio de sesión, o en "Registro de auditoría de SQL Server" para los eventos de auditoría.
security_result_action security_result.action Se ha combinado con security_result.action. Se asigna el valor "ALLOW" a la mayoría de los eventos y se deriva de login_result en el caso de los eventos de inicio de sesión.
server_instance_name target.hostname Se usa para el nombre de host de destino si está presente en los registros de auditoría.
server_principal_name principal.user.userid Se usa para el ID de usuario principal si está presente en los registros de auditoría.
server_principal_sid principal.asset_id Se usa para crear el ID de recurso principal, con el prefijo "server SID:".
session_id network.session_id Se usa para el ID de sesión de red si está presente en los registros de auditoría.
sev security_result.severity Se usa para determinar la gravedad del resultado de seguridad.
Severity security_result.severity Se usa para determinar la gravedad del resultado de seguridad.
Source additional.fields Se ha añadido como par clave-valor a additional.fields con la clave "Source".
source principal.resource.attribute.labels Se ha añadido como par clave-valor a principal.resource.attribute.labels con la clave "source".
SourceModuleType observer.application Se asigna a la aplicación observadora.
SourceModuleName additional.fields Se ha añadido como par clave-valor a additional.fields con la clave "SourceModuleName".
source_module_name observer.labels Se ha añadido como par clave-valor a observer.labels con la clave "SourceModuleName".
source_module_type observer.application Se asigna a la aplicación observadora.
SPID network.session_id Se corresponde con el ID de sesión de la red.
statement target.process.command_line Se usa para la línea de comandos del proceso de destino si está presente en los registros de auditoría.
TextData security_result.description, metadata.description Se usa para la descripción del resultado de seguridad si no es un evento de inicio de sesión o para la descripción del evento si lo es.
time metadata.event_timestamp Se analiza y se usa como marca de tiempo del evento.
Time metadata.event_timestamp Se combina con Date para crear la marca de tiempo del evento.
transaction_id target.resource.attribute.labels Se ha añadido como par clave-valor a target.resource.attribute.labels con la clave "transaction_id".
UserID principal.user.windows_sid Se usa para el SID de Windows del usuario principal si está presente y tiene el formato correcto.
user_id principal.user.userid Se usa para el ID de usuario principal, si está presente.
metadata.log_type metadata.log_type Codificado como "MICROSOFT_SQL".
metadata.vendor_name metadata.vendor_name Codificado como "Microsoft".
metadata.product_name metadata.product_name Codificado como "SQL Server".
metadata.event_type metadata.event_type Se asignan varios valores en función del contenido del registro, como "USER_LOGIN", "USER_LOGOUT", "STATUS_STARTUP", "STATUS_SHUTDOWN", "NETWORK_HTTP", "GENERIC_EVENT" y "STATUS_UNCATEGORIZED" como valor predeterminado.
extensions.auth.type extensions.auth.type Se asigna el valor "MACHINE" a los eventos de inicio y cierre de sesión.

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.