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 acessos desconhecidos ou inesperados aos dados. O recurso de auditoria do Db2 gera e permite a manutenção de uma trilha 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 do 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 registro de auditoria

Receber credenciais do Google SecOps para o agente do Bindplane

Para autenticar o agente do Bindplane no Google SecOps, escolha um dos seguintes métodos:

  • Novas implantações: use a API Chronicle (opção 1).
  • Implantações legadas: continue usando o arquivo de autenticação de ingestão (opção 2) até que a API Ingestion seja descontinuada em 20 de julho de 2027.
  1. Faça login no consoleGoogle Cloud e selecione o projeto Google Cloud vinculado à sua instância do Google SecOps.
  2. Acesse IAM e administrador > Contas de serviço.
  3. Clique em Criar conta de serviço.
  4. Informe os seguintes detalhes de configuração:
    • Nome da conta de serviço: insira um nome para a conta (por exemplo, bindplane-ingest).
    • Descrição da conta de serviço: insira uma descrição (por exemplo, Bindplane agent log ingestion).
  5. Clique em Criar e continuar.
  6. Na seção Conceder a essa conta de serviço acesso ao projeto, clique em Selecionar uma função e escolha Editor do Chronicle.
  7. Clique em Continuar e depois em Concluído.
  8. Clique na conta de serviço que você criou e acesse a guia Chaves.
  9. Clique em Adicionar chave > Criar nova chave.
  10. Selecione JSON e clique em Criar. O arquivo de chave é baixado para o computador.
  11. Salve o arquivo de chave como ingestion-auth.json no diretório do coletor do Bindplane (/opt/observiq-otel-collector/ingestion-auth.json no Linux ou C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json no Windows) ou atualize creds_file_path em config.yaml para corresponder ao caminho em que você o salvou.
  12. Acesse IAM e administrador > Configurações e copie o número do projeto. Você vai precisar dele para configurar o exportador.

Opção 2: fazer o download do arquivo de autenticação de ingestão (legado)

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Agentes de coleta.
  3. Faça o download do 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 de 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 precisa aparecer como RUNNING.

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 o syslog e enviar ao Google SecOps

Localize 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:
        protocol: https
        # Region of your instance, for example us, europe, asia-southeast1
        location: <LOCATION>
        # Project number of the Google Cloud project linked to the instance
        project: '<PROJECT_NUMBER>'
        compression: gzip
        creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json'
        customer_id: 'YOUR_CUSTOMER_ID'
        endpoint: chronicle.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 sem privilégios recomendada para Linux).
    • Configuração do exportador:

      • creds_file_path: caminho completo para o arquivo de chave JSON da conta de serviço (opção 1):

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

      • location: substitua <LOCATION> pela região da sua instância do Google SecOps (por exemplo, us, europe ou asia-southeast1). O exportador prefixa chronicle.googleapis.com com esse valor. Consulte Endpoints regionais para ver a lista completa.

      • project: substitua <PROJECT_NUMBER> pelo número do projeto em IAM e administrador > Configurações.

      • endpoint: mantenha definido como chronicle.googleapis.com.

      • log_type: definido como DB2_DB

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

Exportador da API de ingestão legada

  • Se você usar o arquivo de autenticação de ingestão da Opção 2, substitua o bloco exporters pelo seguinte. Defina creds_file_path como o caminho para o arquivo de autenticação de ingestão e, se a instância estiver fora dos EUA, substitua malachiteingestion-pa.googleapis.com pelo endpoint regional (por exemplo, europe-malachiteingestion-pa.googleapis.com).

    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
    

Salve o arquivo de configuração.

  • Depois de editar, salve o arquivo:

    • Linux: pressione Ctrl+O, depois Enter e, em seguida, 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 de serviços:

      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 à 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 todas as ocorrências 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 de 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 as 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 registro:

    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 registro:

    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 o 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 o syslog

  • Extraia os registros de auditoria arquivados e envie-os para o syslog usando o recurso 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 registro arquivados
    • Envia para o daemon syslog do sistema com facilidade user e prioridade info
    • O daemon do 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
    

    Os registros de auditoria do DB2 vão aparecer no arquivo de registro.

Configurar o rsyslog para encaminhar registros ao agente do Bindplane

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

  1. Crie um novo 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 registro 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 registro 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 o script para ser executado periodicamente 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 de UDM

Campo de registro Mapeamento de 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 subsistema se o subsistema for diferente de ""
auth_mechanism event.idm.read_only_udm.extensions.auth.mechanism Defina 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 retirado 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 intent; se "102-319" → USER_RESOURCE_ACCESS; caso contrário, GENERIC_EVENT
event.idm.read_only_udm.metadata.product_name Defina como "DB2".
event.idm.read_only_udm.metadata.vendor_name Defina 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 Defina como "ID do produto: %{product_id}" para eventos 102-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; caso contrário, 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 "Connection Type" 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 o valor de Priv_Check_Code
Table_Name event.idm.read_only_udm.target.resource.attribute.labels Chave "Nome da tabela" com o 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 "Tipo de verificação" com valor de Check_type
deviceAction event.idm.read_only_udm.target.resource.attribute.labels Chave "Ação do dispositivo" com valor mapeado de deviceAction: G → GRANT, R → REVOKE
SSID event.idm.read_only_udm.target.resource.attribute.labels Chave "SSID" com valor de SSID se o valor for != ""
SQL event.idm.read_only_udm.target.resource.attribute.labels Chave "consulta SQL" 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 de obj
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 do tipo: T → TABLE, V → VIEW, X → AUXILIARY TABLE
event.idm.read_only_udm.target.resource.resource_type Defina como "DATABASE"
principal_hostname event.idm.read_only_udm.principal.asset.hostname e event.idm.read_only_udm.principal.hostname Mapeado do registro de mudanças
category event.idm.read_only_udm.security_result.category_details Mapeado do registro de mudanças
audit event event.idm.read_only_udm.metadata.product_event_type Mapeado do registro de mudanças
event correlator event.idm.read_only_udm.metadata.product_log_id Mapeado do registro de mudanças
instance name event.idm.read_only_udm.target.resource.name Mapeado do registro de mudanças
application name event.idm.read_only_udm.principal.application Mapeado do registro de mudanças
archive path event.idm.read_only_udm.target.file.full_path Mapeado do registro de mudanças
execution id event.idm.read_only_udm.principal.resource.attribute.labels Mapeado do registro de mudanças
application id event.idm.read_only_udm.principal.resource.attribute.labels Mapeado do registro de mudanças
authid event.idm.read_only_udm.principal.resource.attribute.labels Mapeado do registro de mudanças
event status event.idm.read_only_udm.security_result.detection_fields Mapeado do registro de mudanças
access attempted event.idm.read_only_udm.security_result.detection_fields Mapeado do registro de mudanças
access_approval_reason event.idm.read_only_udm.security_result.detection_fields Mapeado do registro de mudanças
timestamp_1 event.idm.read_only_udm.additional.fields Mapeado do registro de mudanças
object type event.idm.read_only_udm.additional.fields Mapeado do registro de mudanças
plugin name event.idm.read_only_udm.additional.fields Mapeado do registro de mudanças
auth type event.idm.read_only_udm.additional.fields Mapeado do registro de mudanças
System" and "Subsystem additional.fields Mapeado do registro de mudanças
ConnectionType principal.process.pid Mapeado do registro de mudanças
plan principal.resource.name Mapeado do registro de mudanças
SQL principal.process.command_line Mapeado do registro de alterações

Registro de alterações

Confira o registro de alterações deste analisador

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