Coletar registros do IBM DB2

Compatível com:

Este documento explica como ingerir registros do IBM DB2 no Google Security Operations usando o agente do Bindplane.

O IBM Db2 é um sistema de gerenciamento de banco de dados relacional que oferece um recurso de auditoria para ajudar na detecção de acesso desconhecido ou inesperado aos dados. O recurso de auditoria do Db2 gera e permite a manutenção de um rastreamento de auditoria para uma série de eventos predefinidos do banco de dados.

Antes de começar

Verifique se você tem os pré-requisitos a seguir:

  • Uma instância do Google SecOps
  • Windows Server 2016 ou mais recente ou host Linux com systemd
  • Conectividade de rede entre o agente do Bindplane e a instância do IBM DB2
  • Se você estiver executando por trás de um proxy, verifique se as portas do firewall estão abertas de acordo com os requisitos do agente do Bindplane.
  • Instância do IBM DB2 (versão 11.1 ou mais recente) com privilégios SYSADM
  • Espaço em disco suficiente para armazenamento e arquivamento de registros de auditoria

Receber o arquivo de autenticação de ingestão do Google SecOps

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Agente de coleta.
  3. Clique em Fazer o download para baixar o arquivo de autenticação de ingestão.
  4. Salve o arquivo com segurança no sistema em que o agente do Bindplane será instalado.

Receber o ID de cliente do Google SecOps

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Perfil.
  3. Copie e salve o ID do cliente na seção Detalhes da organização.

Instalar o agente do BindPlane

Instale o agente do Bindplane no seu sistema operacional Windows ou Linux de acordo com as instruções a seguir.

Instalação do Windows

  1. Abra o prompt de comando ou o PowerShell como administrador.
  2. Execute este comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. Aguarde a conclusão da instalação.

  4. Execute o seguinte comando para confirmar a instalação:

    sc query observiq-otel-collector
    

    O serviço vai aparecer como EM EXECUÇÃO.

Instalação do Linux

  1. Abra um terminal com privilégios de root ou sudo.
  2. Execute este comando:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. Aguarde a conclusão da instalação.

  4. Execute o seguinte comando para confirmar a instalação:

    sudo systemctl status observiq-otel-collector
    

    O serviço vai aparecer como ativo (em execução).

Outros recursos de instalação

Para mais opções de instalação e solução de problemas, consulte o guia de instalação do agente do Bindplane.

Configurar o agente do Bindplane para ingerir syslog e enviar ao Google SecOps

Localizar o arquivo de configuração

  • Linux:

    sudo nano /opt/observiq-otel-collector/config.yaml
    
  • Windows:

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

Editar o arquivo de configuração

  1. Substitua todo o conteúdo de config.yaml pela seguinte configuração:

    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. Substitua os seguintes marcadores de posição:

    • Configuração do receptor:

      • listen_address: defina como 0.0.0.0:1514 para detectar todas as interfaces na porta 1514 (porta não privilegiada recomendada para Linux).
    • Configuração do exportador:

      • creds_file_path: caminho completo para o arquivo de autenticação de ingestão:

        • Linux: /opt/observiq-otel-collector/ingestion-auth.json
        • Windows: C:\\Program Files\\observIQ OpenTelemetry Collector\\ingestion-auth.json
      • customer_id: ID do cliente da etapa anterior

      • endpoint: URL do endpoint regional:

        • EUA: malachiteingestion-pa.googleapis.com
        • Europa: europe-malachiteingestion-pa.googleapis.com
        • Ásia: asia-southeast1-malachiteingestion-pa.googleapis.com
        • Consulte a lista completa em Endpoints regionais.
      • log_type: definido como DB2_DB

      • ingestion_labels: rótulos opcionais no formato YAML (por exemplo, env: production)

Salvar o arquivo de configuração

  • Depois de editar, salve o arquivo:

    • Linux: pressione Ctrl+O, Enter e Ctrl+X.
    • Windows: clique em Arquivo > Salvar.

Reinicie o agente do Bindplane para aplicar as mudanças

  • Linux

    sudo systemctl restart observiq-otel-collector
    
    1. Verifique se o serviço está em execução:

      sudo systemctl status observiq-otel-collector
      
    2. Verifique se há erros nos registros:

      sudo journalctl -u observiq-otel-collector -f
      
  • Windows

    Escolha uma das seguintes opções:

    • Usando o prompt de comando ou o PowerShell como administrador:

      net stop observiq-otel-collector && net start observiq-otel-collector
      
    • Usando o console do Services:

      1. Pressione Win+R, digite services.msc e pressione Enter.
      2. Localize o Coletor do OpenTelemetry da observIQ.
      3. Clique com o botão direito do mouse e selecione Reiniciar.
      4. Verifique se o serviço está em execução:

        sc query observiq-otel-collector
        
      5. Verifique se há erros nos registros:

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

Configurar o recurso de auditoria do IBM DB2

Configure o recurso de auditoria do DB2 para capturar eventos de segurança e extraí-los para o syslog.

Verificar a configuração de auditoria atual

  • Conecte-se à sua instância do DB2 como um usuário com autoridade SYSADM e execute:

    db2audit describe
    

    Isso mostra a configuração de auditoria atual, incluindo status, categorias e caminhos.

Configurar caminhos de auditoria

  1. Defina os diretórios em que os registros de auditoria serão armazenados:

    db2audit configure datapath /db2audit/data
    db2audit configure archivepath /db2audit/archive
    
  2. Verifique se esses diretórios existem e têm as permissões adequadas para o proprietário da instância do DB2:

    mkdir -p /db2audit/data /db2audit/archive
    chown db2inst1:db2iadm1 /db2audit/data /db2audit/archive
    chmod 750 /db2audit/data /db2audit/archive
    

Configurar o escopo e as categorias de auditoria

  • Configure o recurso de auditoria para capturar todos os eventos de segurança:

    db2audit configure scope all status both errortype normal
    

    Isso configura:

    • scope all: audita todas as categorias (audit, checking, objmaint, secmaint, sysadmin, validate, context).
    • status both: captura eventos bem-sucedidos e com falha.
    • errortype normal: tratamento de erros padrão

Iniciar o recurso de auditoria

  1. Comece a auditoria:

    db2audit start
    
  2. Verifique se a auditoria está ativa:

    db2audit describe
    

    A saída precisa mostrar Audit active: "TRUE".

Configurar o syslog para receber registros de auditoria do DB2

Configure o daemon syslog do sistema para receber e armazenar mensagens de auditoria do DB2.

Linux (rsyslog)

  1. Edite o arquivo de configuração do rsyslog:

    sudo nano /etc/rsyslog.conf
    
  2. Adicione a seguinte linha para encaminhar mensagens de auditoria do DB2 a um arquivo dedicado:

    user.info /var/log/db2/db2audit.log
    
  3. Crie o diretório e o arquivo de registros:

    sudo mkdir -p /var/log/db2
    sudo touch /var/log/db2/db2audit.log
    sudo chmod 640 /var/log/db2/db2audit.log
    
  4. Reinicie o rsyslog:

    sudo systemctl restart rsyslog
    

AIX (syslogd)

  1. Edite o arquivo de configuração do syslog:

    sudo vi /etc/syslog.conf
    
  2. Adicione a linha abaixo:

    user.info /var/log/db2/db2audit.log
    
  3. Crie o diretório e o arquivo de registros:

    sudo mkdir -p /var/log/db2
    sudo touch /var/log/db2/db2audit.log
    sudo chmod 640 /var/log/db2/db2audit.log
    
  4. Reinicie o syslogd:

    sudo refresh -s syslogd
    

Extrair registros de auditoria do DB2 para syslog

Extraia os registros de auditoria arquivados e envie-os para o daemon syslog do sistema.

Limpar e arquivar registros de auditoria

  • Antes da extração, limpe todos os registros de auditoria pendentes e arquive o registro de auditoria atual:

    db2audit flush
    db2audit archive
    

    O comando de arquivamento cria arquivos com carimbo de data/hora no caminho de arquivamento (por exemplo, db2audit.instance.log.0.20250110123456).

Extrair registros de auditoria para syslog

  • Extraia os registros de auditoria arquivados e envie-os para o syslog usando a instalação e a prioridade user.info:

    db2audit extract syslog user.info from files /db2audit/archive/db2audit.instance.log.0.*
    

    Esse comando:

    • Extrai registros de auditoria dos arquivos de registros arquivados.
    • Envia para o daemon syslog do sistema com facilidade user e prioridade info.
    • O daemon syslog encaminha as mensagens de acordo com /etc/syslog.conf ou /etc/rsyslog.conf.

Verificar se os registros estão sendo enviados

  • Verifique se as mensagens de auditoria estão sendo gravadas no arquivo syslog:

    tail -f /var/log/db2/db2audit.log
    

    Você vai notar registros de auditoria do DB2 aparecendo no arquivo de registro.

Configurar o rsyslog para encaminhar registros ao agente do Bindplane

Configure o rsyslog para encaminhar registros de auditoria do DB2 ao agente do Bindplane.

  1. Crie um arquivo de configuração do rsyslog:

    sudo nano /etc/rsyslog.d/50-db2-forward.conf
    
  2. Adicione a seguinte configuração para encaminhar registros ao agente do Bindplane:

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

    O prefixo @@ indica o encaminhamento de TCP. Use @ para UDP, se necessário.

  3. Reinicie o rsyslog:

    sudo systemctl restart rsyslog
    

Automatizar a extração de registros de auditoria

Crie um script para automatizar o processo de limpeza, arquivamento e extração.

Criar script de extração

  1. Crie um script para automatizar a extração de registros de auditoria:

    sudo nano /usr/local/bin/db2audit-extract.sh
    
  2. Adicione o seguinte conteúdo:

    #!/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. Torne o script executável:

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

Programar com cron

  1. Programe a execução periódica do script usando o cron:

    sudo crontab -e
    
  2. Adicione a seguinte linha para executar o script a cada hora:

    Escolha uma das seguintes opções:

    0 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1
    

    Ou execute a cada 15 minutos para uma extração mais frequente:

    */15 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1
    

Verificar a ingestão de registros no Google SecOps

  1. Faça login no console do Google SecOps.
  2. Acesse Pesquisar.
  3. Execute uma consulta de pesquisa para verificar se os registros do DB2 estão sendo ingeridos:

    metadata.log_type = "DB2_DB"
    
  4. Verifique se os registros aparecem com o carimbo de data/hora e os campos corretos.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
msg event.idm.read_only_udm.additional.fields Valor extraído de msg se msg != ""
Sistema event.idm.read_only_udm.additional.fields Valor extraído do sistema se System != ""
Subsistema event.idm.read_only_udm.additional.fields Valor extraído do Subsystem se Subsystem != ""
auth_mechanism event.idm.read_only_udm.extensions.auth.mechanism Definido como "USERNAME_PASSWORD" para eventos USER_LOGIN
CorrelationUser event.idm.read_only_udm.intermediary.user.userid Valor extraído de CorrelationUser se CorrelationUser != ""
soma event.idm.read_only_udm.metadata.description Valor extraído da soma
date_time event.idm.read_only_udm.metadata.event_timestamp Convertido de campos de data e hora para o formato ISO8601 se ambos != ""
leef_event_id event.idm.read_only_udm.metadata.product_event_type Valor extraído de leef_event_id
event.idm.read_only_udm.metadata.event_type Derivado de leef_event_id: se estiver em ["102-87", "102-83"] → USER_LOGIN; se estiver em ["102-6", "102-7", "102-8", "102-10", "102-24", "102-143"] → USER_RESOURCE_ACCESS ou USER_RESOURCE_UPDATE_CONTENT com base na intenção; se for "102-319" → USER_RESOURCE_ACCESS; caso contrário, GENERIC_EVENT
event.idm.read_only_udm.metadata.product_name Definido como "DB2"
event.idm.read_only_udm.metadata.vendor_name Definido como "IBM"
SSID event.idm.read_only_udm.network.session_id Valor extraído do SSID se SSID != ""
job event.idm.read_only_udm.principal.application Valor extraído do job se job != ""
sourceServiceName event.idm.read_only_udm.principal.application Valor extraído de sourceServiceName
sourceHostName event.idm.read_only_udm.principal.asset.hostname Valor extraído de sourceHostName se sourceHostName != ""
principal_ip event.idm.read_only_udm.principal.asset.ip Valor extraído de principal_ip para eventos 102-319
product_id event.idm.read_only_udm.principal.asset_id Definido como "ID do produto: %{product_id}" para eventos 102 a 319
sourceHostName event.idm.read_only_udm.principal.hostname Valor extraído de sourceHostName se sourceHostName != ""
principal_ip event.idm.read_only_udm.principal.ip Valor extraído de principal_ip para eventos 102-319
Criador event.idm.read_only_udm.principal.user.user_display_name Valor retirado do criador de conteúdo
nome event.idm.read_only_udm.principal.user.user_display_name Valor extraído do nome se name != ""
AuthenticatedUser event.idm.read_only_udm.principal.user.userid Valor extraído de AuthenticatedUser se AuthenticatedUser != ""
sourceUserName event.idm.read_only_udm.principal.user.userid Valor extraído de sourceUserName
usrName event.idm.read_only_udm.principal.user.userid Valor extraído de usrName
_action event.idm.read_only_udm.security_result.action Derivado da soma: se contiver "successful" → ALLOW; else BLOCK para eventos USER_LOGIN
deviceHostName event.idm.read_only_udm.target.asset.hostname Valor extraído de deviceHostName
conn_location3 event.idm.read_only_udm.target.asset.hostname Valor extraído de conn_location3 se conn_location3 != ""
file_name event.idm.read_only_udm.target.file.full_path Valor extraído de "file_name" se "file_name" != ""
deviceHostName event.idm.read_only_udm.target.hostname Valor extraído de deviceHostName
conn_location3 event.idm.read_only_udm.target.hostname Valor extraído de conn_location3 se conn_location3 != ""
conn_location, conn_location2 event.idm.read_only_udm.target.location.name Concatenado de conn_location e conn_location2 se ambos != ""
deviceProcessName event.idm.read_only_udm.target.process.command_line Valor extraído de deviceProcessName
SQL event.idm.read_only_udm.target.process.command_line Valor extraído do SQL se SQL != ""
Connection_Type event.idm.read_only_udm.target.resource.attribute.labels Chave "Tipo de conexão" com valor de Connection_Type
Plano event.idm.read_only_udm.target.resource.attribute.labels Chave "Plano" com valor de "Plano"
DB2_Subsystem event.idm.read_only_udm.target.resource.attribute.labels Chave "DB2 Subsystem" com valor de DB2_Subsystem
Priv_Check_Code event.idm.read_only_udm.target.resource.attribute.labels Chave "Priv Check Code" com valor de Priv_Check_Code
Table_Name event.idm.read_only_udm.target.resource.attribute.labels Chave "Nome da tabela" com valor de Table_Name
MessageType event.idm.read_only_udm.target.resource.attribute.labels Chave "Tipo de mensagem" com valor de MessageType
Check_type event.idm.read_only_udm.target.resource.attribute.labels Chave "Check Type" com valor de Check_type
deviceAction event.idm.read_only_udm.target.resource.attribute.labels Chave "Device Action" com valor mapeado de deviceAction: G → GRANT, R → REVOKE
SSID event.idm.read_only_udm.target.resource.attribute.labels Chave "SSID" com valor do SSID se o valor for diferente de ""
SQL event.idm.read_only_udm.target.resource.attribute.labels Chave "SQL Query" com valor de SQL se SQL != ""
ID da mensagem event.idm.read_only_udm.target.resource.id Valor extraído de messageid
Object_Class_Code event.idm.read_only_udm.target.resource.parent Valor extraído de Object_Class_Code
obj event.idm.read_only_udm.target.resource.name Valor extraído do objeto
resource_name event.idm.read_only_udm.target.resource.name Valor extraído de resource_name do SQL se SQL != "" e não estiver vazio
Database_Name event.idm.read_only_udm.target.resource.name Valor extraído de Database_Name
objtyp event.idm.read_only_udm.target.resource.resource_subtype Valor extraído de objtyp (em maiúsculas) se objtyp != ""
Tipo event.idm.read_only_udm.target.resource.resource_subtype Derivado de Type: T → TABLE, V → VIEW, X → AUXILIARY TABLE
event.idm.read_only_udm.target.resource.resource_type Definido como "DATABASE"

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.