Raccogli i log di IBM DB2
Questo documento spiega come importare i log di 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 audit di Db2 genera e consente la manutenzione di una traccia di audit 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'esecuzione avviene 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 degli audit log
Recupera le credenziali Google SecOps per l'agente Bindplane
Per autenticare l'agente Bindplane in Google SecOps, scegli uno dei seguenti metodi:
- Nuovi deployment: utilizza l'API Chronicle (opzione 1).
- Deployment legacy: continua a utilizzare il file di autenticazione dell'acquisizione (Opzione 2) fino alla dismissione dell'API Ingestion il 20 luglio 2027.
Opzione 1: crea un account di servizio per l'API Chronicle (consigliata)
- Accedi alla consoleGoogle Cloud e seleziona il progetto Google Cloud collegato alla tua istanza Google SecOps.
- Vai a IAM e amministrazione > Service account.
- Fai clic su Crea service account.
- Fornisci i seguenti dettagli di configurazione:
- Nome service account: inserisci un nome per l'account (ad esempio
bindplane-ingest). - Descrizione service account: inserisci una descrizione (ad esempio
Bindplane agent log ingestion).
- Nome service account: inserisci un nome per l'account (ad esempio
- Fai clic su Crea e continua.
- Nella sezione Concedi a questo account di servizio l'accesso al progetto, fai clic su Seleziona un ruolo e seleziona Chronicle Editor.
- Fai clic su Continua, quindi su Fine.
- Fai clic sul account di servizio che hai creato, quindi vai alla scheda Chiavi.
- Fai clic su Aggiungi chiave > Crea nuova chiave.
- Seleziona JSON e fai clic su Crea. Il file della chiave viene scaricato sul computer.
- Salva il file della chiave come
ingestion-auth.jsonnella directory del raccoglitore Bindplane (/opt/observiq-otel-collector/ingestion-auth.jsonsu Linux oC:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.jsonsu Windows) oppure aggiornacreds_file_pathinconfig.yamlin modo che corrisponda al percorso in cui lo salvi. - Vai a IAM e amministrazione > Impostazioni e copia il Numero progetto. Ti servirà per la configurazione dell'esportatore.
Opzione 2: scarica il file di autenticazione dell'acquisizione (legacy)
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Agenti di raccolta.
- Scarica il file di autenticazione dell'acquisizione.
- Salva il file in modo sicuro sul sistema in cui verrà installato l'agente Bindplane.
Ottieni l'ID cliente Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Profilo.
Copia e salva l'ID cliente dalla sezione Dettagli 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 il 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:
sc query observiq-otel-collectorIl servizio dovrebbe essere visualizzato come RUNNING.
Installazione di Linux
- Apri un terminale con privilegi 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:
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 il syslog e inviarlo 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: 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_auditSostituisci i seguenti segnaposto:
Configurazione del ricevitore:
listen_address: imposta su0.0.0.0:1514per ascoltare su tutte le interfacce sulla porta 1514 (porta non privilegiata consigliata per Linux).
Configurazione dell'esportatore:
creds_file_path: percorso completo del file della chiave JSON del account di servizio (opzione 1):- 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 precedentelocation: sostituisci<LOCATION>con la regione della tua istanza Google SecOps (ad esempious,europeoasia-southeast1). L'esportatore anteponechronicle.googleapis.coma questo valore. Per l'elenco completo, consulta Endpoint regionali.project: sostituisci<PROJECT_NUMBER>con il numero di progetto da IAM e amministrazione > Impostazioni.endpoint: mantieni l'impostazione suchronicle.googleapis.com.log_type: impostato suDB2_DBingestion_labels: Etichette facoltative in formato YAML (ad esempio,env: production)
Esportatore dell'API di importazione precedente
Se utilizzi il file di autenticazione dell'acquisizione dell'Opzione 2, sostituisci il blocco
exporterscon il seguente. Impostacreds_file_pathsul percorso del file di autenticazione dell'importazione e, se la tua istanza si trova al di fuori degli Stati Uniti, sostituiscimalachiteingestion-pa.googleapis.comcon l'endpoint regionale (ad esempio,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
Salva 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 verificare la presenza di errori:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Premi
Configura la funzionalità di controllo di IBM DB2
Configura la funzionalità di controllo DB2 per acquisire gli eventi di sicurezza ed estrarli in syslog.
Controlla la configurazione di controllo attuale
Connettiti alla tua istanza DB2 come utente con autorizzazione SYSADM ed esegui:
db2audit describeViene visualizzata la configurazione di controllo corrente, inclusi lo stato, le categorie e i 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 configuri:
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
Avvia 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 gli audit log 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 gli audit log DB2 in syslog
Estrai i log di controllo archiviati e inviali al daemon syslog di sistema.
Svuotare e archiviare gli audit log
Prima dell'estrazione, svuota tutti i record di controllo in attesa e archivia l'audit log corrente:
db2audit flush db2audit archiveIl comando archive crea file con timestamp nel percorso di archiviazione (ad esempio
db2audit.instance.log.0.20250110123456).
Estrai gli audit log 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 instrada i messaggi in base a
/etc/syslog.confo/etc/rsyslog.conf
Verifica 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 gli audit log 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. Se necessario, utilizza@per UDP.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>&1In alternativa, esegui l'estrazione ogni 15 minuti per una maggiore frequenza:
*/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 alla 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 | Logica |
|---|---|---|
| msg | event.idm.read_only_udm.additional.fields | Valore estratto da msg se msg != "" |
| Sistema | event.idm.read_only_udm.additional.fields | Valore preso da System se System != "" |
| Sottosistema | event.idm.read_only_udm.additional.fields | Valore preso dal sottosistema se il sottosistema != "" |
| auth_mechanism | event.idm.read_only_udm.extensions.auth.mechanism | Impostato su "USERNAME_PASSWORD" per gli eventi USER_LOGIN |
| CorrelationUser | event.idm.read_only_udm.intermediary.user.userid | Valore preso da CorrelationUser se CorrelationUser != "" |
| somma | event.idm.read_only_udm.metadata.description | Valore ottenuto 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 | Impostalo su "DB2" | |
| event.idm.read_only_udm.metadata.vendor_name | Impostato su "IBM" | |
| SSID | event.idm.read_only_udm.network.session_id | Valore preso da SSID se SSID != "" |
| job | event.idm.read_only_udm.principal.application | Valore preso dal job se job != "" |
| sourceServiceName | event.idm.read_only_udm.principal.application | Valore tratto 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 | Impostato su "ID prodotto: %{product_id}" per gli eventi 102-319 |
| sourceHostName | event.idm.read_only_udm.principal.hostname | Valore preso 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 estratto 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" → CONSENTI; altrimenti BLOCCA per gli eventi USER_LOGIN |
| deviceHostName | event.idm.read_only_udm.target.asset.hostname | Valore preso da deviceHostName |
| conn_location3 | event.idm.read_only_udm.target.asset.hostname | Valore preso da conn_location3 se conn_location3 != "" |
| file_name | 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 preso 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 preso da deviceProcessName |
| SQL | event.idm.read_only_udm.target.process.command_line | Valore preso da SQL se SQL != "" |
| Connection_Type | event.idm.read_only_udm.target.resource.attribute.labels | Chiave "Connection Type" 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 "SQL Query" 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 preso da Object_Class_Code |
| obj | event.idm.read_only_udm.target.resource.name | Valore estratto dall'oggetto |
| 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 preso 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 dal tipo: T → TABELLA, V → VISTA, X → TABELLA AUSILIARIA |
| event.idm.read_only_udm.target.resource.resource_type | Impostato su "DATABASE" | |
principal_hostname |
event.idm.read_only_udm.principal.asset.hostname e event.idm.read_only_udm.principal.hostname |
Mappato dal log delle modifiche |
category |
event.idm.read_only_udm.security_result.category_details |
Mappato dal log delle modifiche |
audit event |
event.idm.read_only_udm.metadata.product_event_type |
Mappato dal log delle modifiche |
event correlator |
event.idm.read_only_udm.metadata.product_log_id |
Mappato dal log delle modifiche |
instance name |
event.idm.read_only_udm.target.resource.name |
Mappato dal log delle modifiche |
application name |
event.idm.read_only_udm.principal.application |
Mappato dal log delle modifiche |
archive path |
event.idm.read_only_udm.target.file.full_path |
Mappato dal log delle modifiche |
execution id |
event.idm.read_only_udm.principal.resource.attribute.labels |
Mappato dal log delle modifiche |
application id |
event.idm.read_only_udm.principal.resource.attribute.labels |
Mappato dal log delle modifiche |
authid |
event.idm.read_only_udm.principal.resource.attribute.labels |
Mappato dal log delle modifiche |
event status |
event.idm.read_only_udm.security_result.detection_fields |
Mappato dal log delle modifiche |
access attempted |
event.idm.read_only_udm.security_result.detection_fields |
Mappato dal log delle modifiche |
access_approval_reason |
event.idm.read_only_udm.security_result.detection_fields |
Mappato dal log delle modifiche |
timestamp_1 |
event.idm.read_only_udm.additional.fields |
Mappato dal log delle modifiche |
object type |
event.idm.read_only_udm.additional.fields |
Mappato dal log delle modifiche |
plugin name |
event.idm.read_only_udm.additional.fields |
Mappato dal log delle modifiche |
auth type |
event.idm.read_only_udm.additional.fields |
Mappato dal log delle modifiche |
System" and "Subsystem |
additional.fields |
Mappato dal log delle modifiche |
ConnectionType |
principal.process.pid |
Mappato dal log delle modifiche |
plan |
principal.resource.name |
Mappato dal log delle modifiche |
SQL |
principal.process.command_line |
Mappato dal log delle modifiche |
Log delle modifiche
Visualizza il log delle modifiche per questo parser
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.