Collecter les journaux SASE (Secure Access Service Edge) de Versa Networks

Compatible avec:

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

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Agents de collecte.
  3. 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

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Profil.
  3. Copiez et sauvegardez l'ID client dans la section Détails de l'organisation.

Installer l'agent BindPlane

Installation de Windows

  1. Ouvrez l'invite de commande ou PowerShell en tant qu'administrateur.
  2. Exécutez la commande suivante :

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Installation de Linux

  1. Ouvrez un terminal avec des droits root ou sudo.
  2. 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

Configurer l'agent BindPlane pour ingérer Syslog et l'envoyer à Google SecOps

  1. 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).
  2. 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
    
    
  3. Remplacez le port et l'adresse IP dans votre infrastructure si nécessaire.

  4. Remplacez <customer_id> par le numéro client réel.

  5. 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

  1. Connectez-vous au serveur d'analyse Versa.
  2. Accédez à la CLI en exécutant la commande cli.
  3. Passez en mode Configuration en exécutant la commande configure, puis saisissez load merge terminal.
  4. 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
    
  5. 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.

  1. Connectez-vous à Versa Director.
  2. Passez à la vue Réalisation.
  3. Accédez à Configuration > Appareils > Tenant > Appareil pour accéder à la vue Appliance.
  4. Sélectionnez Configuration > Autres > Système > Configuration > Configuration.
  5. Dans le volet Paramètres, cliquez sur Modifier.
  6. Dans la fenêtre Modifier les paramètres, sélectionnez LEF.
  7. Dans la section Pare-feu, cochez la case Inclure la journalisation de l'ID de session.

  8. 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.