Recopila registros de Microsoft SQL Server

Compatible con:

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

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos previos:

  • Una instancia de Google SecOps
  • Un host de Windows Server 2016 o posterior que ejecute Microsoft SQL Server
  • Acceso de administrador para instalar y configurar el agente de BindPlane y NXLog
  • Si se ejecuta detrás de un proxy, asegúrate de que los puertos de firewall estén abiertos según los requisitos del agente de Bindplane.

Obtén credenciales de Google SecOps para el agente de Bindplane

Para autenticar el agente de Bindplane en Google SecOps, elige uno de los siguientes métodos:

  • Implementaciones nuevas: Usa la API de Chronicle (opción 1).
  • Implementaciones heredadas: Sigue usando el archivo de autenticación de transferencia (opción 2) hasta que se descontinúe la API de Ingestion el 20 de julio de 2027.
  1. Accede a la consola deGoogle Cloud y selecciona el proyecto de Google Cloud que está vinculado a tu instancia de Google SecOps.
  2. Ve a IAM y administración > Cuentas de servicio.
  3. Haga clic en Crear cuenta de servicio.
  4. Proporciona los siguientes detalles de configuración:
    • Nombre de la cuenta de servicio: Ingresa un nombre para la cuenta (por ejemplo, bindplane-ingest).
    • Descripción de la cuenta de servicio: Ingresa una descripción (por ejemplo, Bindplane agent log ingestion).
  5. Haz clic en Crear y continuar.
  6. En la sección Otorga a esta cuenta de servicio acceso al proyecto, haz clic en Seleccionar un rol y, luego, en Editor de Chronicle.
  7. Haz clic en Continuar y, luego, en Listo.
  8. Haz clic en la cuenta de servicio que creaste y, luego, ve a la pestaña Claves.
  9. Haz clic en Agregar clave > Crear clave nueva.
  10. Selecciona JSON y haz clic en Crear. El archivo de claves se descargará en tu computadora.
  11. Guarda el archivo de claves como ingestion-auth.json en el directorio del recopilador de Bindplane (/opt/observiq-otel-collector/ingestion-auth.json en Linux o C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json en Windows) o actualiza creds_file_path en config.yaml para que coincida con la ruta de acceso en la que lo guardas.
  12. Ve a IAM y administración > Configuración y copia el número de proyecto. Lo necesitarás para la configuración del exportador.

Opción 2: Descarga el archivo de autenticación de transferencia (heredado)

  1. Accede a la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Agentes de recopilación.
  3. Descarga el archivo de autenticación de transferencia.
  4. Guarda el archivo de forma segura en el sistema en el que se instalará el agente de Bindplane.

Obtén el ID de cliente de Google SecOps

  1. Accede a 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.

Instala el agente de Bindplane

Instala el agente de Bindplane en tu sistema operativo Windows o Linux según las siguientes instrucciones.

Instalación en Windows

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

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

Recursos de instalación adicionales

Para conocer otras opciones de instalación, consulta la guía de instalación.

Configura el agente de BindPlane para transferir Syslog y enviarlo a Google SecOps

  1. Accede al archivo de configuración:
    • Ubica el archivo config.yaml. Por lo general, 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 el 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:
          protocol: https
          # Region of your instance, for example us, europe, asia-southeast1
          location: <LOCATION>
          # Project number of the Google Cloud project linked to the instance
          project: '<PROJECT_NUMBER>'
          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: chronicle.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
    
    • Reemplaza el puerto y la dirección IP según sea necesario en tu infraestructura.
    • Reemplaza <LOCATION> por la región de tu instancia de Google SecOps (por ejemplo, us, europe o asia-southeast1). El exportador antepone chronicle.googleapis.com con este valor.
    • Reemplaza <PROJECT_NUMBER> por el número de proyecto de IAM y administración > Configuración.
    • Reemplaza <customer_id> por el ID de cliente real.
    • Actualiza /path/to/ingestion-authentication-file.json a la ruta de acceso en la que se guardó el archivo de claves de la cuenta de servicio (opción 1) en la sección Obtén credenciales de Google SecOps para el agente de Bindplane.

Exportador de la API de transferencia heredada

  • Si usas el archivo de autenticación de transferencia de la opción 2, reemplaza el bloque exporters por el siguiente. Establece creds_file_path en la ruta de acceso al archivo de autenticación de transferencia y, si tu instancia está fuera de EE.UU., reemplaza malachiteingestion-pa.googleapis.com por tu extremo regional (por ejemplo, europe-malachiteingestion-pa.googleapis.com).

    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:
    

Reinicia el agente de Bindplane para aplicar los cambios.

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

    net stop BindPlaneAgent && net start BindPlaneAgent
    

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

Puedes habilitar la auditoría de SQL Server con la GUI de SQL Server Management Studio (SSMS) o con comandos de T-SQL. Elige la opción que mejor se adapte a tu entorno.

Opción 1: Habilita la auditoría de SQL Server a través de la GUI de SSMS

Crea una auditoría del servidor en la IU 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, expande tu instancia de servidor.
  3. Expande la carpeta Security.
  4. Haz clic con el botón derecho en Audits y selecciona New Audit.
  5. En el diálogo Crear auditoría, proporciona los siguientes detalles de configuración:
    • Nombre de la auditoría: Ingresa ChronicleAudit.
    • Retraso de la cola (en milisegundos): Ingresa 1000.
    • En falla de registro de auditoría: Selecciona Continuar.
    • Destino de la auditoría: Selecciona Registro de aplicación.
  6. Haz clic en Aceptar para crear la auditoría.
  7. En el Explorador de objetos, haz clic con el botón derecho en el ChronicleAudit recién creado y selecciona Habilitar auditoría.

Crea la especificación de auditoría del servidor a través de la GUI de SSMS

  1. En el Explorador de objetos, expande 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 Create Server Audit Specification, proporciona los siguientes detalles de configuración:
    • Nombre: Ingresa ChronicleAuditSpec.
    • Auditoría: Selecciona ChronicleAudit en el menú.
  4. En la sección Audit Action Type, haz clic en Add y selecciona los siguientes grupos de acciones de auditoría (agrega cada uno de forma individual haciendo clic en Add 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.

Verifica la configuración de auditoría

  1. En el Explorador de objetos, expande Seguridad > Auditorías.
  2. Haz clic con el botón derecho en ChronicleAudit y selecciona Propiedades.
  3. Verifica que el Estado se muestre como 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 se muestren los ocho grupos de acciones de auditoría y que la especificación esté habilitada.

Opción 2: Habilita la auditoría de SQL Server con 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 de 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 capturar los eventos de seguridad pertinentes:

    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 garantiza que los eventos de autenticación, los cambios de permisos y las modificaciones de objetos se registren en el registro de eventos de Windows.

Instala y configura 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 ubicado en:

    C:\Program Files\nxlog\conf\nxlog.conf
    
  4. Reemplaza 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>
    
    • Reemplaza 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 udplog de Bindplane que configuraste anteriormente.
  5. Guarda el archivo y reinicia el servicio de 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 registros como Starting up database o Log was backed up.
AgentDevice additional.fields Se agrega como un par clave-valor a additional.fields con la clave "AgentDevice".
AgentLogFile additional.fields Se agregó como un 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 concatenó con agent.type para formar observer.asset_id.
agent.type observer.asset_id Se concatenó 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 Se asigna a la aplicación de destino.
client_address principal.ip Se usa para la IP principal si es diferente del host y no es una canalización local o con nombre.
client_ip principal.ip Se asigna a la IP de la principal.
computer_name about.hostname Se asigna al nombre de host de About.
correlationId security_result.detection_fields Se agrega como un 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 Se convirtieron de milisegundos a segundos y se asignaron.
ecs.version metadata.product_version Se asigna a la versión del producto.
error security_result.detection_fields Se agrega como un par clave-valor a security_result.detection_fields con la clave "error".
err_msg security_result.description Se asigna a la descripción del resultado de seguridad.
EventID metadata.product_event_type Se usa para construir el tipo de evento de producto si no hay otros campos disponibles, con el prefijo "EventID: ".
event.action Source Se usa como fuente si está presente.
event.code metadata.product_event_type Se combina con event.provider para formar metadata.product_event_type.
event.provider metadata.product_event_type Se combina con event.code para formar metadata.product_event_type.
EventReceivedTime metadata.ingested_timestamp Se analiza y se usa como marca de tiempo de transferencia.
event_time metadata.event_timestamp Se analiza y se usa como marca de tiempo del evento.
file_name principal.process.file.full_path Se asigna a la ruta de acceso completa del archivo de proceso principal.
file_path target.file.full_path Se usa para la ruta de acceso completa del archivo de destino si se encuentra en los registros de copia de seguridad.
first_lsn target.resource.attribute.labels Se agrega como un 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 del observador si no es una IP. También se usa para el nombre de host o la IP de destino, según si se trata de una IP o no.
host.ip principal.ip Se combinó con 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 agrega como un 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 agrega como un 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 Se asigna a la versión principal de la plataforma.
last_lsn target.resource.attribute.labels Se agrega como un par clave-valor a target.resource.attribute.labels con la clave "Último LSN".
level security_result.severity Si es "Informativo", establece security_result.severity como "INFORMATIONAL".
log.level security_result.severity_details Se asigna a los detalles de gravedad del resultado 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 acceso.
logstash.process.host intermediary.hostname Se asigna al nombre de host intermedio.
Message metadata.description, security_result.description Se usa para la descripción del evento o 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 Se asigna al 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 Se asigna al tipo de recurso de destino.
operationId security_result.detection_fields Se agrega como un par clave-valor a security_result.detection_fields con la clave "operationId".
operationName metadata.product_event_type Se asigna al tipo de evento del producto.
operationVersion additional.fields Se agrega como un par clave-valor a additional.fields con la clave "operationVersion".
ProcessInfo additional.fields Se agrega como un par clave-valor a additional.fields con la clave "ProcessInfo".
properties.apiVersion metadata.product_version Se asigna a la versión del producto.
properties.appId target.resource.product_object_id Se asigna al ID del 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 agrega como un par clave-valor a additional.fields con la clave "clientRequestId".
properties.durationMs network.session_duration.seconds Se convirtieron en segundos y se asignaron.
properties.identityProvider security_result.detection_fields Se agrega como un 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 Se asigna al nombre de la ubicación principal.
properties.operationId security_result.detection_fields Se agrega como un 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 Es el mapa de la URL de destino.
properties.responseSizeBytes network.received_bytes Se convierte en un número entero sin firma y se asigna.
properties.responseStatusCode network.http.response_code Se convirtió en un número entero y se asignó.
properties.roles additional.fields Se agrega como un par clave-valor a additional.fields con la clave "roles".
properties.servicePrincipalId principal.user.userid Se usa para el ID de usuario principal si properties.userId no está presente.
properties.signInActivityId network.session_id Se asigna al 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 agrega como un par clave-valor a additional.fields con la clave "tokenIssuedAt".
properties.userAgent network.http.user_agent Se asigna al usuario-agente HTTP de red.
properties.userId principal.user.userid Se usa para el ID de usuario principal si está presente.
properties.wids security_result.detection_fields Se agrega como un 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 los eventos de acceso.
resourceId target.resource.attribute.labels Se agrega como un par clave-valor a target.resource.attribute.labels con la clave "ID de recurso".
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 Se asigna directamente si está presente. Se establece en "LOW" para los registros de KV, en "INFORMATIONAL" para ciertos mensajes de error y se deriva de los campos level o Severity.
security_result.severity_details security_result.severity_details Se asigna directamente si está presente.
security_result.summary security_result.summary Se asigna directamente si está presente. Se establece en "Conexión realizada con la autenticación de Windows" o en motivos específicos de los eventos de acceso, o en "Registro de auditoría de SQL Server" para los eventos de auditoría.
security_result_action security_result.action Se combinó con security_result.action. Se establece en "ALLOW" para la mayoría de los eventos y se deriva de login_result para los eventos de acceso.
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 construir el ID del activo 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 agrega como un par clave-valor a additional.fields con la clave "Source".
source principal.resource.attribute.labels Se agrega como un par clave-valor a principal.resource.attribute.labels con la clave "source".
SourceModuleType observer.application Se asigna a la aplicación del observador.
SourceModuleName additional.fields Se agrega como un par clave-valor a additional.fields con la clave "SourceModuleName".
source_module_name observer.labels Se agrega como un par clave-valor a observer.labels con la clave "SourceModuleName".
source_module_type observer.application Se asigna a la aplicación del observador.
SPID network.session_id Se asigna al 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 acceso, 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 agrega como un 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 en 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 Está codificado como "MICROSOFT_SQL".
metadata.vendor_name metadata.vendor_name Está codificado como "Microsoft".
metadata.product_name metadata.product_name Se codifica como "SQL Server".
metadata.event_type metadata.event_type Se establece en varios valores según el contenido del registro, incluidos "USER_LOGIN", "USER_LOGOUT", "STATUS_STARTUP", "STATUS_SHUTDOWN", "NETWORK_HTTP", "GENERIC_EVENT" y "STATUS_UNCATEGORIZED" como predeterminado.
extensions.auth.type extensions.auth.type Se establece en "MACHINE" para los eventos de acceso y salida.

Registro de cambios

Consulta el registro de cambios de este analizador

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.