Recopila registros de IBM DB2
En este documento, se explica cómo transferir registros de IBM DB2 a Google Security Operations con el agente de Bindplane.
IBM Db2 es un sistema de administración de bases de datos relacionales que proporciona una función de auditoría para ayudar a detectar el acceso desconocido o imprevisto a los datos. La función de auditoría de Db2 genera y permite el mantenimiento de un registro de auditoría para una serie de eventos de base de datos predefinidos.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Una instancia de Google SecOps
- Windows Server 2016 o versiones posteriores, o host de Linux con
systemd - Conectividad de red entre el agente de Bindplane y la instancia de IBM DB2
- 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.
- Instancia de IBM DB2 (versión 11.1 o posterior) con privilegios de SYSADM
- Espacio en disco suficiente para el almacenamiento y el archivo de registros de auditoría
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 > Agente de recopilación.
- Haz clic en Descargar para descargar el archivo de autenticación de la transferencia.
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
- 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" /quietEspera a que se complete la instalación.
Ejecute el siguiente comando para verificar la instalación:
sc query observiq-otel-collectorEl servicio debería mostrarse como RUNNING.
Instalación en Linux
- Abre una terminal con privilegios de administrador o sudo.
Ejecuta el siguiente comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shEspera a que se complete la instalación.
Ejecute el siguiente comando para verificar la instalación:
sudo systemctl status observiq-otel-collectorEl servicio debería mostrarse como activo (en ejecución).
Recursos de instalación adicionales
Para obtener más opciones de instalación y solucionar problemas, consulta la guía de instalación del agente de Bindplane.
Configura el agente de BindPlane para transferir el syslog y enviarlo a Google SecOps
Ubica el archivo de configuración
Linux:
sudo nano /opt/observiq-otel-collector/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Edita el archivo de configuración
Reemplaza todo el contenido de
config.yamlcon la siguiente configuración:receivers: tcplog: listen_address: "0.0.0.0:1514" exporters: chronicle/db2_audit: compression: gzip creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: DB2_DB raw_log_field: body ingestion_labels: env: production service: pipelines: logs/db2_to_chronicle: receivers: - tcplog exporters: - chronicle/db2_auditReemplaza los marcadores de posición que se indican más abajo:
Configuración del receptor:
listen_address: Se establece en0.0.0.0:1514para escuchar en todas las interfaces del puerto 1514 (se recomienda un puerto sin privilegios para Linux).
Configuración del exportador:
creds_file_path: Ruta de acceso completa al archivo de autenticación de la transferencia:- Linux:
/opt/observiq-otel-collector/ingestion-auth.json - Windows:
C:\\Program Files\\observIQ OpenTelemetry Collector\\ingestion-auth.json
- Linux:
customer_id: ID de cliente del paso anteriorendpoint: URL del extremo regional:- EE.UU.:
malachiteingestion-pa.googleapis.com - Europa:
europe-malachiteingestion-pa.googleapis.com - Asia:
asia-southeast1-malachiteingestion-pa.googleapis.com - Consulta Extremos regionales para obtener la lista completa.
- EE.UU.:
log_type: Establecer enDB2_DBingestion_labels: Etiquetas opcionales en formato YAML (por ejemplo,env: production)
Guarda el archivo de configuración
Después de editarlo, guarda el archivo:
- Linux: Presiona
Ctrl+O, luegoEntery, después,Ctrl+X. - Windows: Haz clic en Archivo > Guardar
- Linux: Presiona
Reinicia el agente de Bindplane para aplicar los cambios
Linux
sudo systemctl restart observiq-otel-collectorVerifica que el servicio esté en ejecución:
sudo systemctl status observiq-otel-collectorRevisa los registros en busca de errores:
sudo journalctl -u observiq-otel-collector -f
Windows
Elige una de las siguientes opciones:
Con el símbolo del sistema o PowerShell como administrador, haz lo siguiente:
net stop observiq-otel-collector && net start observiq-otel-collectorUsa la consola de Services:
- Presiona
Win+R, escribeservices.mscy presiona Intro. - Busca observIQ OpenTelemetry Collector.
- Haz clic con el botón derecho y selecciona Reiniciar.
Verifica que el servicio esté en ejecución:
sc query observiq-otel-collectorRevisa los registros en busca de errores:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Presiona
Configura la función de auditoría de IBM DB2
Configura la función de auditoría de DB2 para capturar eventos de seguridad y extraerlos al syslog.
Verifica la configuración de auditoría actual
Conéctate a tu instancia de DB2 como un usuario con autoridad de SYSADM y ejecuta el siguiente comando:
db2audit describeSe muestra la configuración de auditoría actual, incluidos el estado, las categorías y las rutas de auditoría.
Configura rutas de auditoría
Establece los directorios en los que se almacenarán los registros de auditoría:
db2audit configure datapath /db2audit/data db2audit configure archivepath /db2audit/archiveAsegúrate de que estos directorios existan y tengan los permisos adecuados para el propietario de la instancia de DB2:
mkdir -p /db2audit/data /db2audit/archive chown db2inst1:db2iadm1 /db2audit/data /db2audit/archive chmod 750 /db2audit/data /db2audit/archive
Configura el alcance y las categorías de la auditoría
Configura la función de auditoría para capturar todos los eventos de seguridad:
db2audit configure scope all status both errortype normalEsto configura lo siguiente:
scope all: Audita todas las categorías (audit, checking, objmaint, secmaint, sysadmin, validate, context).status both: Captura los eventos exitosos y los que fallaronerrortype normal: Manejo de errores estándar
Cómo iniciar la función de auditoría
Para comenzar la auditoría, haz lo siguiente:
db2audit startVerifica que la auditoría esté activa:
db2audit describeEl resultado debería mostrar
Audit active: "TRUE".
Configura syslog para recibir registros de auditoría de DB2
Configura el daemon syslog del sistema para recibir y almacenar mensajes de auditoría de DB2.
Linux (rsyslog)
Edita el archivo de configuración de rsyslog:
sudo nano /etc/rsyslog.confAgrega la siguiente línea para enrutar los mensajes de auditoría de DB2 a un archivo dedicado:
user.info /var/log/db2/db2audit.logCrea el directorio y el archivo de registro:
sudo mkdir -p /var/log/db2 sudo touch /var/log/db2/db2audit.log sudo chmod 640 /var/log/db2/db2audit.logReinicia rsyslog:
sudo systemctl restart rsyslog
AIX (syslogd)
Edita el archivo de configuración de syslog:
sudo vi /etc/syslog.confAgrega la siguiente línea:
user.info /var/log/db2/db2audit.logCrea el directorio y el archivo de registro:
sudo mkdir -p /var/log/db2 sudo touch /var/log/db2/db2audit.log sudo chmod 640 /var/log/db2/db2audit.logReinicia syslogd:
sudo refresh -s syslogd
Cómo extraer registros de auditoría de DB2 en syslog
Extrae los registros de auditoría archivados y envíalos al daemon syslog del sistema.
Cómo vaciar y archivar registros de auditoría
Antes de la extracción, vacía los registros de auditoría pendientes y archiva el registro de auditoría actual:
db2audit flush db2audit archiveEl comando de archivo crea archivos con marca de tiempo en la ruta de acceso del archivo (por ejemplo,
db2audit.instance.log.0.20250110123456).
Cómo extraer registros de auditoría a syslog
Extrae los registros de auditoría archivados y envíalos a syslog con la instalación y la prioridad
user.info:db2audit extract syslog user.info from files /db2audit/archive/db2audit.instance.log.0.*Este comando realiza las siguientes acciones:
- Extrae registros de auditoría de los archivos de registro archivados
- Los envía al daemon syslog del sistema con la instalación
usery la prioridadinfo. - El daemon de syslog enruta los mensajes según
/etc/syslog.confo/etc/rsyslog.conf.
Verifica que se envíen los registros
Verifica que los mensajes de auditoría se escriban en el archivo syslog:
tail -f /var/log/db2/db2audit.logDeberías ver registros de auditoría de DB2 en el archivo de registro.
Configura rsyslog para que reenvíe registros al agente de BindPlane
Configura rsyslog para que reenvíe los registros de auditoría de DB2 al agente de BindPlane.
Crea un nuevo archivo de configuración de rsyslog:
sudo nano /etc/rsyslog.d/50-db2-forward.confAgrega la siguiente configuración para reenviar registros al agente de Bindplane:
# Forward DB2 audit logs to Bindplane agent user.info @@127.0.0.1:1514El prefijo
@@indica el reenvío de TCP. Usa@para UDP si es necesario.Reinicia rsyslog:
sudo systemctl restart rsyslog
Automatiza la extracción de registros de auditoría
Crea una secuencia de comandos para automatizar el proceso de vaciado, archivo y extracción.
Crea un script de extracción
Crea una secuencia de comandos para automatizar la extracción de registros de auditoría:
sudo nano /usr/local/bin/db2audit-extract.shAgrega el siguiente contenido:
#!/bin/bash # DB2 Audit Log Extraction Script # Set DB2 environment export DB2INSTANCE=db2inst1 . /home/db2inst1/sqllib/db2profile # Flush pending audit records db2audit flush # Archive current audit log db2audit archive # Extract archived logs to syslog db2audit extract syslog user.info from files /db2audit/archive/db2audit.instance.log.0.* # Optional: Clean up old archived logs (older than 30 days) find /db2audit/archive -name "db2audit.instance.log.0.*" -mtime +30 -delete exit 0Haz que la secuencia de comandos sea ejecutable:
sudo chmod +x /usr/local/bin/db2audit-extract.sh
Programa tareas con cron
Programa la secuencia de comandos para que se ejecute periódicamente con cron:
sudo crontab -eAgrega la siguiente línea para ejecutar la secuencia de comandos cada hora:
Elige una de las siguientes opciones:
0 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1O bien, ejecútalo cada 15 minutos para realizar extracciones más frecuentes:
*/15 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1
Verifica la transferencia de registros en Google SecOps
- Accede a la consola de Google SecOps.
- Ve a Buscar.
Ejecuta una búsqueda para verificar que se transfieran los registros de DB2:
metadata.log_type = "DB2_DB"Verifica que los registros aparezcan con la marca de tiempo y los campos correctos.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
| msg | event.idm.read_only_udm.additional.fields | Valor tomado de msg si msg != "" |
| Sistema | event.idm.read_only_udm.additional.fields | El valor se toma del sistema si el sistema no es "". |
| Subsistema | event.idm.read_only_udm.additional.fields | Valor tomado de Subsystem si Subsystem != "" |
| auth_mechanism | event.idm.read_only_udm.extensions.auth.mechanism | Se establece en "USERNAME_PASSWORD" para los eventos de USER_LOGIN. |
| CorrelationUser | event.idm.read_only_udm.intermediary.user.userid | Valor tomado de CorrelationUser si CorrelationUser != "" |
| ponderada | event.idm.read_only_udm.metadata.description | Valor tomado de la suma |
| date_time | event.idm.read_only_udm.metadata.event_timestamp | Se convierte de campos de fecha y hora al formato ISO8601 si ambos son != "" |
| leef_event_id | event.idm.read_only_udm.metadata.product_event_type | Valor tomado de leef_event_id |
| event.idm.read_only_udm.metadata.event_type | Se deriva de leef_event_id: Si está en ["102-87", "102-83"] → USER_LOGIN; si está en ["102-6", "102-7", "102-8", "102-10", "102-24", "102-143"] → USER_RESOURCE_ACCESS o USER_RESOURCE_UPDATE_CONTENT según la intención; si es "102-319" → USER_RESOURCE_ACCESS; de lo contrario, GENERIC_EVENT | |
| event.idm.read_only_udm.metadata.product_name | Se estableció en "DB2". | |
| event.idm.read_only_udm.metadata.vendor_name | Se establece en "IBM". | |
| SSID | event.idm.read_only_udm.network.session_id | Valor tomado del SSID si SSID != "" |
| trabajo | event.idm.read_only_udm.principal.application | Valor tomado del trabajo si job != "" |
| sourceServiceName | event.idm.read_only_udm.principal.application | Valor tomado de sourceServiceName |
| sourceHostName | event.idm.read_only_udm.principal.asset.hostname | El valor se toma de sourceHostName si sourceHostName != "". |
| principal_ip | event.idm.read_only_udm.principal.asset.ip | Valor tomado de principal_ip para eventos de 102 a 319 |
| product_id | event.idm.read_only_udm.principal.asset_id | Se establece en "ID de producto: %{product_id}" para los eventos del 102 al 319. |
| sourceHostName | event.idm.read_only_udm.principal.hostname | El valor se toma de sourceHostName si sourceHostName != "". |
| principal_ip | event.idm.read_only_udm.principal.ip | Valor tomado de principal_ip para eventos de 102 a 319 |
| Creador | event.idm.read_only_udm.principal.user.user_display_name | Valor tomado del creador |
| nombre | event.idm.read_only_udm.principal.user.user_display_name | Valor tomado del nombre si name != "" |
| AuthenticatedUser | event.idm.read_only_udm.principal.user.userid | El valor se toma de AuthenticatedUser si AuthenticatedUser != "". |
| sourceUserName | event.idm.read_only_udm.principal.user.userid | Valor tomado de sourceUserName |
| usrName | event.idm.read_only_udm.principal.user.userid | Valor tomado de usrName |
| _action | event.idm.read_only_udm.security_result.action | Se deriva de la suma: Si contiene "successful" → ALLOW; de lo contrario, BLOCK para los eventos de USER_LOGIN |
| deviceHostName | event.idm.read_only_udm.target.asset.hostname | Valor tomado de deviceHostName |
| conn_location3 | event.idm.read_only_udm.target.asset.hostname | Valor tomado de conn_location3 si conn_location3 != "" |
| file_name | event.idm.read_only_udm.target.file.full_path | El valor se toma de file_name si file_name != "". |
| deviceHostName | event.idm.read_only_udm.target.hostname | Valor tomado de deviceHostName |
| conn_location3 | event.idm.read_only_udm.target.hostname | Valor tomado de conn_location3 si conn_location3 != "" |
| conn_location, conn_location2 | event.idm.read_only_udm.target.location.name | Se concatena a partir de conn_location y conn_location2 si ambos son != "" |
| deviceProcessName | event.idm.read_only_udm.target.process.command_line | Valor tomado de deviceProcessName |
| SQL | event.idm.read_only_udm.target.process.command_line | Valor tomado de SQL si SQL != "" |
| Connection_Type | event.idm.read_only_udm.target.resource.attribute.labels | Clave "Tipo de conexión" con valor de Connection_Type |
| Plan | event.idm.read_only_udm.target.resource.attribute.labels | Clave "Plan" con valor de Plan |
| DB2_Subsystem | event.idm.read_only_udm.target.resource.attribute.labels | Clave "DB2 Subsystem" con el valor de DB2_Subsystem |
| Priv_Check_Code | event.idm.read_only_udm.target.resource.attribute.labels | Clave "Priv Check Code" con el valor de Priv_Check_Code |
| Table_Name | event.idm.read_only_udm.target.resource.attribute.labels | Clave "Nombre de la tabla" con el valor de Table_Name |
| MessageType | event.idm.read_only_udm.target.resource.attribute.labels | Clave "Message Type" con valor de MessageType |
| Check_type | event.idm.read_only_udm.target.resource.attribute.labels | Clave "Check Type" con valor de Check_type |
| deviceAction | event.idm.read_only_udm.target.resource.attribute.labels | Clave "Device Action" con el valor asignado de deviceAction: G → GRANT, R → REVOKE |
| SSID | event.idm.read_only_udm.target.resource.attribute.labels | Clave "SSID" con el valor de SSID si el valor != "" |
| SQL | event.idm.read_only_udm.target.resource.attribute.labels | Clave "SQL Query" con valor de SQL si SQL != "" |
| messageid | event.idm.read_only_udm.target.resource.id | Valor tomado de messageid |
| Object_Class_Code | event.idm.read_only_udm.target.resource.parent | Valor tomado de Object_Class_Code |
| obj | event.idm.read_only_udm.target.resource.name | Valor tomado de obj |
| resource_name | event.idm.read_only_udm.target.resource.name | Valor tomado de resource_name extraído de SQL si SQL != "" y no está vacío |
| Database_Name | event.idm.read_only_udm.target.resource.name | Valor tomado de Database_Name |
| objtyp | event.idm.read_only_udm.target.resource.resource_subtype | El valor se toma de objtyp (en mayúsculas) si objtyp != "". |
| Tipo | event.idm.read_only_udm.target.resource.resource_subtype | Derivado del tipo: T → TABLE, V → VIEW, X → AUXILIARY TABLE |
| event.idm.read_only_udm.target.resource.resource_type | Se estableció en "DATABASE". |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.