Collecter les journaux Versa Networks Secure Access Service Edge (SASE)
Ce document explique comment collecter les journaux Versa Networks Secure Access Service Edge (SASE). L'analyseur extrait les paires clé/valeur après un filtre grok initial. Il mappe ensuite ces valeurs au modèle de données unifié (UDM), en gérant différents formats de journaux tels que les événements de pare-feu, les journaux d'application et les journaux d'alarme. Il effectue également des conversions et des enrichissements pour des champs spécifiques tels que le protocole IP et le score de risque.
Avant de commencer
- Assurez-vous de disposer d'une instance Google Security Operations.
- Assurez-vous d'utiliser Windows 2016 ou une version ultérieure, ou un hôte Linux avec
systemd
. - Si vous exécutez le programme derrière un proxy, assurez-vous que les ports du pare-feu sont ouverts.
- Assurez-vous de disposer d'un accès privilégié à Versa SASE.
Obtenir le fichier d'authentification d'ingestion Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Agents de collecte.
- Téléchargez le fichier d'authentification d'ingestion. Enregistrez le fichier de manière sécurisée sur le système sur lequel l'agent Bindplane sera installé.
Obtenir l'ID client Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres SIEM> Profil.
- Copiez et enregistrez le numéro client de la section Informations sur l'organisation.
Installer l'agent BindPlane
Installation de Windows
- Ouvrez l'invite de commandes ou PowerShell en tant qu'administrateur.
Exécutez la commande suivante :
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Installation de Linux
- Ouvrez un terminal avec les droits root ou sudo.
Exécutez la commande suivante :
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Ressources d'installation supplémentaires
- Pour plus d'options d'installation, consultez ce guide d'installation.
Configurer l'agent Bindplane pour ingérer les journaux Syslog et les envoyer à Google SecOps
Accédez au fichier de configuration :
- Recherchez le fichier
config.yaml
. En règle générale, il se trouve dans le répertoire/etc/bindplane-agent/
sous Linux ou dans le répertoire d'installation sous Windows. - Ouvrez le fichier à l'aide d'un éditeur de texte (par exemple,
nano
,vi
ou le Bloc-notes).
- Recherchez le fichier
Modifiez le fichier
config.yaml
comme suit :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
Remplacez le port et l'adresse IP selon les besoins de votre infrastructure.
Remplacez
<customer_id>
par le numéro client réel.Mettez à jour
/path/to/ingestion-authentication-file.json
en indiquant le chemin d'accès où le fichier d'authentification a été enregistré dans la section Obtenir le fichier d'authentification pour l'ingestion Google SecOps.
Redémarrer l'agent Bindplane pour appliquer les modifications
Sous Linux, pour redémarrer l'agent Bindplane, exécutez la commande suivante :
sudo systemctl restart bindplane-agent
Sous Windows, pour redémarrer l'agent Bindplane, vous pouvez utiliser la console Services ou saisir la commande suivante :
net stop BindPlaneAgent && net start BindPlaneAgent
Configurer Versa Networks SASE
Les administrateurs doivent configurer des collecteurs à distance sur chaque nœud Versa Analytics pour transférer les journaux vers des systèmes tiers.
Pour configurer les nœuds d'analyse Versa, procédez comme suit :
- Activer le transfert de journaux
- Activer la journalisation des ID de session
Activer le transfert de journaux
- Connectez-vous au serveur Analytics Versa.
- Accédez à la CLI en exécutant la commande
cli
. - Passez en mode Configuration en exécutant la commande
configure
, puis saisissezload merge terminal
. Copiez et collez les commandes suivantes pour configurer le transfert de journaux :
- Remplacez
<collector_ip>
et<collector_port>
par l'adresse IP et le port de votre collecteur 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
- Remplacez
Enregistrez la configuration :
save
Activer la journalisation des ID de session
Pour enregistrer les informations liées à l'adresse IP, activez la journalisation des ID de session.
- Connectez-vous à Versa Director.
- Passez à la vue du réalisateur.
- Accédez à Configuration > Appareils > Locataire > Appareil pour accéder à Vue de l'appliance.
- Sélectionnez Configuration > Autres > Système > Configuration > Configuration.
- Dans le volet Paramètres, cliquez sur Modifier.
- Dans la fenêtre Modifier les paramètres, sélectionnez LEF.
Dans la section Pare-feu, cochez la case Inclure la journalisation des ID de session.
Cliquez sur OK.
Table de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
accCkt |
additional.fields[].key : "accCkt"additional.fields[].value.string_value : accCkt |
Valeur extraite directement du champ accCkt . |
accCktId |
additional.fields[].key : "accCktId"additional.fields[].value.string_value : accCktId |
Valeur extraite directement du champ accCktId . |
accCktName |
additional.fields[].key : "accCktName"additional.fields[].value.string_value : accCktName |
Valeur extraite directement du champ accCktName . |
accessType |
additional.fields[].key : "accessType"additional.fields[].value.string_value : accessType |
Valeur extraite directement du champ accessType . |
action |
security_result.action : action |
Si action , type , idpAction , avAction ou urlAction sont définis sur "allow", alors ALLOW . Si action , type , idpAction , avAction ou urlAction sont définis sur "reject", "drop", "block" ou "deny", alors BLOCK . Si idpAction est différent, alors UNKNOWN_ACTION . |
alarmCause |
security_result.detection_fields[].key : "alarmCause"security_result.detection_fields[].value : alarmCause |
Valeur extraite directement du champ alarmCause . |
alarmClass |
security_result.detection_fields[].key : "alarmClass"security_result.detection_fields[].value : alarmClass |
Valeur extraite directement du champ alarmClass . |
alarmClearable |
security_result.detection_fields[].key : "alarmClearable"security_result.detection_fields[].value : alarmClearable |
Valeur extraite directement du champ alarmClearable . |
alarmEventType |
metadata.product_event_type : alarmEventType |
Valeur extraite directement du champ alarmEventType . |
alarmKey |
security_result.detection_fields[].key : "alarmKey"security_result.detection_fields[].value : alarmKey |
Valeur extraite directement du champ alarmKey . |
alarmKind |
security_result.detection_fields[].key : "alarmKind"security_result.detection_fields[].value : alarmKind |
Valeur extraite directement du champ alarmKind . |
alarmOwner |
security_result.detection_fields[].key : "alarmOwner"security_result.detection_fields[].value : alarmOwner |
Valeur extraite directement du champ alarmOwner . |
alarmSeqNo |
security_result.detection_fields[].key : "alarmSeqNo"security_result.detection_fields[].value : alarmSeqNo |
Valeur extraite directement du champ alarmSeqNo . |
alarmSeverity |
security_result.severity_details : alarmSeverity |
Valeur extraite directement du champ alarmSeverity . |
alarmText |
security_result.summary : alarmText |
Valeur extraite directement du champ alarmText , sans les guillemets doubles. |
alarmType |
security_result.description : alarmType |
Valeur extraite directement du champ alarmType . |
appFamily |
metadata.product_event_type : appFamily security_result.detection_fields[].key : "appFamily"security_result.detection_fields[].value : appFamily |
Valeur extraite directement du champ appFamily . |
appId |
security_result.detection_fields[].key : "Application ID"security_result.detection_fields[].value : appId |
Valeur extraite directement du champ appId . |
appIdStr |
security_result.detection_fields[].key : "appIdStr"security_result.detection_fields[].value : appIdStr |
Valeur extraite directement du champ appIdStr . |
applianceName |
principal.hostname : applianceName |
Valeur extraite directement du champ applianceName , siteName ou site . |
appProductivity |
security_result.detection_fields[].key : "appProductivity"security_result.detection_fields[].value : appProductivity |
Valeur extraite directement du champ appProductivity . |
appRisk |
security_result.severity_details : appRisk |
Valeur extraite directement du champ appRisk . |
appSubFamily |
security_result.detection_fields[].key : "appSubFamily"security_result.detection_fields[].value : appSubFamily |
Valeur extraite directement du champ appSubFamily . |
avAccuracy |
additional.fields[].key : "avAccuracy"additional.fields[].value.string_value : avAccuracy |
Valeur extraite directement du champ avAccuracy . |
avAction |
security_result.action : avAction |
Pour en savoir plus sur la logique, consultez action . |
avMalwareName |
security_result.threat_name : avMalwareName |
Valeur extraite directement du champ avMalwareName . |
avMalwareType |
security_result.category_details : avMalwareType |
Valeur extraite directement du champ avMalwareType . |
classMsg |
security_result.description : classMsg |
Valeur extraite directement du champ classMsg , sans les guillemets doubles. |
clientIPv4Address |
target.ip : clientIPv4Address |
Valeur extraite directement du champ clientIPv4Address . |
destIp |
target.ip : destIp destinationIPv4Address : destIp |
Valeur extraite directement du champ destIp . |
destinationIPv4Address |
target.ip : destinationIPv4Address |
Valeur extraite directement du champ destinationIPv4Address ou dérivée du champ networkPrefix . |
destinationIPv6Address |
target.ip : destinationIPv6Address |
Valeur extraite directement du champ destinationIPv6Address . |
destinationPort |
target.port : destinationPort |
Valeur extraite directement du champ destinationPort et convertie en entier. |
destinationTransportPort |
target.port : destinationTransportPort |
Valeur extraite directement du champ destinationTransportPort et convertie en entier. |
deviceKey |
about.resource.attribute.labels[].key : "deviceKey"about.resource.attribute.labels[].value : deviceKey |
Valeur extraite directement du champ deviceKey si elle n'est pas "Inconnu". |
deviceName |
about.resource.attribute.labels[].key : "deviceName"about.resource.attribute.labels[].value : deviceName |
Valeur extraite directement du champ deviceName si elle n'est pas "Inconnu". |
duration |
network.session_duration.seconds : duration |
Valeur extraite directement du champ duration et convertie en entier. |
egressInterfaceName |
additional.fields[].key : "egressInterfaceName"additional.fields[].value.string_value : egressInterfaceName |
Valeur extraite directement du champ egressInterfaceName . |
event.type |
metadata.event_type : event.type |
Si applianceName (ou sourceIPv4Address ou user ou sourceIPv6Address ) et destinationIPv4Address (ou remoteSite ou destinationIPv6Address ou clientIPv4Address ou hostname ) sont présents, alors NETWORK_CONNECTION . Dans le cas contraire, STATUS_UPDATE . Si applianceName est vide, alors GENERIC_EVENT . |
eventType |
principal.resource.attribute.labels[].key : "eventType"principal.resource.attribute.labels[].value : eventType |
Valeur extraite directement du champ eventType . |
family |
security_result.detection_fields[].key : "family"security_result.detection_fields[].value : family |
Valeur extraite directement du champ family . |
fc |
security_result.detection_fields[].key : "ForwardingClass"security_result.detection_fields[].value : fc |
Valeur extraite directement du champ fc . |
fileTransDir |
additional.fields[].key : "fileTransDir"additional.fields[].value.string_value : fileTransDir |
Valeur extraite directement du champ fileTransDir . |
filename |
target.file.names : filename |
Valeur extraite directement du champ filename . |
flowCookie |
metadata.collected_timestamp : flowCookie |
Valeur extraite directement du champ flowCookie et convertie en code temporel au format UNIX. |
flowId |
principal.resource.product_object_id : flowId |
Valeur extraite directement du champ flowId . |
forwardForwardingClass |
security_result.detection_fields[].key : "forwardForwardingClass"security_result.detection_fields[].value : forwardForwardingClass |
Valeur extraite directement du champ forwardForwardingClass . |
fromCountry |
principal.location.country_or_region : fromCountry target.location.country_or_region : fromCountry |
Valeur extraite directement du champ fromCountry . |
fromUser |
principal.user.userid : fromUser |
Valeur extraite directement du champ fromUser si elle n'est pas vide, "unknown" ou "Unknown". |
fromZone |
additional.fields[].key : "fromZone"additional.fields[].value.string_value : fromZone |
Valeur extraite directement du champ fromZone . |
generateTime |
metadata.collected_timestamp : generateTime |
Valeur extraite directement du champ generateTime et convertie en code temporel au format UNIX. |
hostname |
target.hostname : hostname |
Valeur extraite directement du champ hostname . |
httpUrl |
target.url : httpUrl |
Valeur extraite directement du champ httpUrl . |
icmpTypeIPv4 |
additional.fields[].key : "icmpTypeIPv4"additional.fields[].value.string_value : icmpTypeIPv4 |
Valeur extraite directement du champ icmpTypeIPv4 . |
idpAction |
security_result.action : idpAction |
Pour en savoir plus sur la logique, consultez action . |
ingressInterfaceName |
additional.fields[].key : "ingressInterfaceName"additional.fields[].value.string_value : ingressInterfaceName |
Valeur extraite directement du champ ingressInterfaceName . |
ipsApplication |
additional.fields[].key : "ipsApplication"additional.fields[].value.string_value : ipsApplication |
Valeur extraite directement du champ ipsApplication . |
ipsDirection |
security_result.detection_fields[].key : "ipsDirection"security_result.detection_fields[].value : ipsDirection |
Valeur extraite directement du champ ipsDirection . |
ipsProfile |
security_result.detection_fields[].key : "ipsProfile"security_result.detection_fields[].value : ipsProfile |
Valeur extraite directement du champ ipsProfile . |
ipsProfileRule |
security_result.rule_name : ipsProfileRule |
Valeur extraite directement du champ ipsProfileRule . |
ipsProtocol |
network.ip_protocol : ipsProtocol |
Valeur extraite directement du champ ipsProtocol . |
log_type |
metadata.description : log_type metadata.log_type : log_type |
Valeur extraite directement du champ log_type . |
mstatsTimeBlock |
metadata.collected_timestamp : mstatsTimeBlock |
Valeur extraite directement du champ mstatsTimeBlock et convertie en code temporel au format UNIX. |
mstatsTotRecvdOctets |
network.received_bytes : mstatsTotRecvdOctets |
Valeur extraite directement du champ mstatsTotRecvdOctets et convertie en entier non signé. |
mstatsTotSentOctets |
network.sent_bytes : mstatsTotSentOctets |
Valeur extraite directement du champ mstatsTotSentOctets et convertie en entier non signé. |
mstatsTotSessCount |
additional.fields[].key : "mstatsTotSessCount"additional.fields[].value.string_value : mstatsTotSessCount |
Valeur extraite directement du champ mstatsTotSessCount . |
mstatsTotSessDuration |
network.session_duration.seconds : mstatsTotSessDuration |
Valeur extraite directement du champ mstatsTotSessDuration et convertie en entier. |
mstatsType |
security_result.category_details : mstatsType |
Valeur extraite directement du champ mstatsType . |
networkPrefix |
target.ip : networkPrefix target.port : networkPrefix |
Adresse IP extraite du champ networkPrefix . Port extrait du champ networkPrefix et converti en entier. |
protocolIdentifier |
network.ip_protocol : protocolIdentifier |
Valeur extraite directement du champ protocolIdentifier , convertie en entier et mappée au nom du protocole IP à l'aide d'une recherche. |
recvdOctets |
network.received_bytes : recvdOctets |
Valeur extraite directement du champ recvdOctets et convertie en entier non signé. |
recvdPackets |
network.received_packets : recvdPackets |
Valeur extraite directement du champ recvdPackets et convertie en entier. |
remoteSite |
target.hostname : remoteSite |
Valeur extraite directement du champ remoteSite . |
reverseForwardingClass |
security_result.detection_fields[].key : "reverseForwardingClass"security_result.detection_fields[].value : reverseForwardingClass |
Valeur extraite directement du champ reverseForwardingClass . |
risk |
security_result.risk_score : risk |
Valeur extraite directement du champ risk et convertie en float. |
rule |
security_result.rule_name : rule |
Valeur extraite directement du champ rule . |
sentOctets |
network.sent_bytes : sentOctets |
Valeur extraite directement du champ sentOctets et convertie en entier non signé. |
sentPackets |
network.sent_packets : sentPackets |
Valeur extraite directement du champ sentPackets et convertie en entier. |
serialNum |
security_result.detection_fields[].key : "serialNum"security_result.detection_fields[].value : serialNum |
Valeur extraite directement du champ serialNum . |
signatureId |
security_result.detection_fields[].key : "signatureID"security_result.detection_fields[].value : signatureId |
Valeur extraite directement du champ signatureId . |
signatureMsg |
security_result.detection_fields[].key : "signatureMsg"security_result.detection_fields[].value : signatureMsg |
Valeur extraite directement du champ signatureMsg . |
signaturePriority |
security_result.severity : signaturePriority |
Si signaturePriority est "low" (non sensible à la casse), alors LOW . Si signaturePriority est "medium" (non sensible à la casse), alors MEDIUM . Si signaturePriority est défini sur "high" (non sensible à la casse), alors HIGH . |
site |
principal.hostname : site applianceName : site |
Valeur extraite directement du champ site . |
siteId |
additional.fields[].key : "siteId"additional.fields[].value.string_value : siteId |
Valeur extraite directement du champ siteId . |
siteName |
principal.hostname : siteName applianceName : siteName |
Valeur extraite directement du champ siteName . |
sourceIPv4Address |
principal.ip : sourceIPv4Address |
Valeur extraite directement du champ sourceIPv4Address . |
sourceIPv6Address |
principal.ip : sourceIPv6Address |
Valeur extraite directement du champ sourceIPv6Address . |
sourcePort |
principal.port : sourcePort |
Valeur extraite directement du champ sourcePort et convertie en entier. |
sourceTransportPort |
principal.port : sourceTransportPort |
Valeur extraite directement du champ sourceTransportPort et convertie en entier. |
subFamily |
security_result.detection_fields[].key : "subFamily"security_result.detection_fields[].value : subFamily |
Valeur extraite directement du champ subFamily . |
tcpConnAborted |
additional.fields[].key : "tcpConnAborted"additional.fields[].value.string_value : tcpConnAborted |
Valeur extraite directement du champ tcpConnAborted si elle n'est pas vide ou égale à "0". |
tcpConnRefused |
additional.fields[].key : "tcpConnRefused"additional.fields[].value.string_value : tcpConnRefused |
Valeur extraite directement du champ tcpConnRefused si elle n'est pas vide ou égale à "0". |
tcpPktsFwd |
network.sent_packets : tcpPktsFwd |
Valeur extraite directement du champ tcpPktsFwd et convertie en entier. |
tcpPktsRev |
network.received_packets : tcpPktsRev |
Valeur extraite directement du champ tcpPktsRev et convertie en entier. |
tcpReXmitFwd |
additional.fields[].key : "tcpReXmitFwd"additional.fields[].value.string_value : tcpReXmitFwd |
Valeur extraite directement du champ tcpReXmitFwd si elle n'est pas vide ou égale à "0". |
tcpReXmitRev |
additional.fields[].key : "tcpReXmitRev"additional.fields[].value.string_value : tcpReXmitRev |
Valeur extraite directement du champ tcpReXmitRev si elle n'est pas vide ou égale à "0". |
tcpSAA |
additional.fields[].key : "tcpSAA"additional.fields[].value.string_value : tcpSAA |
Valeur extraite directement du champ tcpSAA si elle n'est pas vide ou égale à "0". |
tcpSSA |
additional.fields[].key : "tcpSSA"additional.fields[].value.string_value : tcpSSA |
Valeur extraite directement du champ tcpSSA si elle n'est pas vide ou égale à "0". |
tcpSessCnt |
additional.fields[].key : "tcpSessCnt"additional.fields[].value.string_value : tcpSessCnt |
Valeur extraite directement du champ tcpSessCnt . |
tcpSessDur |
network.session_duration.seconds : tcpSessDur |
Valeur extraite directement du champ tcpSessDur et convertie en entier. |
tcpSynAckReXmit |
additional.fields[].key : "tcpSynAckReXmit"additional.fields[].value.string_value : tcpSynAckReXmit |
Valeur extraite directement du champ tcpSynAckReXmit si elle n'est pas vide ou égale à "0". |
tcpSynReXmit |
additional.fields[].key : "tcpSynReXmit"additional.fields[].value.string_value : tcpSynReXmit |
Valeur extraite directement du champ tcpSynReXmit si elle n'est pas vide ou égale à "0". |
tcpTWHS |
additional.fields[].key : "tcpTWHS"additional.fields[].value.string_value : tcpTWHS |
Valeur extraite directement du champ tcpTWHS si elle n'est pas vide ou égale à "0". |
tenantId |
principal.resource.attribute.labels[].key : "tenantId"principal.resource.attribute.labels[].value : tenantId |
Valeur extraite directement du champ tenantId . |
tenantName |
observer.hostname : tenantName |
Valeur extraite directement du champ tenantName . |
threatType |
security_result.detection_fields[].key : "threatType"security_result.detection_fields[].value : threatType |
Valeur extraite directement du champ threatType . |
toCountry |
target.location.country_or_region : toCountry |
Valeur extraite directement du champ toCountry . |
toZone |
additional.fields[].key : "toZone"additional.fields[].value.string_value : toZone |
Valeur extraite directement du champ toZone . |
traffType |
additional.fields[].key : "traffType"additional.fields[].value.string_value : traffType |
Valeur extraite directement du champ traffType . |
ts |
metadata.event_timestamp : ts |
Valeur extraite directement du champ ts et convertie en code temporel. |
type |
security_result.action : type |
Pour en savoir plus sur la logique, consultez action . |
urlAction |
security_result.action : urlAction |
Pour en savoir plus sur la logique, consultez action . |
urlActionMessage |
security_result.summary : urlActionMessage |
Valeur extraite directement du champ urlActionMessage . |
urlCategory |
principal.resource.attribute.labels[].key : "urlCategory"principal.resource.attribute.labels[].value : urlCategory |
Valeur extraite directement du champ urlCategory . |
urlProfile |
additional.fields[].key : "urlProfile"additional.fields[].value.string_value : urlProfile |
Valeur extraite directement du champ urlProfile . |
urlReputation |
security_result.severity_details : urlReputation |
Valeur extraite directement du champ urlReputation . |
user |
principal.ip : user |
Valeur extraite directement du champ user . |
vsnId |
principal.resource.attribute.labels[].key : "vsnId"principal.resource.attribute.labels[].value : vsnId |
Valeur extraite directement du champ vsnId . Valeur codée en dur. Valeur codée en dur. |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.