Raccogliere i log di ExtraHop RevealX
Questo documento spiega come importare i log di ExtraHop RevealX in Google Security Operations utilizzando Bindplane. Il parser estrae i campi dai log formattati in JSON e Syslog. Utilizza pattern grok e logica condizionale per gestire diversi formati di log, mappando i campi estratti sull'UDM e arricchendo i dati con informazioni relative alla sicurezza come gravità e categorie. Il parser gestisce anche tipi di eventi ExtraHop specifici come DNS Rebinding, errori di autenticazione Kerberos e connessioni RDP, applicando una logica di analisi specializzata per ciascuno.
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, assicurati che le porte del firewall siano aperte.
- Accesso privilegiato a ExtraHop Reveal X
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 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.
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 log_type: 'EXTRAHOP' 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.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
Configura Syslog di ExtraHop
- Accedi all'amministrazione di ExtraHop utilizzando
https://<extrahop-hostname-or-IP-address>/admin
. - Vai a Stato e diagnostica > Log di controllo.
- Fai clic su Configura impostazioni Syslog.
- Fornisci i seguenti dettagli di configurazione:
- Destinazione: inserisci l'indirizzo IP dell'agente Bindplane.
- Protocollo: seleziona UDP o TCP, a seconda della configurazione di Bindplane.
- Porta: inserisci il numero di porta dell'agente Bindplane.
- Fai clic su Impostazioni di test.
- Fai clic su Salva.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logic |
---|---|---|
alert_name |
security_result.summary |
Il valore di alert_name del log non elaborato viene mappato a security_result.summary . |
answers[].data |
network.dns.answers[].data |
Il valore di data per ogni elemento dell'array answers del log non elaborato viene mappato al campo data dell'elemento corrispondente nell'array network.dns.answers . |
answers[].name |
network.dns.answers[].name |
Il valore di name per ogni elemento dell'array answers del log non elaborato viene mappato al campo name dell'elemento corrispondente nell'array network.dns.answers . |
answers[].ttl |
network.dns.answers[].ttl |
Il valore di ttl per ogni elemento dell'array answers del log non elaborato viene mappato al campo ttl dell'elemento corrispondente nell'array network.dns.answers . |
answers[].typeNum |
network.dns.answers[].type |
Il valore di typeNum per ogni elemento dell'array answers del log non elaborato viene mappato al campo type dell'elemento corrispondente nell'array network.dns.answers . |
client_ip |
principal.ip |
Il valore di client_ip del log non elaborato viene mappato a principal.ip . |
cn1 |
security_result.rule_labels[].value |
Il valore di cn1 del log non elaborato viene utilizzato come valore per un elemento security_result.rule_labels con la chiave "ID rilevamento". |
cn2 |
security_result.detection_fields[].value |
Il valore di cn2 del log non elaborato viene utilizzato come valore per un elemento security_result.detection_fields con la chiave "riskscore". |
cs1 |
security_result.rule_name |
Il valore di cs1 del log non elaborato viene mappato a security_result.rule_name . |
cs2 |
security_result.category_details[] |
Il valore di cs2 del log non elaborato viene aggiunto come elemento all'array security_result.category_details . |
description |
metadata.description |
Il valore di description del log non elaborato, dopo alcune operazioni di elaborazione (rimozione dei caratteri di nuova riga e delle barre rovesciate), viene mappato a metadata.description . In alcuni casi, altri campi del log non elaborato possono contribuire a questo campo o sovrascriverlo. |
details |
principal.resource.resource_subtype , security_result.summary , principal.ip |
Il campo details viene analizzato. Il valore associato alla chiave "facility" viene mappato a principal.resource.resource_subtype . Il valore associato alla chiave "details" è mappato a security_result.summary . Il valore associato alla chiave "src_ip" viene mappato a principal.ip . |
dst |
target.ip o target.mac |
Il valore di dst del log non elaborato viene mappato a target.ip se è un indirizzo IP o a target.mac se è un indirizzo MAC. |
dst_ip |
target.ip |
Il valore di dst_ip del log non elaborato viene mappato a target.ip . |
eh_event |
metadata.event_type , network.application_protocol |
Se eh_event è "dns", metadata.event_type è impostato su NETWORK_DNS e network.application_protocol è impostato su DNS . Se eh_event è "RDP", metadata.event_type è impostato su NETWORK_CONNECTION e network.application_protocol è impostato su RDP . |
event_id |
metadata.product_event_type |
Il valore di event_id del log non elaborato viene mappato a metadata.product_event_type . |
facility |
principal.resource.resource_subtype |
Il valore di facility del log non elaborato viene mappato a principal.resource.resource_subtype . |
ipaddr |
principal.ip |
Il valore di ipaddr del log non elaborato viene mappato a principal.ip . |
jsonPayload.description |
metadata.product_event_type , principal.hostname , principal.asset.hostname , security_result.summary |
Il campo jsonPayload.description viene analizzato come JSON. Il campo "operazione" è mappato a metadata.product_event_type . Il campo "event" (dopo aver rimosso "Audit Log") viene mappato a principal.hostname e principal.asset.hostname . Il campo "Dettagli" è mappato su security_result.summary . |
jsonPayload.event |
metadata.product_event_type , principal.hostname , principal.asset.hostname |
Il valore di jsonPayload.event dal log non elaborato (dopo aver rimosso "Audit Log") viene mappato a metadata.product_event_type , principal.hostname e principal.asset.hostname . |
jsonPayload.id |
metadata.product_log_id |
Il valore di jsonPayload.id del log non elaborato viene mappato a metadata.product_log_id . |
macaddr |
principal.mac |
Il valore di macaddr del log non elaborato viene mappato a principal.mac . |
name |
metadata.description |
Il valore di name del log non elaborato viene mappato a metadata.description . |
object_id |
target.resource.product_object_id |
Il valore di object_id del log non elaborato viene mappato a target.resource.product_object_id . |
object_name |
target.resource.name |
Il valore di object_name del log non elaborato viene mappato a target.resource.name . |
object_type |
target.resource.resource_type |
Il valore di object_type del log non elaborato (convertito in maiuscolo) viene mappato a target.resource.resource_type . |
operation |
metadata.product_event_type |
Il valore di operation del log non elaborato viene mappato a metadata.product_event_type . |
priority |
security_result.severity , security_result.severity_details |
Se priority è "notice", security_result.severity è impostato su MEDIUM e security_result.severity_details è impostato sul valore di priority . |
product_event_type |
metadata.product_event_type |
Il valore di product_event_type del log non elaborato viene mappato a metadata.product_event_type . Viene utilizzato anche per determinare metadata.event_type e altri campi in base al suo valore. |
qname |
network.dns.questions[].name |
Il valore di qname del log non elaborato viene mappato al campo name di un elemento network.dns.questions . |
qname_or_host |
intermediary.hostname |
Il valore di qname_or_host del log non elaborato viene mappato a intermediary.hostname . |
qtype |
network.dns.questions[].type |
Il valore di qtype del log non elaborato viene mappato al campo type di un elemento network.dns.questions , convertendo la rappresentazione della stringa nel suo equivalente numerico in base ai tipi di record DNS. |
resource.labels.project_id |
target.resource.attribute.labels[].value |
Il valore di resource.labels.project_id del log non elaborato viene utilizzato come valore per un elemento target.resource.attribute.labels con la chiave "ID progetto". |
resource.type |
target.resource.resource_subtype |
Il valore di resource.type del log non elaborato viene mappato a target.resource.resource_subtype . |
rdp_record.clientBuild |
metadata.product_version |
Il valore di rdp_record.clientBuild del log non elaborato viene mappato a metadata.product_version . |
rdp_record.clientBytes |
network.sent_bytes |
Il valore di rdp_record.clientBytes del log non elaborato viene mappato a network.sent_bytes . |
rdp_record.clientName |
principal.hostname |
Il valore di rdp_record.clientName del log non elaborato viene mappato a principal.hostname . |
rdp_record.clientPort |
principal.port |
Il valore di rdp_record.clientPort del log non elaborato viene mappato a principal.port . |
rdp_record.cookie |
principal.user.userid |
Il valore di rdp_record.cookie (dopo aver rimosso "mstshash=") dal log non elaborato viene mappato a principal.user.userid . |
rdp_record.proto |
network.ip_protocol |
Il valore di rdp_record.proto del log non elaborato viene mappato a network.ip_protocol , convertendo "TCP" in "TCP" e "UDP" in "UDP". |
rdp_record.selectedProtocol |
security_result.description |
Il valore di rdp_record.selectedProtocol del log non elaborato viene mappato a security_result.description . |
rdp_record.serverBytes |
network.received_bytes |
Il valore di rdp_record.serverBytes del log non elaborato viene mappato a network.received_bytes . |
rdp_record.serverPort |
target.port |
Il valore di rdp_record.serverPort del log non elaborato viene mappato a target.port . |
rt |
metadata.event_timestamp |
Il valore di rt del log non elaborato viene analizzato come timestamp e mappato a metadata.event_timestamp . |
severity |
security_result.severity , security_result.severity_details , event.idm.is_alert , event.idm.is_significant |
Il valore di severity è mappato a security_result.severity_details . Viene utilizzato anche per determinare il valore di security_result.severity , event.idm.is_alert e event.idm.is_significant . |
src |
principal.ip o principal.mac |
Il valore di src del log non elaborato viene mappato a principal.ip se è un indirizzo IP o a principal.mac se è un indirizzo MAC. |
src_ip |
principal.ip o principal.mac |
Il valore di src_ip del log non elaborato viene mappato a principal.ip se è un indirizzo IP o a principal.mac se è un indirizzo MAC. |
summary |
security_result.summary |
Il valore di summary del log non elaborato viene mappato a security_result.summary . |
ts |
metadata.event_timestamp |
Il valore di ts del log non elaborato viene analizzato come timestamp e mappato a metadata.event_timestamp . |
user |
principal.user.userid |
Il valore di user del log non elaborato viene mappato a principal.user.userid . |
(N/A) | metadata.log_type |
Impostato sempre su "EXTRAHOP". |
(N/A) | metadata.vendor_name |
Impostato sempre su "EXTRAHOP". |
(N/A) | metadata.product_name |
Impostato sempre su "EXTRAHOP". |
(N/A) | security_result.severity |
Impostato su CRITICAL per impostazione predefinita o in base al valore di severity o priority . |
(N/A) | event.idm.is_alert |
Imposta su true se security_result.severity è "HIGH" o "CRITICAL". |
(N/A) | event.idm.is_significant |
Imposta su true se security_result.severity è "HIGH" o "CRITICAL". |
(N/A) | metadata.event_type |
Determinato in base ai valori di altri campi, come eh_event , product_event_type , has_principal e dst . Il valore predefinito è GENERIC_EVENT . |
(N/A) | network.application_protocol |
Imposta su DNS se eh_event è "dns" o message contiene "DNS Rebinding". Imposta su RDP se eh_event è "RDP". |
(N/A) | security_result.rule_labels[].key |
Imposta "ID rilevamento" per l'etichetta della regola derivata da cn1 . |
(N/A) | security_result.detection_fields[].key |
Imposta "riskscore" per il campo di rilevamento derivato da cn2 . |
(N/A) | principal.user.attribute.roles[].type |
Imposta su SERVICE_ACCOUNT se è presente user_name . |
(N/A) | extensions.auth.type |
Impostato su SSO se product_event_type è "Kerberos Client Auth Errors". |
(N/A) | extensions.auth.mechanism |
Imposta su USERNAME_PASSWORD se product_event_type è "Autenticazione LDAP non sicura" o "Errori di autenticazione client Kerberos". |
(N/A) | security_result.category |
Imposta su NETWORK_SUSPICIOUS se product_event_type è "Scansione di ricerca inversa interna DNS" o contiene "Connessioni sospette in entrata". Imposta su NETWORK_MALICIOUS se product_event_type è "Request to External Database Server". |
(N/A) | network.http.response_code |
Impostato in base a status_code estratto da product_event_type se corrisponde al pattern "HTTP Server %{INT:status_code} %{GREEDYDATA}". |
jsonPayload.cs1 |
security_result.detection_fields[].value |
Il valore di jsonPayload.cs1 del log non elaborato viene utilizzato come valore per un elemento security_result.detection_fields . |
jsonPayload.cn1 |
security_result.detection_fields[].value |
Il valore di jsonPayload.cn1 del log non elaborato viene utilizzato come valore per un elemento security_result.detection_fields . |
jsonPayload.cn2 |
security_result.detection_fields[].value |
Il valore di jsonPayload.cn2 del log non elaborato viene utilizzato come valore per un elemento security_result.detection_fields . |
jsonPayload.cs1Label , jsonPayload.cn1Label , jsonPayload.cn2Label |
security_result.detection_fields[].key |
Questi campi del log non elaborato vengono utilizzati come chiavi per gli elementi corrispondenti in security_result.detection_fields . |
jsonPayload.src |
principal.ip |
Il valore di jsonPayload.src del log non elaborato viene mappato a principal.ip . |
jsonPayload.dst |
target.ip |
Il valore di jsonPayload.dst del log non elaborato viene mappato a target.ip . |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.