Recopila registros de Microsoft SQL Server
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 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 sobre el contexto y la gravedad.Recopila los registros de auditoría y de errores de SQL Server del registro de eventos de Windows con un reenvío de syslog (NXLog) y los envía al agente de BindPlane para que se entreguen a Google SecOps.
Antes de comenzar
Asegúrate de cumplir con 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 administrativo 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 el archivo de autenticación de transferencia de Google SecOps
- Accede a la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recopilación.
- Descarga el archivo de autenticación de transferencia. Guarda el archivo de forma segura en el sistema en el que se instalará BindPlane.
Obtén el ID de cliente de Google SecOps
- Accede a la consola de Google SecOps.
- Ve a Configuración de SIEM > Perfil.
- 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
- Abre el símbolo del sistema o PowerShell como administrador.
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 obtener más opciones de instalación, consulta la guía de instalación.
Configura el agente de BindPlane para transferir Syslog y enviarlo a Google SecOps
- 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,vio Bloc de notas).
- Ubica el archivo
Edita el archivo
config.yamlde 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- Reemplaza el puerto y la dirección IP según sea necesario en tu infraestructura.
- Reemplaza
<customer_id>por el ID de cliente real. - Actualiza
/path/to/ingestion-authentication-file.jsona la ruta de acceso en la que se guardó el archivo de autenticación en la sección Cómo obtener el archivo de autenticación de la transferencia de Google SecOps.
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
- Abre SQL Server Management Studio (SSMS) y conéctate a tu instancia de SQL Server.
- En el Explorador de objetos, expande la instancia del servidor.
- Expande la carpeta Security.
- Haz clic con el botón derecho en Audits y selecciona New Audit.
- En el diálogo Crear auditoría, proporciona los siguientes detalles de configuración:
- Nombre de la auditoría: Ingresa
ChronicleAudit. - Demora en 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.
- Nombre de la auditoría: Ingresa
- Haz clic en Aceptar para crear la auditoría.
- En el Explorador de objetos, haz clic con el botón derecho en el objeto 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
- En Explorador de objetos, expande Seguridad.
- Haz clic con el botón derecho en Especificaciones de auditoría del servidor y selecciona Nueva especificación de auditoría del servidor.
- En el diálogo Crear especificación de auditoría del servidor, proporciona los siguientes detalles de configuración:
- Nombre: Ingresa
ChronicleAuditSpec. - Auditoría: Selecciona ChronicleAudit en el menú.
- Nombre: Ingresa
- En la sección Audit Action Type, haz clic en Agregar y selecciona los siguientes grupos de acciones de auditoría (agrega cada uno de forma individual haciendo clic en Agregar 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
- Haz clic en Aceptar para crear la especificación de auditoría.
- En el Explorador de objetos, haz clic con el botón derecho en el objeto ChronicleAuditSpec recién creado y selecciona Habilitar especificación de auditoría del servidor.
Verifica la configuración de auditoría
- En el Explorador de objetos, expande Seguridad > Auditorías.
- Haz clic con el botón derecho en ChronicleAudit y selecciona Propiedades.
- Verifica que el Estado se muestre como Iniciado o Habilitado.
- Expande Seguridad > Especificaciones de auditoría del servidor.
- Haz clic con el botón derecho en ChronicleAuditSpec y selecciona Propiedades.
- 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
- Abre SQL Server Management Studio (SSMS) y conéctate a tu instancia de SQL Server.
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); GOCrea 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
- Descarga NXLog Community Edition desde nxlog.co/downloads.
- Ejecuta el instalador y completa el asistente de instalación.
Abre el archivo de configuración de NXLog ubicado en:
C:\Program Files\nxlog\conf\nxlog.confReemplaza el contenido con 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.1por la dirección IP del agente de Bindplane. - Asegúrate de que el valor de Puerto coincida con el puerto del receptor
udplogde Bindplane que configuraste anteriormente.
- Reemplaza el valor actual de Host
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 agregó 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 |
Es el mapa de 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 principal. |
computer_name |
about.hostname |
Se asigna al nombre de host de About. |
correlationId |
security_result.detection_fields |
Se agregó 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 recurso superior de destino si está presente en los registros de auditoría. |
durationMs |
network.session_duration.seconds |
Se convierte de milisegundos a segundos y se asigna. |
ecs.version |
metadata.product_version |
Asigna la versión del producto. |
error |
security_result.detection_fields |
Se agregó 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 del 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 combinó con event.provider para formar metadata.product_event_type. |
event.provider |
metadata.product_event_type |
Se combinó con event.code para formar metadata.product_event_type. |
EventReceivedTime |
metadata.ingested_timestamp |
Se analiza y se usa como marca de tiempo transferida. |
event_time |
metadata.event_timestamp |
Se analiza y se usa como marca de tiempo del evento. |
file_name |
principal.process.file.full_path |
Asigna el proceso principal a la ruta de acceso completa del archivo. |
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 copias de seguridad. |
first_lsn |
target.resource.attribute.labels |
Se agregó 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 de la 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 de hardware del activo principal. |
hostinfo.os.build |
additional.fields |
Se agregó 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 |
Se escribe en mayúsculas y se asigna 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 agregó como un par clave-valor a target.resource.attribute.labels con la clave "Last LSN". |
level |
security_result.severity |
Si es "Informativo", establece security_result.severity como "INFORMATIONAL". |
log.level |
security_result.severity_details |
Es un mapa que asigna la gravedad a los detalles 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 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 |
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 agregó 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 |
Asigna la versión del producto. |
properties.appId |
target.resource.product_object_id |
Se asigna al ID del objeto del 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 convierte a segundos y se asigna. |
properties.identityProvider |
security_result.detection_fields |
Se agregó como un par clave-valor a security_result.detection_fields con la clave "identityProvider". |
properties.ipAddress |
principal.ip, principal.asset.ip |
Se analizó para obtener la IP y se combinó con la IP principal y la IP del activo principal. |
properties.location |
principal.location.name |
Se asigna al nombre de la ubicación principal. |
properties.operationId |
security_result.detection_fields |
Se agregó como un par clave-valor a security_result.detection_fields con la clave "operationId". |
properties.requestId |
metadata.product_log_id |
Es el ID del 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 segmentación. |
properties.responseSizeBytes |
network.received_bytes |
Se convirtió a un número entero sin signo y se asignó. |
properties.responseStatusCode |
network.http.response_code |
Se convierte en un número entero y se asigna. |
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 no está presente properties.userId. |
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 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 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 eventos de acceso. |
resourceId |
target.resource.attribute.labels |
Se agregó 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 recurso superior 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 autenticación de Windows" o en motivos específicos de los eventos de acceso, o bien 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 agregó 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 |
Es el mapa de 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 |
Es el mapa de 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 |
Se codifica de forma rígida como "MICROSOFT_SQL". |
metadata.vendor_name |
metadata.vendor_name |
Se codifica de forma rígida como "Microsoft". |
metadata.product_name |
metadata.product_name |
Está codificado 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 valor predeterminado. |
extensions.auth.type |
extensions.auth.type |
Se establece en "MACHINE" para los eventos de acceso y salida. |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.