Raccogli i log di Versa Networks Secure Access Service Edge (SASE)
Questo documento descrive come raccogliere i log di Versa Networks Secure Access Service Edge (SASE). Il parser estrae le coppie chiave-valore dopo un filtro grok iniziale. Poi mappa questi valori al modello di dati unificato (UDM), gestisce vari formati di log come eventi della firewall, log delle applicazioni e log di avviso ed esegue conversioni e arricchimenti per campi specifici come protocollo IP e punteggio di rischio.
Prima di iniziare
- Assicurati di avere un'istanza Google Security Operations.
- Assicurati di utilizzare Windows 2016 o versioni successive o un host Linux con
systemd
. - Se il servizio è in esecuzione dietro un proxy, assicurati che le porte del firewall siano aperte.
- Assicurati di disporre dell'accesso privilegiato a Versa SASE.
Recupera il file di autenticazione di importazione di Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Agenti di raccolta.
- Scarica il file di autenticazione dell'importazione. Salva il file in modo sicuro sul sistema in cui verrà installato BindPlane.
Ottenere 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 BindPlane Agent
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 di installazione aggiuntive
- Per altre opzioni di installazione, consulta questa guida all'installazione.
Configurare l'agente BindPlane per importare i 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: 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 come richiesto nella tua infrastruttura.
Sostituisci
<customer_id>
con l'ID cliente effettivo.Aggiorna
/path/to/ingestion-authentication-file.json
con il percorso in cui è stato salvato il file di autenticazione nella sezione Ottenere il file di autenticazione per l'importazione di Google SecOps.
Riavvia BindPlane Agent per applicare le modifiche
In Linux, per riavviare BindPlane Agent, esegui il seguente 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
Configura Versa Networks SASE
Gli amministratori devono configurare i collector remoti su ogni nodo Versa Analytics per inoltrare i log a sistemi di terze parti.
Per configurare i nodi di analisi di Versa:
- Attivare il Forwarding dei log
- Attivare il logging dell'ID sessione
Attivare il Forwarding dei log
- Accedi al server Versa Analytics.
- Vai all'interfaccia a riga di comando 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 il Forwarding dei log:
- Sostituisci
<collector_ip>
e<collector_port>
con l'indirizzo IP e la porta del tuo collector 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
Attivare il logging dell'ID sessione
Per registrare le informazioni relative all'IP, attiva il logging dell'ID sessione.
- Accedi a Versa Director.
- Passa alla visualizzazione regista.
- Vai a Configurazione > Dispositivi > Tenant > Dispositivo per accedere a Visualizzazione dell'appliance.
- Seleziona Configurazione > Altro > Sistema > Configurazione > Configurazione.
- Nel riquadro Parametri, fai clic su Modifica.
- Nella finestra Modifica parametri, seleziona LEF.
Nella sezione Firewall, seleziona la casella di controllo Includi registrazione dell'ID sessione.
Fai clic su OK.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logica |
---|---|---|
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 "allow", 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 preso 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 : "Application ID"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 preso 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, consulta 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 preso 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 preso direttamente dal campo destinationPort e convertito in numero intero. |
destinationTransportPort |
target.port : destinationTransportPort |
Valore preso direttamente dal campo destinationTransportPort e convertito in numero intero. |
deviceKey |
about.resource.attribute.labels[].key : "deviceKey"about.resource.attribute.labels[].value : deviceKey |
Valore preso direttamente dal campo deviceKey , se non "Sconosciuto". |
deviceName |
about.resource.attribute.labels[].key : "deviceName"about.resource.attribute.labels[].value : deviceName |
Valore preso direttamente dal campo deviceName , se non "Sconosciuto". |
duration |
network.session_duration.seconds : duration |
Valore preso 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 . In caso contrario, 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 preso 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 preso direttamente dal campo fromUser , se non vuoto, "unknown" 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 preso 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, consulta 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 preso direttamente dal campo mstatsTimeBlock e convertito in timestamp utilizzando il formato UNIX. |
mstatsTotRecvdOctets |
network.received_bytes : mstatsTotRecvdOctets |
Valore preso direttamente dal campo mstatsTotRecvdOctets e convertito in numero intero non firmato. |
mstatsTotSentOctets |
network.sent_bytes : mstatsTotSentOctets |
Valore preso direttamente dal campo mstatsTotSentOctets e convertito in numero intero non firmato. |
mstatsTotSessCount |
additional.fields[].key : "mstatsTotSessCount"additional.fields[].value.string_value : mstatsTotSessCount |
Valore preso direttamente dal campo mstatsTotSessCount . |
mstatsTotSessDuration |
network.session_duration.seconds : mstatsTotSessDuration |
Valore preso 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 preso direttamente dal campo protocolIdentifier , convertito in numero intero e mappato al nome del protocollo IP utilizzando una ricerca. |
recvdOctets |
network.received_bytes : recvdOctets |
Valore preso direttamente dal campo recvdOctets e convertito in numero intero non firmato. |
recvdPackets |
network.received_packets : recvdPackets |
Valore preso 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 preso direttamente dal campo risk e convertito in float. |
rule |
security_result.rule_name : rule |
Valore preso direttamente dal campo rule . |
sentOctets |
network.sent_bytes : sentOctets |
Valore preso direttamente dal campo sentOctets e convertito in numero intero non firmato. |
sentPackets |
network.sent_packets : sentPackets |
Valore preso 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), LOW . Se signaturePriority è "medium" (senza distinzione tra maiuscole e minuscole), MEDIUM . Se signaturePriority è "high" (senza distinzione tra maiuscole e minuscole), 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 preso direttamente dal campo sourcePort e convertito in numero intero. |
sourceTransportPort |
principal.port : sourceTransportPort |
Valore preso 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 preso direttamente dal campo tcpConnAborted , se non vuoto o "0". |
tcpConnRefused |
additional.fields[].key : "tcpConnRefused"additional.fields[].value.string_value : tcpConnRefused |
Valore preso direttamente dal campo tcpConnRefused , se non vuoto o "0". |
tcpPktsFwd |
network.sent_packets : tcpPktsFwd |
Valore preso direttamente dal campo tcpPktsFwd e convertito in numero intero. |
tcpPktsRev |
network.received_packets : tcpPktsRev |
Valore preso direttamente dal campo tcpPktsRev e convertito in numero intero. |
tcpReXmitFwd |
additional.fields[].key : "tcpReXmitFwd"additional.fields[].value.string_value : tcpReXmitFwd |
Valore preso direttamente dal campo tcpReXmitFwd , se non vuoto o "0". |
tcpReXmitRev |
additional.fields[].key : "tcpReXmitRev"additional.fields[].value.string_value : tcpReXmitRev |
Valore preso direttamente dal campo tcpReXmitRev , se non vuoto o "0". |
tcpSAA |
additional.fields[].key : "tcpSAA"additional.fields[].value.string_value : tcpSAA |
Valore preso direttamente dal campo tcpSAA , se non vuoto o "0". |
tcpSSA |
additional.fields[].key : "tcpSSA"additional.fields[].value.string_value : tcpSSA |
Valore preso 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 preso direttamente dal campo tcpSessDur e convertito in numero intero. |
tcpSynAckReXmit |
additional.fields[].key : "tcpSynAckReXmit"additional.fields[].value.string_value : tcpSynAckReXmit |
Valore preso direttamente dal campo tcpSynAckReXmit , se non vuoto o "0". |
tcpSynReXmit |
additional.fields[].key : "tcpSynReXmit"additional.fields[].value.string_value : tcpSynReXmit |
Valore preso direttamente dal campo tcpSynReXmit , se non vuoto o "0". |
tcpTWHS |
additional.fields[].key : "tcpTWHS"additional.fields[].value.string_value : tcpTWHS |
Valore preso 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 preso direttamente dal campo ts e convertito in timestamp. |
type |
security_result.action : type |
Per la logica, consulta action . |
urlAction |
security_result.action : urlAction |
Per la logica, consulta 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. |
Modifiche
2024-06-03
- "idpAction" è stato mappato a "security_result.action".
- "threatType" è stato mappato a "security_result.detection_fields".
- "ipsDirection" è stato mappato a "security_result.detection_fields".
- "ipsProfile" è stato mappato a "security_result.detection_fields".
- "signaturePriority" è stato mappato a "security_result.severity".
- "signatureMsg" è stato mappato a "security_result.detection_fields".
- "signatureId" è stato mappato a "security_result.detection_fields".
- "ipsApplication" è stato mappato a "security_result.detection_fields".
- "classMsg" è stato mappato a "security_result.description".
- "ipsProfileRule" è stato mappato a "security_result.rule_name".
- "ipsProtocol" è stato mappato a "network.ip_protocol".
2023-07-03
- È stato aggiunto il supporto per "entitlementlog", "monstatslog" e "tcpappmonlog".
2022-11-04
- Parser creato da Mewly.