Raccogliere i log di Oracle DB

Supportato in:

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 systemd

  • Connettività 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

  1. Accedi alla console Google SecOps.
  2. Vai a Impostazioni SIEM > Agenti di raccolta.
  3. 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

  1. Accedi alla console Google SecOps.
  2. Vai a Impostazioni SIEM > Profilo.
  3. 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

  1. Apri Prompt dei comandi o PowerShell come amministratore.
  2. Esegui questo comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. Attendi il completamento dell'installazione.

  4. Verifica l'installazione eseguendo:

    sc query observiq-otel-collector
    

Il servizio dovrebbe essere visualizzato come IN ESECUZIONE.

Installazione di Linux

  1. Apri un terminale con privilegi di root o sudo.
  2. Esegui questo comando:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. Attendi il completamento dell'installazione.

  4. 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, poi Enter e infine Ctrl+X.
    • Windows: fai clic su File > Salva.

Riavvia l'agente Bindplane per applicare le modifiche

  • Per riavviare l'agente Bindplane in Linux, esegui questo comando:

    sudo systemctl restart observiq-otel-collector
    
    1. Verifica che il servizio sia in esecuzione:
    sudo systemctl status observiq-otel-collector
    
    1. Controlla i log per individuare eventuali errori:
    sudo journalctl -u observiq-otel-collector -f
    
  • Per 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:
      1. Premi Win+R, digita services.msc e premi Invio.
      2. Individua observIQ OpenTelemetry Collector.
      3. Fai clic con il tasto destro del mouse e seleziona Riavvia.
    1. Verifica che il servizio sia in esecuzione:
    sc query observiq-otel-collector
    
    1. 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).

  1. Connettiti all'host Oracle Database come utente del sistema operativo oracle.
  2. Arresta l'istanza e il listener Oracle:

    sqlplus / as sysdba <<EOF
    shutdown immediate;
    exit
    EOF
    lsnrctl stop
    
  3. Ricollega i file binari Oracle con il controllo unificato abilitato:

    cd $ORACLE_HOME/rdbms/lib
    make -f ins_rdbms.mk uniaud_on ioracle
    
  4. Avvia il listener e l'istanza Oracle:

    lsnrctl start
    sqlplus / as sysdba <<EOF
    startup;
    exit
    EOF
    
  5. Se 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 oms
    
  6. Verifica 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).

  1. Connettiti al database Oracle con SQLplus come SYSDBA.
  2. 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 TRUE per scrivere nel Visualizzatore eventi di Windows:
    ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = TRUE SCOPE=SPFILE;
    
  3. (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;
    
  4. 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.

  1. Accedi all'host del database Oracle come root.
  2. 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.conf
    
  3. Aggiungi una regola di forwarding che corrisponda alla struttura e alla priorità che hai configurato in UNIFIED_AUDIT_SYSTEMLOG. Ad esempio, se imposti LOCAL7.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
    

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`.
  1. (Facoltativo) Per conservare anche una copia locale dei log di controllo, aggiungi la seguente riga:

    local7.info /var/log/oracle_audit.log
    
  2. Salva 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

  1. 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;
    
  2. Controlla i log dell'agente Bindplane per i messaggi syslog in arrivo:

    sudo journalctl -u observiq-otel-collector -f
    
  3. Verifica che il messaggio syslog contenga il tag Oracle Unified Audit con coppie chiave-valore come TYPE, DBID, SESID, DBUSER, ACTION e RETCODE.

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.