Recoger registros de Microsoft SQL Server
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
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recogida.
- 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
- Inicia sesión en 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.
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
- 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 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
- 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).
- Busca el archivo
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
- Sustituye el puerto y la dirección IP según sea necesario en tu infraestructura.
- Sustituye
<customer_id>
por el ID de cliente real. - Actualiza
/path/to/ingestion-authentication-file.json
a la ruta en la que se guardó el archivo de autenticación en la sección Obtener el archivo de autenticación de ingestión de Google SecOps.
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
- Abre SQL Server Management Studio (SSMS) y conéctate a tu instancia de SQL Server.
- En el Explorador de objetos, despliega la instancia del servidor.
- Despliega la carpeta Seguridad.
- Haz clic con el botón derecho en Auditorías y selecciona Nueva auditoría.
- 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.
- Nombre de la auditoría: introduce
- Haz clic en Aceptar para crear la auditoría.
- 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
- En el Explorador de objetos, expanda 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 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ú.
- Nombre: escribe
- 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
- 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 ChronicleAuditSpec que acabas de crear y selecciona Habilitar especificación de auditoría del servidor.
Verificar la configuración de auditoría
- En el Explorador de objetos, expanda Seguridad > Auditorías.
- Haz clic con el botón derecho en ChronicleAudit y selecciona Propiedades.
- Comprueba que el Estado sea 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 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
- 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); GO
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
- 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, que se encuentra en:
C:\Program Files\nxlog\conf\nxlog.conf
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.
- Sustituye el valor actual de Host
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.