Raccogliere i log di Oracle DB
Questa guida spiega come importare i log di Oracle DB in Google Security Operations utilizzando l'agente Bindplane.
L'analizzatore sintattico estrae i campi dai messaggi SYSLOG, gestendo più formati utilizzando pattern grok e l'analisi sintattica chiave-valore. Quindi, mappa questi campi estratti al modello Unified Data Model (UDM), arricchendo i dati con metadati statici come i nomi di fornitori e prodotti e impostando dinamicamente i tipi di eventi in base a valori di campi specifici come ACTION e USERID.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
Un'istanza Google SecOps
Windows Server 2016 o versioni successive oppure host Linux con
systemdConnettività di rete tra l'agente Bindplane e l'host del database Oracle
Se l'agente viene eseguito dietro un proxy, assicurati che le porte del firewall siano aperte in base ai requisiti dell'agente Bindplane.
Accesso con privilegi all'istanza del database Oracle (ruolo SYSDBA o AUDIT_ADMIN)
Oracle Database 19c o versioni successive con controllo unificato abilitato (o controllo in modalità mista su Oracle 12c-18c)
Recuperare il file di autenticazione importazione di Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Agenti di raccolta.
Scarica il file di autenticazione importazione. Salva il file in modo sicuro sul sistema in cui verrà installato 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 Windows
- 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:
sc query observiq-otel-collector
Il 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:
sudo systemctl status observiq-otel-collector
Il 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:
```bash
sudo nano /etc/bindplane-agent/config.yaml
```
Windows:
```cmd
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
```
Modifica il file di configurazione
Sostituisci l'intero contenuto di config.yaml con la seguente configurazione:
```yaml
receivers:
udplog:
listen_address: "0.0.0.0:514"
exporters:
chronicle/oracle_db:
compression: gzip
creds_file_path: '/path/to/ingestion-authentication-file.json'
customer_id: '<customer_id>'
endpoint: malachiteingestion-pa.googleapis.com
log_type: ORACLE_DB
raw_log_field: body
ingestion_labels:
log_type: 'ORACLE_DB'
service:
pipelines:
logs/oracle_to_chronicle:
receivers:
- udplog
exporters:
- chronicle/oracle_db
```
Parametri di configurazione
- Sostituisci i seguenti segnaposto:
Configurazione del ricevitore:
* listen_address: l'indirizzo IP e la porta da ascoltare:
- Sostituisci 0.0.0.0 con un indirizzo IP specifico da ascoltare su un'interfaccia o lascia 0.0.0.0 per ascoltare su tutte le interfacce (consigliato)
- Sostituisci 514 con il numero di porta corrispondente alla configurazione di inoltro di Oracle syslog
Configurazione dell'esportatore:
* creds_file_path: percorso completo del file di autenticazione dell'importazione:
- Linux: /etc/bindplane-agent/ingestion-auth.json
- Windows: C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
* customer_id: ID cliente copiato nella sezione Recupera l'ID cliente Google SecOps
* endpoint: URL dell'endpoint regionale:
- Stati Uniti: malachiteingestion-pa.googleapis.com
- Europa: europe-malachiteingestion-pa.googleapis.com
- Asia: asia-southeast1-malachiteingestion-pa.googleapis.com
- Consulta la sezione Endpoint regionali per l'elenco completo
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
Per riavviare l'agente Bindplane in Linux, esegui questo comando:
sudo systemctl restart observiq-otel-collector- Verifica che il servizio sia in esecuzione:
sudo systemctl status observiq-otel-collector- Controlla i log per individuare eventuali errori:
sudo journalctl -u observiq-otel-collector -fPer riavviare l'agente Bindplane in Windows, scegli una delle seguenti opzioni:
- Prompt dei comandi o PowerShell come amministratore:
net stop observiq-otel-collector && net start observiq-otel-collector- Console dei servizi:
- Premi
Win+R, digitaservices.msce premi Invio. - Individua observIQ OpenTelemetry Collector.
- Fai clic con il tasto destro del mouse e seleziona Riavvia.
- Premi
- Verifica che il servizio sia in esecuzione:
sc query observiq-otel-collector- Controlla i log per individuare eventuali errori:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
Configura l'audit unificato del database Oracle e l'inoltro di syslog
Abilitare il controllo unificato
Se il controllo unificato non è ancora abilitato, ricollega i file binari Oracle con l'opzione uniaud_on. Per farlo, è necessario arrestare tutti i processi Oracle in esecuzione da Oracle Home (istanza del database e listener).
- Connettiti all'host Oracle Database come utente del sistema operativo
oracle. Arresta l'istanza e il listener Oracle:
sqlplus / as sysdba <<EOF shutdown immediate; exit EOF lsnrctl stopRicollega i file binari Oracle con il controllo unificato abilitato:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracleAvvia il listener e l'istanza Oracle:
lsnrctl start sqlplus / as sysdba <<EOF startup; exit EOFSe Oracle Enterprise Manager Cloud Control è in esecuzione sullo stesso host, riavvialo:
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl start omsVerifica che il controllo unificato sia abilitato. Connettiti al database Oracle con SQLplus:
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
Verifica che il comando restituisca una riga con VALUE uguale a TRUE.
Configura l'output syslog del controllo unificato
Imposta il parametro di inizializzazione UNIFIED_AUDIT_SYSTEMLOG per scrivere i record di controllo unificati in syslog. Questo parametro è stato introdotto in Oracle 19c e sostituisce il parametro AUDIT_SYSLOG_LEVEL deprecato (che si applica solo all'audit tradizionale).
- Connettiti al database Oracle con SQLplus come SYSDBA.
Imposta il parametro
UNIFIED_AUDIT_SYSTEMLOG:- Sui sistemi UNIX/Linux, imposta il parametro su un valore
facility.priority:
ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = 'LOCAL7.INFO' SCOPE=SPFILE;- Sui sistemi Windows, imposta il parametro su
TRUEper scrivere nel Visualizzatore eventi di Windows:
ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = TRUE SCOPE=SPFILE;- Sui sistemi UNIX/Linux, imposta il parametro su un valore
(Facoltativo) Per scrivere record di policy di controllo unificato comuni da un contenitore root CDB a syslog sui sistemi UNIX/Linux, imposta il parametro
UNIFIED_AUDIT_COMMON_SYSTEMLOG:ALTER SYSTEM SET UNIFIED_AUDIT_COMMON_SYSTEMLOG = TRUE SCOPE=SPFILE;Riavvia l'istanza del database Oracle per rendere effettive le modifiche ai parametri:
SHUTDOWN IMMEDIATE; STARTUP;
Configura il daemon syslog sull'host Oracle
Sull'host del database Oracle, configura il daemon syslog per inoltrare le voci del log di controllo all'agente Bindplane.
- Accedi all'host del database Oracle come
root. Apri il file di configurazione syslog:
- Su RHEL/CentOS/Oracle Linux con rsyslog:
sudo vi /etc/rsyslog.conf- Sui sistemi meno recenti con syslog:
sudo vi /etc/syslog.confAggiungi una regola di forwarding che corrisponda alla struttura e alla priorità che hai configurato in
UNIFIED_AUDIT_SYSTEMLOG. Ad esempio, se impostiLOCAL7.INFO:- Per l'inoltro tramite UDP (corrispondente al ricevitore Bindplane
udplog):
local7.info @<BINDPLANE_HOST_IP>:514- Per l'inoltro tramite TCP (se Bindplane utilizza il ricevitore
tcplog):
local7.info @@<BINDPLANE_HOST_IP>:514- Per l'inoltro tramite UDP (corrispondente al ricevitore Bindplane
Sostituisci <BINDPLANE_HOST_IP> con l'indirizzo IP o il nome host del sistema che esegue l'agente Bindplane.
Note: A single `@` prefix indicates UDP forwarding. A double `@@` prefix indicates TCP forwarding. Ensure this matches the receiver type in the Bindplane `config.yaml`.
(Facoltativo) Per conservare anche una copia locale dei log di controllo, aggiungi la seguente riga:
local7.info /var/log/oracle_audit.logSalva il file e riavvia il daemon syslog:
- Su RHEL/CentOS/Oracle Linux con rsyslog:
sudo systemctl restart rsyslog- Sui sistemi meno recenti con syslog:
sudo service syslog restart
Verificare l'inoltro dei log di controllo
Genera un evento di controllo di test eseguendo un'azione controllabile nel database Oracle. Ad esempio, connettiti come utente ed esegui:
SELECT * FROM DBA_USERS WHERE ROWNUM = 1;Controlla i log dell'agente Bindplane per i messaggi syslog in arrivo:
sudo journalctl -u observiq-otel-collector -fVerifica che il messaggio syslog contenga il tag
Oracle Unified Auditcon coppie chiave-valore comeTYPE,DBID,SESID,DBUSER,ACTIONeRETCODE.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
ACTION |
security_result.action_details |
Il valore di ACTION del log non elaborato viene mappato direttamente a questo campo UDM. Viene applicata una logica aggiuntiva per determinare security_result.action e security_result.description in base al valore di ACTION (ad esempio, 100 corrisponde a ALLOW e Success). |
ACTION_NAME |
metadata.product_event_type |
Mappato direttamente. |
ACTION_NUMBER |
additional.fields[action_number].value.string_value |
Mappato direttamente con il tasto Source Event. Utilizzato anche in combinazione con altri campi per derivare metadata.event_type e metadata.product_event_type. |
APPLICATION_CONTEXTS |
additional.fields[application_contexts_label].value.string_value |
Mappato direttamente con il tasto APPLICATION_CONTEXTS. |
AUDIT_POLICY |
additional.fields[audit_policy_label].value.string_value o additional.fields[AUDIT_POLICY_#].value.string_value |
Se AUDIT_POLICY contiene una virgola, viene suddiviso in più etichette con chiavi come AUDIT_POLICY_0, AUDIT_POLICY_1 e così via. In caso contrario, viene mappato direttamente con la chiave AUDIT_POLICY. |
AUDIT_TYPE |
additional.fields[audit_type_label].value.string_value |
Mappato direttamente con il tasto AUDIT_TYPE. |
AUTHENTICATION_TYPE |
metadata.event_type, extensions.auth.type |
Utilizzato per derivare metadata.event_type come USER_LOGIN se auth_type (estratto da AUTHENTICATION_TYPE) non è vuoto e vengono soddisfatte altre condizioni. extensions.auth.type è impostato su AUTHTYPE_UNSPECIFIED. |
CLIENT_ADDRESS |
principal.ip, principal.port, network.ip_protocol, intermediary[host].user.userid |
IP, porta e protocollo vengono estratti utilizzando i pattern grok. Se un nome utente è presente nel campo CLIENT_ADDRESS, viene mappato a intermediary[host].user.userid. |
CLIENT_ID |
target.user.userid |
Mappato direttamente. |
CLIENT_PROGRAM_NAME |
additional.fields[client_program_name_label].value.string_value |
Mappato direttamente con il tasto CLIENT_PROGRAM_NAME. |
CLIENT_TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
Mappato direttamente con il tasto CLIENT_TERMINAL. |
CLIENT_USER |
target.user.user_display_name |
Mappato direttamente. |
COMMENT$TEXT |
additional.fields[comment_text_label].value.string_value |
Mappato direttamente con la chiave comment_text dopo aver sostituito + con :. |
CURRENT_USER |
additional.fields[current_user_label].value.string_value |
Mappato direttamente con il tasto current_user. |
CURUSER |
additional.fields[current_user_label].value.string_value |
Mappato direttamente con il tasto current_user. |
DATABASE_USER |
principal.user.user_display_name |
Mappato direttamente se non è vuoto o /. |
DBID |
metadata.product_log_id |
Mappato direttamente dopo la rimozione degli apici singoli. |
DBNAME |
target.resource.resource_type, target.resource.resource_subtype, target.resource.name |
Imposta resource_type su DATABASE, resource_subtype su Oracle Database e mappa DBNAME su name. |
DBPROXY_USERRNAME |
intermediary[dbproxy].user.userid |
Mappato direttamente. |
DBUSERNAME |
target.user.user_display_name |
Mappato direttamente. |
ENTRYID |
target.resource.attribute.labels[entry_id_label].value |
Mappato direttamente con il tasto Entry Id. |
EXTERNAL_USERID |
additional.fields[external_userid_label].value.string_value |
Mappato direttamente con il tasto EXTERNAL_USERID. |
LENGTH |
additional.fields[length_label].value.string_value |
Mappato direttamente con il tasto length. |
LOGOFF$DEAD |
target.resource.attribute.labels[LOGOFFDEAD_label].value |
Mappato direttamente con il tasto LOGOFFDEAD. |
LOGOFF$LREAD |
target.resource.attribute.labels[LOGOFFLREAD_label].value |
Mappato direttamente con il tasto LOGOFFLREAD. |
LOGOFF$LWRITE |
target.resource.attribute.labels[LOGOFFLWRITE_label].value |
Mappato direttamente con il tasto LOGOFFLWRITE. |
LOGOFF$PREAD |
target.resource.attribute.labels[LOGOFFPREAD_label].value |
Mappato direttamente con il tasto LOGOFFPREAD. |
NTIMESTAMP# |
metadata.event_timestamp |
Analizzato e convertito nel formato RFC 3339 o ISO8601. |
OBJCREATOR |
target.resource.attribute.labels[obj_creator_label].value |
Mappato direttamente con il tasto OBJ Creator. |
OBJNAME |
target.resource.attribute.labels[obj_name_label].value |
Mappato direttamente con il tasto OBJ Name. |
OS_USERNAME |
principal.user.user_display_name |
Mappato direttamente. |
OSUSERID |
target.user.userid |
Mappato direttamente. |
PDB_GUID |
principal.resource.product_object_id |
Mappato direttamente. |
PRIV$USED |
additional.fields[privused_label].value.string_value |
Mappato direttamente con il tasto privused. |
PRIVILEGE |
principal.user.attribute.permissions.name |
Mappato direttamente. |
RETURN_CODE |
security_result.summary |
Mappato direttamente. La logica viene applicata per derivare security_result.action e security_result.description. |
RETURNCODE |
security_result.summary |
Mappato direttamente. La logica viene applicata per derivare security_result.action e security_result.description. |
RLS_INFO |
additional.fields[rls_info_label].value.string_value |
Mappato direttamente con il tasto RLS_INFO. |
SCHEMA |
additional.fields[schema_label].value.string_value |
Mappato direttamente con il tasto schema. |
SESSIONCPU |
target.resource.attribute.labels[SESSIONCPU_label].value |
Mappato direttamente con il tasto SESSIONCPU. |
SESSIONID |
network.session_id |
Mappato direttamente. |
SESID |
network.session_id |
Mappato direttamente. |
SQL_TEXT |
target.process.command_line |
Mappato direttamente. |
SQLTEXT |
target.process.command_line |
Mappato direttamente. |
STATEMENT |
target.resource.attribute.labels[statement_label].value |
Mappato direttamente con il tasto STATEMENT. |
STATUS |
security_result.summary |
Mappato direttamente. La logica viene applicata per derivare security_result.action e security_result.description. |
SYSTEM_PRIVILEGE_USED |
additional.fields[system_privilege_used_label].value.string_value |
Mappato direttamente con il tasto SYSTEM_PRIVILEGE_USED. |
TARGET_USER |
additional.fields[target_user_label].value.string_value |
Mappato direttamente con il tasto TARGET_USER. |
TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
Mappato direttamente con il tasto CLIENT_TERMINAL. |
TYPE |
additional.fields[type_label].value.string_value |
Mappato direttamente con il tasto type. |
USERHOST |
principal.hostname, principal.administrative_domain |
Il nome host e il dominio vengono estratti utilizzando i pattern grok. |
USERID |
principal.user.userid |
Mappato direttamente. |
device_host_name |
target.hostname |
Mappato direttamente. |
event_name |
metadata.product_event_type |
Mappato direttamente dopo la conversione in maiuscolo. |
file_name |
target.file.full_path |
Mappato direttamente. |
hostname |
principal.hostname |
Mappato direttamente. |
length |
additional.fields[length_label].value.string_value |
Mappato direttamente con il tasto length. |
log_source_name |
principal.application |
Mappato direttamente. |
message |
Varie | Utilizzato per l'analisi grok per estrarre diversi campi. |
returncode |
RETURNCODE |
Mappato direttamente. |
src_ip |
principal.ip |
Mappato direttamente. |
t_hostname |
target.hostname |
Mappato direttamente. |
| (Parser Logic) | metadata.vendor_name |
Codificato in Oracle. |
| (Parser Logic) | metadata.product_name |
Codificato in Oracle DB. |
| (Parser Logic) | metadata.event_type |
Determinato in base ai valori di ACTION, ACTION_NUMBER, source_event, OSUSERID, USERID, SQLTEXT, AUTHENTICATION_TYPE, DBUSERNAME, device_host_name, database_name. Il valore predefinito è USER_RESOURCE_ACCESS se non viene soddisfatta alcuna condizione specifica. |
| (Parser Logic) | metadata.product_event_type |
Determinato in base ai valori di ACTION, ACTION_NUMBER, source_event, p_event_type, ACTION_NAME. |
| (Parser Logic) | metadata.log_type |
Codificato in ORACLE_DB. |
| (Parser Logic) | extensions.auth.mechanism |
Impostato su USERNAME_PASSWORD in determinate condizioni in base a ACTION, ACTION_NUMBER, source_event e OSUSERID. |
| (Parser Logic) | extensions.auth.type |
Impostato su AUTHTYPE_UNSPECIFIED in determinate condizioni in base a ACTION, ACTION_NUMBER e AUTHENTICATION_TYPE. |
| (Parser Logic) | security_result.description |
Derivato da RETURNCODE o STATUS. |
| (Parser Logic) | security_result.action |
Derivato da RETURNCODE o STATUS. |
| (Parser Logic) | target.resource.attribute.labels |
Vengono aggiunte diverse etichette in base alla presenza e ai valori di vari campi del log. |
| (Parser Logic) | additional.fields |
Vengono aggiunti diversi campi come coppie chiave-valore in base alla presenza e ai valori di vari campi di log. |
| (Parser Logic) | intermediary |
Creato e compilato in base alla presenza e ai valori di DBPROXY_USERRNAME e CLIENT_ADDRESS. |
| (Parser Logic) | network.ip_protocol |
Derivato dal protocollo estratto da CLIENT_ADDRESS utilizzando un file di inclusione parse_ip_protocol.include. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.