Coletar registros do IBM DB2
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
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Agente de coleta.
- Clique em Fazer o download para baixar o arquivo de autenticação de ingestão.
Salve o arquivo com segurança no sistema em que o agente do Bindplane será instalado.
Receber o ID de cliente do Google SecOps
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Perfil.
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
- Abra o prompt de comando ou o PowerShell como administrador.
Execute este comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietAguarde a conclusão da instalação.
Execute o seguinte comando para confirmar a instalação:
sc query observiq-otel-collectorO serviço vai aparecer como EM EXECUÇÃO.
Instalação do Linux
- Abra um terminal com privilégios de root ou sudo.
Execute este comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shAguarde a conclusão da instalação.
Execute o seguinte comando para confirmar a instalação:
sudo systemctl status observiq-otel-collectorO 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.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Editar o arquivo de configuração
Substitua todo o conteúdo de
config.yamlpela 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_auditSubstitua os seguintes marcadores de posição:
Configuração do receptor:
listen_address: defina como0.0.0.0:1514para 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
- Linux:
customer_id: ID do cliente da etapa anteriorendpoint: 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.
- EUA:
log_type: definido comoDB2_DBingestion_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,EntereCtrl+X. - Windows: clique em Arquivo > Salvar.
- Linux: pressione
Reinicie o agente do Bindplane para aplicar as mudanças
Linux
sudo systemctl restart observiq-otel-collectorVerifique se o serviço está em execução:
sudo systemctl status observiq-otel-collectorVerifique 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-collectorUsando o console do Services:
- Pressione
Win+R, digiteservices.msce pressione Enter. - Localize o Coletor do OpenTelemetry da observIQ.
- Clique com o botão direito do mouse e selecione Reiniciar.
Verifique se o serviço está em execução:
sc query observiq-otel-collectorVerifique se há erros nos registros:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Pressione
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 describeIsso mostra a configuração de auditoria atual, incluindo status, categorias e caminhos.
Configurar caminhos de auditoria
Defina os diretórios em que os registros de auditoria serão armazenados:
db2audit configure datapath /db2audit/data db2audit configure archivepath /db2audit/archiveVerifique 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 normalIsso 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
Comece a auditoria:
db2audit startVerifique se a auditoria está ativa:
db2audit describeA 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)
Edite o arquivo de configuração do rsyslog:
sudo nano /etc/rsyslog.confAdicione a seguinte linha para encaminhar mensagens de auditoria do DB2 a um arquivo dedicado:
user.info /var/log/db2/db2audit.logCrie 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.logReinicie o rsyslog:
sudo systemctl restart rsyslog
AIX (syslogd)
Edite o arquivo de configuração do syslog:
sudo vi /etc/syslog.confAdicione a linha abaixo:
user.info /var/log/db2/db2audit.logCrie 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.logReinicie 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 archiveO 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
usere prioridadeinfo. - O daemon syslog encaminha as mensagens de acordo com
/etc/syslog.confou/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.logVocê 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.
Crie um arquivo de configuração do rsyslog:
sudo nano /etc/rsyslog.d/50-db2-forward.confAdicione a seguinte configuração para encaminhar registros ao agente do Bindplane:
# Forward DB2 audit logs to Bindplane agent user.info @@127.0.0.1:1514O prefixo
@@indica o encaminhamento de TCP. Use@para UDP, se necessário.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
Crie um script para automatizar a extração de registros de auditoria:
sudo nano /usr/local/bin/db2audit-extract.shAdicione 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 0Torne o script executável:
sudo chmod +x /usr/local/bin/db2audit-extract.sh
Programar com cron
Programe a execução periódica do script usando o cron:
sudo crontab -eAdicione 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>&1Ou 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
- Faça login no console do Google SecOps.
- Acesse Pesquisar.
Execute uma consulta de pesquisa para verificar se os registros do DB2 estão sendo ingeridos:
metadata.log_type = "DB2_DB"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.