Collecter les journaux SASE (Secure Access Service Edge) de Versa Networks
Ce document explique comment collecter les journaux SASE (Secure Access Service Edge) de Versa Networks. L'analyseur extrait les paires clé-valeur après un filtre grok initial. Il mappe ensuite ces valeurs sur le modèle de données unifié (UDM), gère différents formats de journaux tels que les événements de pare-feu, les journaux d'application et les journaux d'alarme, et effectue 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 l'application 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 BindPlane sera installé.
Obtenir le numéro client Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Profil.
- Copiez et sauvegardez l'ID client dans la section Détails de l'organisation.
Installer l'agent BindPlane
Installation de Windows
- Ouvrez l'invite de commande 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 des 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
Autres ressources d'installation
- Pour plus d'options d'installation, consultez ce guide d'installation.
Configurer l'agent BindPlane pour ingérer Syslog et l'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 (
nano
,vi
ou Bloc-notes, par exemple).
- 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 dans votre infrastructure si nécessaire.
Remplacez
<customer_id>
par le numéro client réel.Remplacez
/path/to/ingestion-authentication-file.json
par le chemin d'accès où le fichier d'authentification a été enregistré dans la section Obtenir le fichier d'authentification d'ingestion Google SecOps.
Redémarrez 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 distants 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 de l'ID de session
Activer le transfert des journaux
- Connectez-vous au serveur d'analyse 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 des 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 de l'ID de session
Pour consigner les informations liées aux adresses IP, activez la journalisation de l'ID de session.
- Connectez-vous à Versa Director.
- Passez à la vue Réalisation.
- Accédez à Configuration > Appareils > Tenant > Appareil pour accéder à la vue 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 de l'ID de session.
Cliquez sur OK.
Tableau 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" (Autoriser), ALLOW . Si action , type , idpAction , avAction ou urlAction sont "reject", "drop", "block" ou "deny", alors BLOCK . Si idpAction est autre chose que 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 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 : "ID de l'application"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 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 , sauf si elle est "Inconnu". |
deviceName |
about.resource.attribute.labels[].key : "deviceName"about.resource.attribute.labels[].value : deviceName |
Valeur extraite directement du champ deviceName , sauf si elle est "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 tous deux présents, NETWORK_CONNECTION . Dans le cas contraire, STATUS_UPDATE . Si applianceName est vide, 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 s'il n'est pas vide, "inconnu" ou "Inconnu". |
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 sur le 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 au format 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" (peu probable, sans distinction entre majuscules et minuscules), LOW . Si signaturePriority est "medium" (sans distinction entre majuscules et minuscules), alors MEDIUM . Si signaturePriority est "high" (sans distinction entre majuscules et minuscules), 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 s'il n'est pas vide ou s'il ne contient pas la valeur "0". |
tcpConnRefused |
additional.fields[].key : "tcpConnRefused"additional.fields[].value.string_value : tcpConnRefused |
Valeur extraite directement du champ tcpConnRefused s'il n'est pas vide ou s'il ne contient pas la valeur "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 s'il n'est pas vide ou s'il ne contient pas la valeur "0". |
tcpReXmitRev |
additional.fields[].key : "tcpReXmitRev"additional.fields[].value.string_value : tcpReXmitRev |
Valeur extraite directement du champ tcpReXmitRev s'il n'est pas vide ou s'il ne contient pas la valeur "0". |
tcpSAA |
additional.fields[].key : "tcpSAA"additional.fields[].value.string_value : tcpSAA |
Valeur extraite directement du champ tcpSAA s'il n'est pas vide ou s'il ne contient pas la valeur "0". |
tcpSSA |
additional.fields[].key : "tcpSSA"additional.fields[].value.string_value : tcpSSA |
Valeur extraite directement du champ tcpSSA s'il n'est pas vide ou s'il ne contient pas la valeur "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 s'il n'est pas vide ou s'il ne contient pas la valeur "0". |
tcpSynReXmit |
additional.fields[].key : "tcpSynReXmit"additional.fields[].value.string_value : tcpSynReXmit |
Valeur extraite directement du champ tcpSynReXmit s'il n'est pas vide ou s'il ne contient pas la valeur "0". |
tcpTWHS |
additional.fields[].key : "tcpTWHS"additional.fields[].value.string_value : tcpTWHS |
Valeur extraite directement du champ tcpTWHS s'il n'est pas vide ou s'il ne contient pas la valeur "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. |
Modifications
2024-06-03
- Mappage de "idpAction" sur "security_result.action".
- Mappage de "threatType" sur "security_result.detection_fields".
- Mappage de "ipsDirection" sur "security_result.detection_fields".
- Mappage de "ipsProfile" sur "security_result.detection_fields".
- Mappage de "signaturePriority" sur "security_result.severity".
- Mappage de "signatureMsg" sur "security_result.detection_fields".
- Mappage de "signatureId" sur "security_result.detection_fields".
- Mappage de "ipsApplication" sur "security_result.detection_fields".
- Mappage de "classMsg" sur "security_result.description".
- "ipsProfileRule" a été mappé sur "security_result.rule_name".
- Mappage de "ipsProtocol" sur "network.ip_protocol".
2023-07-03
- Prise en charge de "entitlementlog", "monstatslog" et "tcpappmonlog".
2022-11-04
- Analyseur créé par Mewly.