Raccogliere i log di Oracle DB
Questo documento spiega come importare i log del database Oracle in Google Security Operations
utilizzando Bindplane. Il parser estrae i campi dai messaggi SYSLOG, gestendo
più formati utilizzando pattern grok e l'analisi 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
. L'analizzatore sintattico gestisce anche varie operazioni di pulizia dei dati, come la sostituzione dei caratteri e la conversione dei tipi di dati.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Istanza Google SecOps
- Windows 2016 o versioni successive oppure un host Linux con
systemd
- Se l'esecuzione avviene tramite un proxy, le porte del firewall sono aperte
- Accesso con privilegi (ruolo AUDIT_SYSTEM) al database Oracle
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
Installazione di Windows
- 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" /quiet
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.sh
Risorse aggiuntive per l'installazione
Per ulteriori opzioni di installazione, consulta la guida all'installazione.
Configura l'agente Bindplane per importare Syslog e inviarli a Google SecOps
- Accedi al file di configurazione:
- Individua il file
config.yaml
. In genere, si trova nella directory/etc/bindplane-agent/
su Linux o nella directory di installazione su Windows. - Apri il file utilizzando un editor di testo (ad esempio
nano
,vi
o Blocco note).
- Individua il file
Modifica il file
config.yaml
come segue:receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization ingestion_labels: log_type: 'ORACLE_DB' raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Sostituisci la porta e l'indirizzo IP in base alle esigenze della tua infrastruttura.
Sostituisci
<customer_id>
con l'ID cliente effettivo.Aggiorna
/path/to/ingestion-authentication-file.json
al percorso in cui è stato salvato il file di autenticazione nella sezione Recupera il file di autenticazione per l'importazione di Google SecOps.
Riavvia l'agente Bindplane per applicare le modifiche
Per riavviare l'agente Bindplane in Linux, esegui questo comando:
sudo systemctl restart bindplane-agent
Per riavviare l'agente Bindplane in Windows, puoi utilizzare la console Servizi o inserire il seguente comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Abilita il controllo per Oracle Database
- Connettiti al database Oracle con SQLplus.
Arresta il database con il comando seguente:
shutdown immediate
Interrompi il servizio di listener Oracle digitando il seguente comando:
lsnrctl stop
(Facoltativo) Solo se applicabile, arresta Enterprise Manager utilizzando i seguenti comandi:
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl stop oms
Collega Oracle DB con l'opzione uniaud utilizzando i seguenti comandi:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracle
Connettiti al database Oracle con SQLplus.
Riavvia il database utilizzando il seguente comando:
startup
Riavvia il servizio di listener Oracle utilizzando il comando seguente:
lsnrctl start
(Facoltativo) Solo se applicabile, riavvia Enterprise Manager utilizzando i seguenti comandi:
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl start oms
Verifica che l'audit unificato sia abilitato, connettiti al database Oracle con SQLplus e poi digita il seguente comando:
select * from v$option where PARAMETER = 'Unified Auditing';
Verifica che il comando restituisca una riga con VALUE uguale a "TRUE".
Configura Syslog per il database Oracle
- Accedi all'istanza Oracle.
Apri il seguente file utilizzando
vi
:vi ${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
Inserisci i seguenti comandi per la configurazione di syslog:
*.audit_trail='os' *.audit_syslog_level='local0.info'
Assicurati che il daemon syslog sull'host Oracle sia configurato per inoltrare il log di controllo.
Su Red Hat Enterprise, apri il seguente file
/etc/syslog.conf
utilizzandovi
e inserisci la seguente riga:local0.info @ <bindplane-ip>:514
Salva ed esci dal file:
:wq
Su Red Hat Enterprise, digita questo comando per ricaricare la configurazione di syslog:
kill -HUP /var/run/syslogd.pid
Connettiti a SQLplus e accedi come sysdba per riavviare:
sys as sysdba
Arresta il database con il comando seguente:
shutdown immediate
Riavvia il database utilizzando il seguente comando:
startup
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 es. 100 corrisponde a CONSENTI e Successo). |
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 è presente un nome utente nel campo CLIENT_ADDRESS , questo 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 modo permanente su Oracle . |
(Parser Logic) | metadata.product_name |
Codificato in modo permanente su 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 . Se non viene soddisfatta alcuna condizione specifica, il valore predefinito è USER_RESOURCE_ACCESS. |
(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 modo permanente su 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 dei 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 da protocol 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.