Raccogliere i log di Secure Access Service Edge (SASE) di Versa Networks
Questo documento descrive come raccogliere i log di Versa Networks Secure Access Service Edge (SASE). L'analizzatore sintattico estrae le coppie chiave-valore dopo un filtro grok iniziale. Quindi, mappa questi valori al modello di dati unificato (UDM), gestendo vari formati di log come eventi firewall, log delle applicazioni e log degli allarmi, ed esegue conversioni e arricchimenti per campi specifici come il protocollo IP e il punteggio di rischio.
Prima di iniziare
- Assicurati di avere un'istanza Google Security Operations.
- Assicurati di utilizzare 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.
- Assicurati di disporre dell'accesso con privilegi a Versa SASE.
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 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
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 questa guida all'installazione.
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
,vi
o Blocco note).
- Individua il file
Modifica il file
config.yaml
come segue:receivers: tcplog: # Replace the port and IP address as required listen_address: "0.0.0.0:54525" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds: `/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: SYSLOG namespace: versa_networks_sase raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - tcplog 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
In Linux, per riavviare Bindplane Agent, esegui questo comando:
sudo systemctl restart bindplane-agent
In Windows, per riavviare l'agente Bindplane, puoi utilizzare la console Servizi o inserire il seguente comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Configurare SASE di Versa Networks
Gli amministratori devono configurare i raccoglitori remoti su ogni nodo Versa Analytics per inoltrare i log a sistemi di terze parti.
Per configurare i nodi di analisi di Versa:
- Abilita l'inoltro dei log
- Abilitare la registrazione dell'ID sessione
Abilita l'inoltro dei log
- Accedi al server di analisi di Versa.
- Vai a CLI eseguendo il comando
cli
. - Passa alla modalità di configurazione eseguendo il comando
configure
, quindi inserisciload merge terminal
. Copia e incolla i seguenti comandi per configurare l'inoltro dei log:
- Sostituisci
<collector_ip>
e<collector_port>
con l'indirizzo IP e la porta del raccoglitore syslog (Bindplane).
set system analytics log-collector-exporter destination-address <collector_ip> set system analytics log-collector-exporter destination-port <collector_port> set system analytics log-collector-exporter transport tcp set system analytics log-collector-exporter log-types firewall-log set system analytics log-collector-exporter log-types threat-log commit
- Sostituisci
Salva la configurazione:
save
Abilitare la registrazione dell'ID sessione
Per registrare le informazioni relative all'IP, attiva la registrazione dell'ID sessione.
- Accedi a Versa Director.
- Passa alla visualizzazione del regista.
- Vai a Configurazione > Dispositivi > Tenant > Dispositivo per accedere a Visualizzazione appliance.
- Seleziona Configuration > Others > System > Configuration > Configuration.
- Nel riquadro Parametri, fai clic su Modifica.
- Nella finestra Modifica parametri, seleziona LEF.
Nella sezione Firewall, seleziona la casella di controllo Includi registrazione ID sessione.
Fai clic su OK.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logic |
---|---|---|
accCkt |
additional.fields[].key : "accCkt"additional.fields[].value.string_value : accCkt |
Valore preso direttamente dal campo accCkt . |
accCktId |
additional.fields[].key : "accCktId"additional.fields[].value.string_value : accCktId |
Valore preso direttamente dal campo accCktId . |
accCktName |
additional.fields[].key : "accCktName"additional.fields[].value.string_value : accCktName |
Valore preso direttamente dal campo accCktName . |
accessType |
additional.fields[].key : "accessType"additional.fields[].value.string_value : accessType |
Valore preso direttamente dal campo accessType . |
action |
security_result.action : action |
Se action , type , idpAction , avAction o urlAction sono impostati su "consenti", allora ALLOW . Se action , type , idpAction , avAction o urlAction sono "reject", "drop", "block", "deny", allora BLOCK . Se idpAction è diverso da UNKNOWN_ACTION . |
alarmCause |
security_result.detection_fields[].key : "alarmCause"security_result.detection_fields[].value : alarmCause |
Valore preso direttamente dal campo alarmCause . |
alarmClass |
security_result.detection_fields[].key : "alarmClass"security_result.detection_fields[].value : alarmClass |
Valore preso direttamente dal campo alarmClass . |
alarmClearable |
security_result.detection_fields[].key : "alarmClearable"security_result.detection_fields[].value : alarmClearable |
Valore preso direttamente dal campo alarmClearable . |
alarmEventType |
metadata.product_event_type : alarmEventType |
Valore preso direttamente dal campo alarmEventType . |
alarmKey |
security_result.detection_fields[].key : "alarmKey"security_result.detection_fields[].value : alarmKey |
Valore preso direttamente dal campo alarmKey . |
alarmKind |
security_result.detection_fields[].key : "alarmKind"security_result.detection_fields[].value : alarmKind |
Valore preso direttamente dal campo alarmKind . |
alarmOwner |
security_result.detection_fields[].key : "alarmOwner"security_result.detection_fields[].value : alarmOwner |
Valore preso direttamente dal campo alarmOwner . |
alarmSeqNo |
security_result.detection_fields[].key : "alarmSeqNo"security_result.detection_fields[].value : alarmSeqNo |
Valore preso direttamente dal campo alarmSeqNo . |
alarmSeverity |
security_result.severity_details : alarmSeverity |
Valore preso direttamente dal campo alarmSeverity . |
alarmText |
security_result.summary : alarmText |
Valore estratto direttamente dal campo alarmText , con le virgolette doppie rimosse. |
alarmType |
security_result.description : alarmType |
Valore preso direttamente dal campo alarmType . |
appFamily |
metadata.product_event_type : appFamily security_result.detection_fields[].key : "appFamily"security_result.detection_fields[].value : appFamily |
Valore preso direttamente dal campo appFamily . |
appId |
security_result.detection_fields[].key : "ID applicazione"security_result.detection_fields[].value : appId |
Valore preso direttamente dal campo appId . |
appIdStr |
security_result.detection_fields[].key : "appIdStr"security_result.detection_fields[].value : appIdStr |
Valore preso direttamente dal campo appIdStr . |
applianceName |
principal.hostname : applianceName |
Valore estratto direttamente dal campo applianceName , siteName o site . |
appProductivity |
security_result.detection_fields[].key : "appProductivity"security_result.detection_fields[].value : appProductivity |
Valore preso direttamente dal campo appProductivity . |
appRisk |
security_result.severity_details : appRisk |
Valore preso direttamente dal campo appRisk . |
appSubFamily |
security_result.detection_fields[].key : "appSubFamily"security_result.detection_fields[].value : appSubFamily |
Valore preso direttamente dal campo appSubFamily . |
avAccuracy |
additional.fields[].key : "avAccuracy"additional.fields[].value.string_value : avAccuracy |
Valore preso direttamente dal campo avAccuracy . |
avAction |
security_result.action : avAction |
Per la logica, vedi action . |
avMalwareName |
security_result.threat_name : avMalwareName |
Valore preso direttamente dal campo avMalwareName . |
avMalwareType |
security_result.category_details : avMalwareType |
Valore preso direttamente dal campo avMalwareType . |
classMsg |
security_result.description : classMsg |
Valore estratto direttamente dal campo classMsg , con le virgolette doppie rimosse. |
clientIPv4Address |
target.ip : clientIPv4Address |
Valore preso direttamente dal campo clientIPv4Address . |
destIp |
target.ip : destIp destinationIPv4Address : destIp |
Valore preso direttamente dal campo destIp . |
destinationIPv4Address |
target.ip : destinationIPv4Address |
Valore preso direttamente dal campo destinationIPv4Address o derivato dal campo networkPrefix . |
destinationIPv6Address |
target.ip : destinationIPv6Address |
Valore preso direttamente dal campo destinationIPv6Address . |
destinationPort |
target.port : destinationPort |
Valore estratto direttamente dal campo destinationPort e convertito in numero intero. |
destinationTransportPort |
target.port : destinationTransportPort |
Valore estratto direttamente dal campo destinationTransportPort e convertito in numero intero. |
deviceKey |
about.resource.attribute.labels[].key : "deviceKey"about.resource.attribute.labels[].value : deviceKey |
Valore estratto direttamente dal campo deviceKey se non è "Sconosciuto". |
deviceName |
about.resource.attribute.labels[].key : "deviceName"about.resource.attribute.labels[].value : deviceName |
Valore estratto direttamente dal campo deviceName se non è "Sconosciuto". |
duration |
network.session_duration.seconds : duration |
Valore estratto direttamente dal campo duration e convertito in numero intero. |
egressInterfaceName |
additional.fields[].key : "egressInterfaceName"additional.fields[].value.string_value : egressInterfaceName |
Valore preso direttamente dal campo egressInterfaceName . |
event.type |
metadata.event_type : event.type |
Se sono presenti sia applianceName (o sourceIPv4Address o user o sourceIPv6Address ) sia destinationIPv4Address (o remoteSite o destinationIPv6Address o clientIPv4Address o hostname ), allora NETWORK_CONNECTION . Altrimenti, STATUS_UPDATE . Se applianceName è vuoto, allora GENERIC_EVENT . |
eventType |
principal.resource.attribute.labels[].key : "eventType"principal.resource.attribute.labels[].value : eventType |
Valore preso direttamente dal campo eventType . |
family |
security_result.detection_fields[].key : "family"security_result.detection_fields[].value : family |
Valore preso direttamente dal campo family . |
fc |
security_result.detection_fields[].key : "ForwardingClass"security_result.detection_fields[].value : fc |
Valore preso direttamente dal campo fc . |
fileTransDir |
additional.fields[].key : "fileTransDir"additional.fields[].value.string_value : fileTransDir |
Valore preso direttamente dal campo fileTransDir . |
filename |
target.file.names : filename |
Valore preso direttamente dal campo filename . |
flowCookie |
metadata.collected_timestamp : flowCookie |
Valore estratto direttamente dal campo flowCookie e convertito in timestamp utilizzando il formato UNIX. |
flowId |
principal.resource.product_object_id : flowId |
Valore preso direttamente dal campo flowId . |
forwardForwardingClass |
security_result.detection_fields[].key : "forwardForwardingClass"security_result.detection_fields[].value : forwardForwardingClass |
Valore preso direttamente dal campo forwardForwardingClass . |
fromCountry |
principal.location.country_or_region : fromCountry target.location.country_or_region : fromCountry |
Valore preso direttamente dal campo fromCountry . |
fromUser |
principal.user.userid : fromUser |
Valore estratto direttamente dal campo fromUser se non è vuoto, "sconosciuto" o "Sconosciuto". |
fromZone |
additional.fields[].key : "fromZone"additional.fields[].value.string_value : fromZone |
Valore preso direttamente dal campo fromZone . |
generateTime |
metadata.collected_timestamp : generateTime |
Valore estratto direttamente dal campo generateTime e convertito in timestamp utilizzando il formato UNIX. |
hostname |
target.hostname : hostname |
Valore preso direttamente dal campo hostname . |
httpUrl |
target.url : httpUrl |
Valore preso direttamente dal campo httpUrl . |
icmpTypeIPv4 |
additional.fields[].key : "icmpTypeIPv4"additional.fields[].value.string_value : icmpTypeIPv4 |
Valore preso direttamente dal campo icmpTypeIPv4 . |
idpAction |
security_result.action : idpAction |
Per la logica, vedi action . |
ingressInterfaceName |
additional.fields[].key : "ingressInterfaceName"additional.fields[].value.string_value : ingressInterfaceName |
Valore preso direttamente dal campo ingressInterfaceName . |
ipsApplication |
additional.fields[].key : "ipsApplication"additional.fields[].value.string_value : ipsApplication |
Valore preso direttamente dal campo ipsApplication . |
ipsDirection |
security_result.detection_fields[].key : "ipsDirection"security_result.detection_fields[].value : ipsDirection |
Valore preso direttamente dal campo ipsDirection . |
ipsProfile |
security_result.detection_fields[].key : "ipsProfile"security_result.detection_fields[].value : ipsProfile |
Valore preso direttamente dal campo ipsProfile . |
ipsProfileRule |
security_result.rule_name : ipsProfileRule |
Valore preso direttamente dal campo ipsProfileRule . |
ipsProtocol |
network.ip_protocol : ipsProtocol |
Valore preso direttamente dal campo ipsProtocol . |
log_type |
metadata.description : log_type metadata.log_type : log_type |
Valore preso direttamente dal campo log_type . |
mstatsTimeBlock |
metadata.collected_timestamp : mstatsTimeBlock |
Valore estratto direttamente dal campo mstatsTimeBlock e convertito in timestamp utilizzando il formato UNIX. |
mstatsTotRecvdOctets |
network.received_bytes : mstatsTotRecvdOctets |
Valore estratto direttamente dal campo mstatsTotRecvdOctets e convertito in numero intero senza segno. |
mstatsTotSentOctets |
network.sent_bytes : mstatsTotSentOctets |
Valore estratto direttamente dal campo mstatsTotSentOctets e convertito in numero intero senza segno. |
mstatsTotSessCount |
additional.fields[].key : "mstatsTotSessCount"additional.fields[].value.string_value : mstatsTotSessCount |
Valore preso direttamente dal campo mstatsTotSessCount . |
mstatsTotSessDuration |
network.session_duration.seconds : mstatsTotSessDuration |
Valore estratto direttamente dal campo mstatsTotSessDuration e convertito in numero intero. |
mstatsType |
security_result.category_details : mstatsType |
Valore preso direttamente dal campo mstatsType . |
networkPrefix |
target.ip : networkPrefix target.port : networkPrefix |
Indirizzo IP estratto dal campo networkPrefix . Porta estratta dal campo networkPrefix e convertita in numero intero. |
protocolIdentifier |
network.ip_protocol : protocolIdentifier |
Valore estratto direttamente dal campo protocolIdentifier , convertito in numero intero e mappato al nome del protocollo IP utilizzando una ricerca. |
recvdOctets |
network.received_bytes : recvdOctets |
Valore estratto direttamente dal campo recvdOctets e convertito in numero intero senza segno. |
recvdPackets |
network.received_packets : recvdPackets |
Valore estratto direttamente dal campo recvdPackets e convertito in numero intero. |
remoteSite |
target.hostname : remoteSite |
Valore preso direttamente dal campo remoteSite . |
reverseForwardingClass |
security_result.detection_fields[].key : "reverseForwardingClass"security_result.detection_fields[].value : reverseForwardingClass |
Valore preso direttamente dal campo reverseForwardingClass . |
risk |
security_result.risk_score : risk |
Valore estratto direttamente dal campo risk e convertito in virgola mobile. |
rule |
security_result.rule_name : rule |
Valore preso direttamente dal campo rule . |
sentOctets |
network.sent_bytes : sentOctets |
Valore estratto direttamente dal campo sentOctets e convertito in numero intero senza segno. |
sentPackets |
network.sent_packets : sentPackets |
Valore estratto direttamente dal campo sentPackets e convertito in numero intero. |
serialNum |
security_result.detection_fields[].key : "serialNum"security_result.detection_fields[].value : serialNum |
Valore preso direttamente dal campo serialNum . |
signatureId |
security_result.detection_fields[].key : "signatureID"security_result.detection_fields[].value : signatureId |
Valore preso direttamente dal campo signatureId . |
signatureMsg |
security_result.detection_fields[].key : "signatureMsg"security_result.detection_fields[].value : signatureMsg |
Valore preso direttamente dal campo signatureMsg . |
signaturePriority |
security_result.severity : signaturePriority |
Se signaturePriority è "low" (senza distinzione tra maiuscole e minuscole), allora LOW . Se signaturePriority è "medium" (senza distinzione tra maiuscole e minuscole), allora MEDIUM . Se signaturePriority è "alto" (senza distinzione tra maiuscole e minuscole), allora HIGH . |
site |
principal.hostname : site applianceName : site |
Valore preso direttamente dal campo site . |
siteId |
additional.fields[].key : "siteId"additional.fields[].value.string_value : siteId |
Valore preso direttamente dal campo siteId . |
siteName |
principal.hostname : siteName applianceName : siteName |
Valore preso direttamente dal campo siteName . |
sourceIPv4Address |
principal.ip : sourceIPv4Address |
Valore preso direttamente dal campo sourceIPv4Address . |
sourceIPv6Address |
principal.ip : sourceIPv6Address |
Valore preso direttamente dal campo sourceIPv6Address . |
sourcePort |
principal.port : sourcePort |
Valore estratto direttamente dal campo sourcePort e convertito in numero intero. |
sourceTransportPort |
principal.port : sourceTransportPort |
Valore estratto direttamente dal campo sourceTransportPort e convertito in numero intero. |
subFamily |
security_result.detection_fields[].key : "subFamily"security_result.detection_fields[].value : subFamily |
Valore preso direttamente dal campo subFamily . |
tcpConnAborted |
additional.fields[].key : "tcpConnAborted"additional.fields[].value.string_value : tcpConnAborted |
Valore estratto direttamente dal campo tcpConnAborted se non è vuoto o "0". |
tcpConnRefused |
additional.fields[].key : "tcpConnRefused"additional.fields[].value.string_value : tcpConnRefused |
Valore estratto direttamente dal campo tcpConnRefused se non è vuoto o "0". |
tcpPktsFwd |
network.sent_packets : tcpPktsFwd |
Valore estratto direttamente dal campo tcpPktsFwd e convertito in numero intero. |
tcpPktsRev |
network.received_packets : tcpPktsRev |
Valore estratto direttamente dal campo tcpPktsRev e convertito in numero intero. |
tcpReXmitFwd |
additional.fields[].key : "tcpReXmitFwd"additional.fields[].value.string_value : tcpReXmitFwd |
Valore estratto direttamente dal campo tcpReXmitFwd se non è vuoto o "0". |
tcpReXmitRev |
additional.fields[].key : "tcpReXmitRev"additional.fields[].value.string_value : tcpReXmitRev |
Valore estratto direttamente dal campo tcpReXmitRev se non è vuoto o "0". |
tcpSAA |
additional.fields[].key : "tcpSAA"additional.fields[].value.string_value : tcpSAA |
Valore estratto direttamente dal campo tcpSAA se non è vuoto o "0". |
tcpSSA |
additional.fields[].key : "tcpSSA"additional.fields[].value.string_value : tcpSSA |
Valore estratto direttamente dal campo tcpSSA se non è vuoto o "0". |
tcpSessCnt |
additional.fields[].key : "tcpSessCnt"additional.fields[].value.string_value : tcpSessCnt |
Valore preso direttamente dal campo tcpSessCnt . |
tcpSessDur |
network.session_duration.seconds : tcpSessDur |
Valore estratto direttamente dal campo tcpSessDur e convertito in numero intero. |
tcpSynAckReXmit |
additional.fields[].key : "tcpSynAckReXmit"additional.fields[].value.string_value : tcpSynAckReXmit |
Valore estratto direttamente dal campo tcpSynAckReXmit se non è vuoto o "0". |
tcpSynReXmit |
additional.fields[].key : "tcpSynReXmit"additional.fields[].value.string_value : tcpSynReXmit |
Valore estratto direttamente dal campo tcpSynReXmit se non è vuoto o "0". |
tcpTWHS |
additional.fields[].key : "tcpTWHS"additional.fields[].value.string_value : tcpTWHS |
Valore estratto direttamente dal campo tcpTWHS se non è vuoto o "0". |
tenantId |
principal.resource.attribute.labels[].key : "tenantId"principal.resource.attribute.labels[].value : tenantId |
Valore preso direttamente dal campo tenantId . |
tenantName |
observer.hostname : tenantName |
Valore preso direttamente dal campo tenantName . |
threatType |
security_result.detection_fields[].key : "threatType"security_result.detection_fields[].value : threatType |
Valore preso direttamente dal campo threatType . |
toCountry |
target.location.country_or_region : toCountry |
Valore preso direttamente dal campo toCountry . |
toZone |
additional.fields[].key : "toZone"additional.fields[].value.string_value : toZone |
Valore preso direttamente dal campo toZone . |
traffType |
additional.fields[].key : "traffType"additional.fields[].value.string_value : traffType |
Valore preso direttamente dal campo traffType . |
ts |
metadata.event_timestamp : ts |
Valore estratto direttamente dal campo ts e convertito in timestamp. |
type |
security_result.action : type |
Per la logica, vedi action . |
urlAction |
security_result.action : urlAction |
Per la logica, vedi action . |
urlActionMessage |
security_result.summary : urlActionMessage |
Valore preso direttamente dal campo urlActionMessage . |
urlCategory |
principal.resource.attribute.labels[].key : "urlCategory"principal.resource.attribute.labels[].value : urlCategory |
Valore preso direttamente dal campo urlCategory . |
urlProfile |
additional.fields[].key : "urlProfile"additional.fields[].value.string_value : urlProfile |
Valore preso direttamente dal campo urlProfile . |
urlReputation |
security_result.severity_details : urlReputation |
Valore preso direttamente dal campo urlReputation . |
user |
principal.ip : user |
Valore preso direttamente dal campo user . |
vsnId |
principal.resource.attribute.labels[].key : "vsnId"principal.resource.attribute.labels[].value : vsnId |
Valore preso direttamente dal campo vsnId . Valore hardcoded. Valore hardcoded. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.