Recopila registros de IBM DB2

Se admite en los siguientes sistemas operativos:

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

  1. Accede a la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Agente de recopilación.
  3. Haz clic en Descargar para descargar el archivo de autenticación de la 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 siguiente comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. Espera a que se complete la instalación.

  4. Ejecute el siguiente comando para verificar la instalación:

    sc query observiq-otel-collector
    

    El servicio debería mostrarse como RUNNING.

Instalación en Linux

  1. Abre una terminal con privilegios de administrador o sudo.
  2. Ejecuta el siguiente comando:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. Espera a que se complete la instalación.

  4. Ejecute el siguiente comando para verificar la instalación:

    sudo systemctl status observiq-otel-collector
    

    El 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.yaml
    
  • Windows:

    notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
    

Edita el archivo de configuración

  1. Reemplaza todo el contenido de config.yaml con 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_audit
    
  2. Reemplaza los marcadores de posición que se indican más abajo:

    • Configuración del receptor:

      • listen_address: Se establece en 0.0.0.0:1514 para 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
      • customer_id: ID de cliente del paso anterior

      • endpoint: 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.
      • log_type: Establecer en DB2_DB

      • ingestion_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, luego Enter y, después, Ctrl+X.
    • Windows: Haz clic en Archivo > Guardar

Reinicia el agente de Bindplane para aplicar los cambios

  • Linux

    sudo systemctl restart observiq-otel-collector
    
    1. Verifica que el servicio esté en ejecución:

      sudo systemctl status observiq-otel-collector
      
    2. Revisa 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-collector
      
    • Usa la consola de Services:

      1. Presiona Win+R, escribe services.msc y presiona Intro.
      2. Busca observIQ OpenTelemetry Collector.
      3. Haz clic con el botón derecho y selecciona Reiniciar.
      4. Verifica que el servicio esté en ejecución:

        sc query observiq-otel-collector
        
      5. Revisa los registros en busca de errores:

        type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
        

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 describe
    

    Se 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

  1. Establece los directorios en los que se almacenarán los registros de auditoría:

    db2audit configure datapath /db2audit/data
    db2audit configure archivepath /db2audit/archive
    
  2. Asegú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 normal
    

    Esto 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 fallaron
    • errortype normal: Manejo de errores estándar

Cómo iniciar la función de auditoría

  1. Para comenzar la auditoría, haz lo siguiente:

    db2audit start
    
  2. Verifica que la auditoría esté activa:

    db2audit describe
    

    El 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)

  1. Edita el archivo de configuración de rsyslog:

    sudo nano /etc/rsyslog.conf
    
  2. Agrega la siguiente línea para enrutar los mensajes de auditoría de DB2 a un archivo dedicado:

    user.info /var/log/db2/db2audit.log
    
  3. Crea 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.log
    
  4. Reinicia rsyslog:

    sudo systemctl restart rsyslog
    

AIX (syslogd)

  1. Edita el archivo de configuración de syslog:

    sudo vi /etc/syslog.conf
    
  2. Agrega la siguiente línea:

    user.info /var/log/db2/db2audit.log
    
  3. Crea 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.log
    
  4. Reinicia 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 archive
    

    El 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 user y la prioridad info.
    • El daemon de syslog enruta los mensajes según /etc/syslog.conf o /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.log
    

    Deberí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.

  1. Crea un nuevo archivo de configuración de rsyslog:

    sudo nano /etc/rsyslog.d/50-db2-forward.conf
    
  2. Agrega la siguiente configuración para reenviar registros al agente de Bindplane:

    # Forward DB2 audit logs to Bindplane agent
    user.info @@127.0.0.1:1514
    

    El prefijo @@ indica el reenvío de TCP. Usa @ para UDP si es necesario.

  3. 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

  1. Crea una secuencia de comandos para automatizar la extracción de registros de auditoría:

    sudo nano /usr/local/bin/db2audit-extract.sh
    
  2. Agrega 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 0
    
  3. Haz que la secuencia de comandos sea ejecutable:

    sudo chmod +x /usr/local/bin/db2audit-extract.sh
    

Programa tareas con cron

  1. Programa la secuencia de comandos para que se ejecute periódicamente con cron:

    sudo crontab -e
    
  2. Agrega 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>&1
    

    O 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

  1. Accede a la consola de Google SecOps.
  2. Ve a Buscar.
  3. Ejecuta una búsqueda para verificar que se transfieran los registros de DB2:

    metadata.log_type = "DB2_DB"
    
  4. 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.