Raccogliere i log del database Imperva
Questo documento spiega come importare i log del database Imperva in Google Security Operations utilizzando l'agente Bindplane.
Il parser estrae i campi dai log formattati syslog del database Imperva. Utilizza grok e/o kv per analizzare il messaggio di log e poi mappa questi valori nel modello Unified Data Model (UDM). Imposta anche i valori predefiniti dei metadati per l'origine e il tipo di evento. Imperva Database Security offre funzionalità complete di monitoraggio, controllo e protezione dell'attività del database.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Un host Windows 2016 o versioni successive o Linux con
systemd - Se l'agente viene eseguito dietro un proxy, assicurati che le porte del firewall siano aperte in base ai requisiti dell'agente Bindplane
- Accesso privilegiato alla console di gestione di Imperva SecureSphere
Recuperare il file di autenticazione dell'importazione di Google SecOps
- 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.
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 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 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 dell'agente Bindplane.
Configura l'agente Bindplane per importare Syslog e inviarlo 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,vio Blocco note).
- Individua il file
Modifica il file
config.yamlcome 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 log_type: 'IMPERVA_DB' raw_log_field: body ingestion_labels: 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.jsoncon il percorso del file in cui è stato salvato il file di autenticazione nel passaggio 1.
Riavvia l'agente Bindplane per applicare le modifiche
Per riavviare l'agente Bindplane in Linux, esegui questo comando:
sudo systemctl restart observiq-otel-collectorPer riavviare l'agente Bindplane in Windows, puoi utilizzare la console Servizi o inserire il seguente comando:
net stop observiq-otel-collector && net start observiq-otel-collector
Configura l'inoltro di Syslog su Imperva Database
- Accedi alla console di gestione di Imperva SecureSphere.
- Vai a Configurazione > Set di azioni.
- Fai clic su Aggiungi per creare un nuovo insieme di azioni o modificarne uno esistente.
- Fai clic su Aggiungi azione e fornisci i seguenti dettagli di configurazione:
- Nome: inserisci un nome descrittivo (ad esempio,
Google SecOps Syslog). - Tipo di azione: seleziona GW Syslog.
- Host: inserisci l'indirizzo IP dell'agente Bindplane.
- Porta: inserisci il numero di porta dell'agente Bindplane (il valore predefinito è 514).
- Protocollo: seleziona UDP o TCP, a seconda della configurazione dell'agente Bindplane.
- Livello di log Syslog: seleziona DEBUG per la registrazione completa.
- Funzione Syslog: seleziona LOCAL0 o la funzione appropriata.
- Interfaccia azione: seleziona Log gateway - Evento di sicurezza - Log di sistema (syslog) - Formato JSON (esteso) per il formato SYSLOG+JSON o Log gateway - Evento di sicurezza - Log di sistema (syslog) per il formato SYSLOG standard.
- Nome: inserisci un nome descrittivo (ad esempio,
- Salva la configurazione dell'azione.
- Vai a Norme > Norme di sicurezza o Norme > Norme di controllo del database.
- Modifica i criteri pertinenti e aggiungi il set di azioni contenente l'azione syslog per assicurarti che gli eventi vengano inoltrati a Google SecOps.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logica |
|---|---|---|
| acct | principal.user.userid | Se acct è "admin", mappalo su target.user.userid, altrimenti mappalo su principal.user.userid. Rimuovi virgolette e spazi da acct prima del mapping. |
| azione | security_result.action_details | Valore del campo action dal log non elaborato |
| alertSev | security_result.severity | Se alertSev è "Informativo", mappalo come "INFORMATIONAL", altrimenti mappalo come versione in maiuscolo di alertSev |
| applicazione | principal.application | Se application è "pam_unix(sudo:session)" o description contiene "pam_unix", esegui il mapping come "pam_unix". Se message contiene "run-parts", mappalo come "run-parts". Se message contiene "audispd", mappalo come "audispd". Se message contiene "FSS audit", mappalo come "FSS audit". Altrimenti, mappalo come campo application dal log non elaborato |
| nome-applicazione | target.application | Valore del campo application-name dal log non elaborato |
| audit-policy | security_result.category_details | Valore del campo audit-policy dal log non elaborato |
| bind-variables | additional.fields.bind_variables_label.value.string_value | Valore del campo bind-variables dal log non elaborato |
| categoria | security_result.category_details | Valore del campo category dal log non elaborato |
| COMANDO | target.process.command_line | Se exe non è vuoto, mappalo come campo exe dal log non elaborato. Altrimenti, mappalo come campo COMMAND dal log non elaborato |
| Ora di creazione | Non mappato | |
| db-schema-pair | additional.fields.DB Name_{index}.value.string_value, additional.fields.Schema Name_{index}.value.string_value |
Per ogni oggetto db-schema-pair nel log non elaborato, estrai i campi db-name e schema-name e mappali rispettivamente a DB Name_{index} e Schema Name_{index} nell'UDM, dove index è l'indice dell'oggetto nell'array. |
| db-user | principal.user.userid | Se db-user non è vuoto, mappalo come campo db-user dal log non elaborato. Altrimenti, se os-user non è vuoto e db-user è vuoto, esegui il mapping come campo os-user dal log non elaborato |
| dbName | target.resource.name | Valore del campo dbName dal log non elaborato |
| dest-ip | target.ip, target.asset.ip | Valore del campo dest-ip dal log non elaborato |
| dest-port | target.port | Valore del campo dest-port dal log non elaborato |
| descrizione | metadata.description | Se description contiene "user:", estrai l'ID utente da description e mappalo a userid. Se userid non è vuoto e description contiene "Non valido", sostituisci "Utente non valido" con "Non valido". Se application è "sshd", rimuovi "da" e "di" da description. Altrimenti, mappalo come campo description dal log non elaborato |
| dst | target.ip, target.asset.ip | Valore del campo dst dal log non elaborato |
| dstIP | target.ip, target.asset.ip | Valore del campo dstIP dal log non elaborato |
| dstPort | target.port | Valore del campo dstPort dal log non elaborato |
| event-type | metadata.product_event_type | Valore del campo event-type dal log non elaborato |
| eventType | metadata.product_event_type, metadata.event_type | Se eventType non è vuoto e srcIP e dstIP non sono vuoti, mappa eventType a metadata.product_event_type e mappa "NETWORK_CONNECTION" a metadata.event_type |
| evntDesc | security_result.description | Valore del campo evntDesc dal log non elaborato |
| exe | target.process.command_line | Valore del campo exe dal log non elaborato |
| da | network.email.from | Rimuovi "<" e ">" da from e mappalo su network.email.from |
| gruppo | target.user.group_identifiers | Valore del campo group dal log non elaborato |
| gw-ip | intermediary.ip, intermediary.asset.ip | Valore del campo gw-ip dal log non elaborato |
| host | target.hostname, target.asset.hostname | Valore del campo host dal log non elaborato |
| host-name | principal.hostname, principal.asset.hostname | Valore del campo host-name dal log non elaborato |
| nome host | principal.hostname, principal.asset.hostname | Valore del campo hostname dal log non elaborato |
| ip | target.ip, target.asset.ip | Valore del campo ip dal log non elaborato |
| mx-ip | intermediary.ip, intermediary.asset.ip | Valore del campo mx-ip dal log non elaborato |
| objects-list | additional.fields.Object_{index}.value.string_value |
Per ogni oggetto objects-list nel log non elaborato, estrai l'oggetto e mappalo in Object_{index} nel modello UDM, dove index è l'indice dell'oggetto nell'array. |
| Operazione | about.labels.Operation.value | Valore del campo Operation dal log non elaborato |
Operation type |
about.labels.Operation Type.value |
Valore del campo Operation type dal log non elaborato |
| os-user | principal.user.userid, additional.fields.OS User.value.string_value |
Se os-user non è vuoto e db-user è vuoto, esegui il mapping come campo os-user dal log non elaborato. Altrimenti, mappalo come campo OS User dal log non elaborato |
| Query analizzata | target.process.command_line | Valore del campo Parsed Query dal log non elaborato |
| parsed-query | additional.fields.Parsed Query.value.string_value |
Valore del campo parsed-query dal log non elaborato |
| pid | target.process.pid | Valore del campo pid dal log non elaborato |
| policy-id | security_result.detection_fields.Policy_ID_{index}.value |
Per ogni oggetto policy-id nel log non elaborato, estrai la norma e mappala in Policy_ID_{index} nell'UDM, dove index è l'indice dell'oggetto nell'array. |
| policyName | security_result.detection_fields.policyName_label.value | Valore del campo policyName dal log non elaborato |
| porta | target.port | Valore del campo port dal log non elaborato |
| Con privilegi | about.labels.Privileged.value | Se Privileged è true, mappalo come "True", altrimenti mappalo come "False" |
| proto | network.ip_protocol | Valore del campo proto dal log non elaborato |
| protocollo | network.ip_protocol | Se protocol è "TCP" o "UDP", esegui la mappatura come campo protocol dal log non elaborato |
| PWD | target.file.full_path | Valore del campo PWD dal log non elaborato |
Raw Data |
target.resource.attribute.labels.raw_Data.value | Valore del campo Raw Data dal log non elaborato |
| raw-query | additional.fields.Raw Query.value.string_value |
Valore del campo raw-query dal log non elaborato |
| ruleName | security_result.rule_name | Valore del campo ruleName dal log non elaborato |
| server-group | additional.fields.serve_group_label.value.string_value | Valore del campo server-group dal log non elaborato |
| service-name | additional.fields.service_name_label.value.string_value | Valore del campo service-name dal log non elaborato |
Service Type |
additional.fields.Service Type.value.string_value |
Valore del campo Service Type dal log non elaborato |
| dimensioni | network.received_bytes | Valore del campo size dal log non elaborato |
Stored Proc |
about.labels.Stored_Proc.value | Se Stored Proc è true, mappalo come "True", altrimenti mappalo come "False" |
Table Group |
target.group.group_display_name | Valore del campo Table Group dal log non elaborato |
| timestamp | metadata.event_timestamp | Valore del campo timestamp dal log non elaborato |
| a | network.email.to | Rimuovi "<" e ">" da to e mappalo su network.email.to |
| UTENTE | principal.user.userid, target.user.userid | Se USER non è vuoto e USER è "admin", esegui la mappatura come campo USER dal log non elaborato a target.user.userid. Altrimenti, se USER non è vuoto, esegui la mappatura come campo USER dal log non elaborato a principal.user.userid |
| user-authenticated | security_result.detection_fields.user_authenticated.value | Valore del campo user-authenticated dal log non elaborato |
| user-group | additional.fields.user_group_label.value.string_value | Valore del campo user-group dal log non elaborato |
| nome utente | principal.user.user_display_name | Valore del campo username dal log non elaborato |
| usrName | principal.user.userid | Valore del campo usrName dal log non elaborato |
| extensions.auth.mechanism | Codificato in modo permanente su "USERNAME_PASSWORD" se description contiene "authentication failure" (errore di autenticazione) o "check pass; user unknown" (verifica password; utente sconosciuto) o "Invalid user" (utente non valido) o "invalid user" (utente non valido) o se error non è vuoto |
|
| extensions.auth.type | Codificato in modo permanente su "AUTHTYPE_UNSPECIFIED" se has_principal è "true", has_target è "true" e event-type è "Login" |
|
| metadata.event_type | Codificato in modo permanente su "PROCESS_OPEN" se PWD non è vuoto. Codificato in modo permanente su "PROCESS_OPEN" se message contiene "starting" o application è "pman" o "CROND" o "run-parts" e event_type è vuoto. Codificato in modo permanente su "NETWORK_CONNECTION" se description è "Syslog connection established" (Connessione Syslog stabilita), "Syslog connection broken" (Connessione Syslog interrotta) o "Syslog connection failed" (Connessione Syslog non riuscita). Codificato come "EMAIL_UNCATEGORIZED" se application è "postfix/qmgr", "postfix/local" o "postfix/pickup". Codificato in modo permanente su "EMAIL_TRANSACTION" se application è "postfix/local" o "postfix/pickup" e status è "sent (delivered to mailbox)". Codificato come "NETWORK_HTTP" se application è "sshd" e description non contiene "check pass; user unknown" e description non contiene "authentication failure" e description non contiene "invalid". Codificato come "USER_LOGIN" se description contiene "authentication failure" (errore di autenticazione) o "check pass; user unknown" (verifica pass; utente sconosciuto) o "Invalid user" (utente non valido) o "invalid user" (utente non valido) o se error non è vuoto. Codificato in modo permanente su "FILE_SYNC" se file_path non è vuoto. Codificato in modo permanente su "PROCESS_UNCATEGORIZED" se message contiene "reconfigure" e application è "pman". Codificato in modo permanente su "PROCESS_TERMINATION" se message contiene "exit code 1" e application è "pman". Codificato in modo permanente su "NETWORK_CONNECTION" se eventType non è vuoto e srcIP e dstIP non sono vuoti. Codificato come "USER_LOGIN" se has_principal è "true", has_target è "true" e event-type è "Login". Codificato in modo permanente su "NETWORK_CONNECTION" se has_principal è "true", has_target è "true" e protocol non è vuoto. Codificato in modo permanente su "STATUS_UPDATE" se has_principal è "true". Codificato in modo permanente su "GENERIC_EVENT" se event_type è vuoto o "GENERIC_EVENT" |
|
| metadata.log_type | Codificato in modo permanente su "IMPERVA_DB" | |
| metadata.product_name | Codificato come "IMPERVA DB" | |
| metadata.vendor_name | Codificato come "IMPERVA DB" | |
| security_result.action | Codificato in modo permanente su "ALLOW" se description non contiene "authentication failure" (errore di autenticazione) o "check pass; user unknown" (verifica pass; utente sconosciuto) o "Invalid user" (utente non valido) o "invalid user" (utente non valido) e error è vuoto. Codificato in modo permanente su "BLOCK" se description contiene "authentication failure" (errore di autenticazione) o "check pass; user unknown" (verifica pass; utente sconosciuto) o "Invalid user" (utente non valido) o "invalid user" (utente non valido) o se error non è vuoto |
|
| security_result.rule_id | Se description contiene "alert_score" o "new_alert_score", estrai ruleid da description e mappalo a security_result.rule_id |
|
version |
metadata.product_version |
Mappato dal log delle modifiche |
source-ip |
principal.ip |
Mappato dal log delle modifiche |
source-port |
principal.port |
Mappato dal log delle modifiche |
server-group", "service-name", "user-group", "raw-query", "parsed-query", "bind-variables", "sql-error", "db-schema-pair.db-name", "db-schema-pair.schema-name", and "objects-list |
additional.fields |
Mappato dal log delle modifiche |
source-application |
principal.application |
Mappato dal log delle modifiche |
event-id |
metadata.product_log_id |
Mappato dal log delle modifiche |
application-user |
principal.user.user_display_name |
Mappato dal log delle modifiche |
mx-ip", "gw-ip |
intermediary.ip |
Mappato dal log delle modifiche |
policy-id" and "user-authenticated |
security_result.detection_fields |
Mappato dal log delle modifiche |
srcPort |
principal.port |
Mappato dal log delle modifiche |
srcIP |
principal.ip |
Mappato dal log delle modifiche |
event_name |
metadata.product_event_type |
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.