Raccogliere i log IBM DB2
Questo documento spiega come importare i log IBM DB2 in Google Security Operations utilizzando l'agente Bindplane.
IBM Db2 è un sistema di gestione di database relazionali che fornisce una funzionalità di controllo per facilitare il rilevamento di accessi sconosciuti o imprevisti ai dati. La funzionalità di controllo Db2 genera e consente la manutenzione di una traccia di controllo per una serie di eventi di database predefiniti.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Windows Server 2016 o versioni successive oppure host Linux con
systemd - Connettività di rete tra l'agente Bindplane e l'istanza IBM DB2
- Se l'agente viene eseguito dietro un proxy, assicurati che le porte del firewall siano aperte in base ai requisiti dell'agente Bindplane
- Istanza IBM DB2 (versione 11.1 o successive) con privilegi SYSADM
- Spazio su disco sufficiente per l'archiviazione e l'archiviazione dei log di controllo
Recuperare il file di autenticazione dell'importazione di Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Agente di raccolta.
- Fai clic su Scarica per scaricare il file di autenticazione dell'importazione.
Salva il file in modo sicuro sul sistema in cui verrà installato l'agente Bindplane.
Recuperare l'ID cliente Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Profilo.
Copia e salva l'ID cliente dalla sezione Dettagli dell'organizzazione.
Installa l'agente Bindplane
Installa l'agente Bindplane sul sistema operativo Windows o Linux seguendo le istruzioni riportate di seguito.
Installazione di finestre
- Apri Prompt dei comandi o PowerShell come amministratore.
Esegui questo comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietAttendi il completamento dell'installazione.
Verifica l'installazione eseguendo il comando:
sc query observiq-otel-collectorIl servizio dovrebbe essere visualizzato come IN ESECUZIONE.
Installazione di Linux
- Apri un terminale con privilegi di root o sudo.
Esegui questo comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shAttendi il completamento dell'installazione.
Verifica l'installazione eseguendo il comando:
sudo systemctl status observiq-otel-collectorIl servizio dovrebbe essere visualizzato come attivo (in esecuzione).
Risorse aggiuntive per l'installazione
Per ulteriori opzioni di installazione e risoluzione dei problemi, consulta la Guida all'installazione dell'agente Bindplane.
Configura l'agente Bindplane per importare syslog e inviarli a Google SecOps
Individua il file di configurazione
Linux:
sudo nano /opt/observiq-otel-collector/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Modifica il file di configurazione
Sostituisci l'intero contenuto di
config.yamlcon la seguente configurazione: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_auditSostituisci i seguenti segnaposto:
Configurazione del ricevitore:
listen_address: impostato su0.0.0.0:1514per ascoltare su tutte le interfacce sulla porta 1514 (porta senza privilegi consigliata per Linux).
Configurazione dell'esportatore:
creds_file_path: Percorso completo del file di autenticazione importazione:- Linux:
/opt/observiq-otel-collector/ingestion-auth.json - Windows:
C:\\Program Files\\observIQ OpenTelemetry Collector\\ingestion-auth.json
- Linux:
customer_id: l'ID cliente del passaggio precedenteendpoint: URL endpoint regionale:- Stati Uniti:
malachiteingestion-pa.googleapis.com - Europa:
europe-malachiteingestion-pa.googleapis.com - Asia:
asia-southeast1-malachiteingestion-pa.googleapis.com - Per l'elenco completo, vedi Endpoint regionali.
- Stati Uniti:
log_type: impostato suDB2_DBingestion_labels: etichette facoltative in formato YAML (ad esempio,env: production)
Salvare il file di configurazione
Dopo la modifica, salva il file:
- Linux: premi
Ctrl+O, poiEntere infineCtrl+X. - Windows: fai clic su File > Salva.
- Linux: premi
Riavvia l'agente Bindplane per applicare le modifiche
Linux
sudo systemctl restart observiq-otel-collectorVerifica che il servizio sia in esecuzione:
sudo systemctl status observiq-otel-collectorControlla i log per individuare eventuali errori:
sudo journalctl -u observiq-otel-collector -f
Windows
Scegli una delle seguenti opzioni:
Utilizzando il prompt dei comandi o PowerShell come amministratore:
net stop observiq-otel-collector && net start observiq-otel-collectorUtilizzo della console Services:
- Premi
Win+R, digitaservices.msce premi Invio. - Individua observIQ OpenTelemetry Collector.
- Fai clic con il tasto destro del mouse e seleziona Riavvia.
Verifica che il servizio sia in esecuzione:
sc query observiq-otel-collectorControlla i log per individuare eventuali errori:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Premi
Configura la funzionalità di controllo IBM DB2
Configura la funzionalità di controllo DB2 per acquisire gli eventi di sicurezza ed estrarli in syslog.
Controllare la configurazione di controllo attuale
Connettiti all'istanza DB2 come utente con autorizzazione SYSADM ed esegui:
db2audit describeViene visualizzata la configurazione di controllo corrente, inclusi stato, categorie e percorsi di controllo.
Configura i percorsi di controllo
Imposta le directory in cui verranno archiviati gli audit log:
db2audit configure datapath /db2audit/data db2audit configure archivepath /db2audit/archiveAssicurati che queste directory esistano e dispongano delle autorizzazioni appropriate per il proprietario dell'istanza DB2:
mkdir -p /db2audit/data /db2audit/archive chown db2inst1:db2iadm1 /db2audit/data /db2audit/archive chmod 750 /db2audit/data /db2audit/archive
Configura l'ambito e le categorie di controllo
Configura la funzionalità di controllo per acquisire tutti gli eventi di sicurezza:
db2audit configure scope all status both errortype normalIn questo modo vengono configurati:
scope all: Controlla tutte le categorie (audit, controllo, objmaint, secmaint, sysadmin, validate, context)status both: acquisisce gli eventi riusciti e non riuscitierrortype normal: Gestione degli errori standard
Avviare la funzionalità di controllo
Avvia l'audit:
db2audit startVerifica che il controllo sia attivo:
db2audit describeL'output dovrebbe mostrare
Audit active: "TRUE".
Configura syslog per ricevere i log di controllo di DB2
Configura il daemon syslog di sistema per ricevere e archiviare i messaggi di controllo DB2.
Linux (rsyslog)
Modifica il file di configurazione di rsyslog:
sudo nano /etc/rsyslog.confAggiungi la seguente riga per indirizzare i messaggi di controllo DB2 a un file dedicato:
user.info /var/log/db2/db2audit.logCrea la directory e il file di log:
sudo mkdir -p /var/log/db2 sudo touch /var/log/db2/db2audit.log sudo chmod 640 /var/log/db2/db2audit.logRiavvia rsyslog:
sudo systemctl restart rsyslog
AIX (syslogd)
Modifica il file di configurazione di syslog:
sudo vi /etc/syslog.confAggiungi la seguente riga:
user.info /var/log/db2/db2audit.logCrea la directory e il file di log:
sudo mkdir -p /var/log/db2 sudo touch /var/log/db2/db2audit.log sudo chmod 640 /var/log/db2/db2audit.logRiavvia syslogd:
sudo refresh -s syslogd
Estrai i log di controllo DB2 in syslog
Estrai i log di controllo archiviati e inviali al daemon syslog di sistema.
Svuotare e archiviare i log di controllo
Prima dell'estrazione, svuota tutti i record di controllo in attesa e archivia l'audit log corrente:
db2audit flush db2audit archiveIl comando di archiviazione crea file con timestamp nel percorso di archiviazione (ad esempio
db2audit.instance.log.0.20250110123456).
Estrarre i log di controllo in syslog
Estrai gli audit log archiviati e inviali a syslog utilizzando la struttura e la priorità
user.info:db2audit extract syslog user.info from files /db2audit/archive/db2audit.instance.log.0.*Questo comando:
- Estrae i record di controllo dai file di log archiviati
- Li invia al daemon syslog di sistema con la struttura
usere la prioritàinfo - Il daemon syslog esegue il routing dei messaggi in base a
/etc/syslog.confo/etc/rsyslog.conf
Verificare che i log vengano inviati
Verifica che i messaggi di controllo vengano scritti nel file syslog:
tail -f /var/log/db2/db2audit.logDovresti visualizzare i record di controllo DB2 nel file di log.
Configura rsyslog per inoltrare i log all'agente Bindplane
Configura rsyslog per inoltrare i log di controllo di DB2 all'agente Bindplane.
Crea un nuovo file di configurazione rsyslog:
sudo nano /etc/rsyslog.d/50-db2-forward.confAggiungi la seguente configurazione per inoltrare i log all'agente Bindplane:
# Forward DB2 audit logs to Bindplane agent user.info @@127.0.0.1:1514Il prefisso
@@indica l'inoltro TCP. Utilizza@per UDP, se necessario.Riavvia rsyslog:
sudo systemctl restart rsyslog
Automatizzare l'estrazione dei log di controllo
Crea uno script per automatizzare il processo di svuotamento, archiviazione ed estrazione.
Crea script di estrazione
Crea uno script per automatizzare l'estrazione dei log di controllo:
sudo nano /usr/local/bin/db2audit-extract.shAggiungi i seguenti contenuti:
#!/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 0Rendi eseguibile lo script:
sudo chmod +x /usr/local/bin/db2audit-extract.sh
Pianificare con cron
Pianifica l'esecuzione periodica dello script utilizzando cron:
sudo crontab -eAggiungi la seguente riga per eseguire lo script ogni ora:
Scegli una delle seguenti opzioni:
0 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1oppure esegui ogni 15 minuti per un'estrazione più frequente:
*/15 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1
Verifica l'importazione dei log in Google SecOps
- Accedi alla console Google SecOps.
- Vai a Ricerca.
Esegui una query di ricerca per verificare che i log DB2 vengano importati:
metadata.log_type = "DB2_DB"Verifica che i log vengano visualizzati con il timestamp e i campi corretti.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Funzione logica |
|---|---|---|
| msg | event.idm.read_only_udm.additional.fields | Valore estratto da msg se msg != "" |
| Sistema | event.idm.read_only_udm.additional.fields | Valore estratto dal sistema se System != "" |
| OOB | event.idm.read_only_udm.additional.fields | Valore estratto dal sottosistema se Sottosistema != "" |
| auth_mechanism | event.idm.read_only_udm.extensions.auth.mechanism | Imposta "USERNAME_PASSWORD" per gli eventi USER_LOGIN |
| CorrelationUser | event.idm.read_only_udm.intermediary.user.userid | Valore tratto da CorrelationUser se CorrelationUser != "" |
| somma | event.idm.read_only_udm.metadata.description | Valore sottratto dalla somma |
| date_time | event.idm.read_only_udm.metadata.event_timestamp | Convertito dai campi data e ora al formato ISO8601 se entrambi != "" |
| leef_event_id | event.idm.read_only_udm.metadata.product_event_type | Valore estratto da leef_event_id |
| event.idm.read_only_udm.metadata.event_type | Derivato da leef_event_id: se in ["102-87", "102-83"] → USER_LOGIN; se in ["102-6", "102-7", "102-8", "102-10", "102-24", "102-143"] → USER_RESOURCE_ACCESS o USER_RESOURCE_UPDATE_CONTENT in base all'intent; se "102-319" → USER_RESOURCE_ACCESS; altrimenti GENERIC_EVENT | |
| event.idm.read_only_udm.metadata.product_name | Impostato su "DB2" | |
| event.idm.read_only_udm.metadata.vendor_name | Impostato su "IBM" | |
| SSID | event.idm.read_only_udm.network.session_id | Valore estratto dall'SSID se SSID != "" |
| job | event.idm.read_only_udm.principal.application | Valore estratto dal job se job != "" |
| sourceServiceName | event.idm.read_only_udm.principal.application | Valore estratto da sourceServiceName |
| sourceHostName | event.idm.read_only_udm.principal.asset.hostname | Valore estratto da sourceHostName se sourceHostName != "" |
| principal_ip | event.idm.read_only_udm.principal.asset.ip | Valore estratto da principal_ip per gli eventi 102-319 |
| product_id | event.idm.read_only_udm.principal.asset_id | Imposta "ID prodotto: %{product_id}" per gli eventi 102-319 |
| sourceHostName | event.idm.read_only_udm.principal.hostname | Valore estratto da sourceHostName se sourceHostName != "" |
| principal_ip | event.idm.read_only_udm.principal.ip | Valore estratto da principal_ip per gli eventi 102-319 |
| Autore | event.idm.read_only_udm.principal.user.user_display_name | Valore tratto dal creator |
| nome | event.idm.read_only_udm.principal.user.user_display_name | Valore estratto dal nome se name != "" |
| AuthenticatedUser | event.idm.read_only_udm.principal.user.userid | Valore tratto da AuthenticatedUser se AuthenticatedUser != "" |
| sourceUserName | event.idm.read_only_udm.principal.user.userid | Valore estratto da sourceUserName |
| usrName | event.idm.read_only_udm.principal.user.userid | Valore tratto da usrName |
| _action | event.idm.read_only_udm.security_result.action | Derivato dalla somma: se contiene "successful" → ALLOW; altrimenti BLOCK per gli eventi USER_LOGIN |
| deviceHostName | event.idm.read_only_udm.target.asset.hostname | Valore estratto da deviceHostName |
| conn_location3 | event.idm.read_only_udm.target.asset.hostname | Valore estratto da conn_location3 se conn_location3 != "" |
| nome_file | event.idm.read_only_udm.target.file.full_path | Valore estratto da file_name se file_name != "" |
| deviceHostName | event.idm.read_only_udm.target.hostname | Valore estratto da deviceHostName |
| conn_location3 | event.idm.read_only_udm.target.hostname | Valore estratto da conn_location3 se conn_location3 != "" |
| conn_location, conn_location2 | event.idm.read_only_udm.target.location.name | Concatenato da conn_location e conn_location2 se entrambi != "" |
| deviceProcessName | event.idm.read_only_udm.target.process.command_line | Valore estratto da deviceProcessName |
| SQL | event.idm.read_only_udm.target.process.command_line | Valore estratto da SQL se SQL != "" |
| Connection_Type | event.idm.read_only_udm.target.resource.attribute.labels | Chiave "Tipo di connessione" con valore da Connection_Type |
| Piano | event.idm.read_only_udm.target.resource.attribute.labels | Chiave "Plan" con valore da Plan |
| DB2_Subsystem | event.idm.read_only_udm.target.resource.attribute.labels | Chiave "DB2 Subsystem" con valore da DB2_Subsystem |
| Priv_Check_Code | event.idm.read_only_udm.target.resource.attribute.labels | Chiave "Priv Check Code" con valore da Priv_Check_Code |
| Table_Name | event.idm.read_only_udm.target.resource.attribute.labels | Chiave "Nome tabella" con valore da Table_Name |
| MessageType | event.idm.read_only_udm.target.resource.attribute.labels | Chiave "Tipo di messaggio" con valore da MessageType |
| Check_type | event.idm.read_only_udm.target.resource.attribute.labels | Chiave "Check Type" con valore da Check_type |
| deviceAction | event.idm.read_only_udm.target.resource.attribute.labels | Chiave "Device Action" con valore mappato da deviceAction: G → GRANT, R → REVOKE |
| SSID | event.idm.read_only_udm.target.resource.attribute.labels | Chiave "SSID" con valore da SSID se valore != "" |
| SQL | event.idm.read_only_udm.target.resource.attribute.labels | Chiave "Query SQL" con valore da SQL se SQL != "" |
| messageid | event.idm.read_only_udm.target.resource.id | Valore estratto da messageid |
| Object_Class_Code | event.idm.read_only_udm.target.resource.parent | Valore estratto da Object_Class_Code |
| obj | event.idm.read_only_udm.target.resource.name | Valore estratto da obj |
| resource_name | event.idm.read_only_udm.target.resource.name | Valore estratto da resource_name estratto da SQL se SQL != "" e non è vuoto |
| Database_Name | event.idm.read_only_udm.target.resource.name | Valore estratto da Database_Name |
| objtyp | event.idm.read_only_udm.target.resource.resource_subtype | Valore estratto da objtyp (in maiuscolo) se objtyp != "" |
| Tipo | event.idm.read_only_udm.target.resource.resource_subtype | Derivato da Tipo: T → TABLE, V → VIEW, X → AUXILIARY TABLE |
| event.idm.read_only_udm.target.resource.resource_type | Impostato su "DATABASE" |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.