Recopila registros del perímetro de servicio de acceso seguro (SASE) de Versa Networks

Compatible con:

En este documento, se describe cómo puedes recopilar los registros del perímetro de servicio de acceso seguro (SASE) de Versa Networks. El analizador extrae pares clave-valor después de un filtro grok inicial. Luego, asigna estos valores al modelo de datos unificado (UDM), controla varios formatos de registro, como eventos de firewall, registros de aplicaciones y registros de alarmas, y realiza conversiones y enriquecimientos para campos específicos, como el protocolo IP y la puntuación de riesgo.

Antes de comenzar

  • Asegúrate de tener una instancia de Google Security Operations.
  • Asegúrate de usar Windows 2016 o una versión posterior, o un host de Linux con systemd.
  • Si se ejecuta detrás de un proxy, asegúrate de que los puertos del firewall estén abiertos.
  • Asegúrate de tener acceso con privilegios a Versa SASE.

Obtén el archivo de autenticación de transferencia de Google SecOps

  1. Accede a la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Agentes de recopilación.
  3. Descarga el archivo de autenticación de transferencia. Guarda el archivo de forma segura en el sistema en el que se instalará BindPlane.

Obtén el ID de cliente de Google SecOps

  1. Accede a la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Perfil.
  3. Copia y guarda el ID de cliente de la sección Detalles de la organización.

Instala el agente de BindPlane

Instalación de Windows

  1. Abre el símbolo del sistema o PowerShell como administrador.
  2. Ejecuta el siguiente comando:

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

Instalación de Linux

  1. Abre una terminal con privilegios de raíz o sudo.
  2. Ejecuta el siguiente comando:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    

Recursos de instalación adicionales

Configura el agente de BindPlane para transferir Syslog y enviarlo a Google SecOps

  1. Accede al archivo de configuración:

    • Ubica el archivo config.yaml. Por lo general, se encuentra en el directorio /etc/bindplane-agent/ en Linux o en el directorio de instalación en Windows.
    • Abre el archivo con un editor de texto (por ejemplo, nano, vi o Bloc de notas).
  2. Edita el archivo config.yaml de la siguiente manera:

    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. Reemplaza el puerto y la dirección IP según sea necesario en tu infraestructura.

  4. Reemplaza <customer_id> por el ID de cliente real.

  5. Actualiza /path/to/ingestion-authentication-file.json a la ruta de acceso en la que se guardó el archivo de autenticación en la sección Obtén el archivo de autenticación de transferencia de Google SecOps.

Reinicia el agente de BindPlane para aplicar los cambios.

  • En Linux, para reiniciar el agente de BindPlane, ejecuta el siguiente comando:

    sudo systemctl restart bindplane-agent
    
  • En Windows, para reiniciar el agente de BindPlane, puedes usar la consola Services o ingresar el siguiente comando:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Configura Versa Networks SASE

Los administradores deben configurar los recopiladores remotos en cada nodo de Versa Analytics para reenviar registros a sistemas de terceros.

Para configurar los nodos de estadísticas de Versa, haz lo siguiente:

  • Habilita el reenvío de registros
  • Habilita el registro del ID de sesión

Habilita el reenvío de registros

  1. Accede al servidor de estadísticas de Versa.
  2. Ejecuta el comando cli para ir a la CLI.
  3. Para cambiar al modo de configuración, ejecuta el comando configure y, luego, ingresa load merge terminal.
  4. Copia y pega los siguientes comandos para configurar el reenvío de registros:

    • Reemplaza <collector_ip> y <collector_port> por la dirección IP y el puerto de tu recopilador de 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. Guarda la configuración:

    save
    

Habilita el registro de ID de sesión

Para registrar información relacionada con la IP, habilita el registro de ID de sesión.

  1. Accede a Versa Director.
  2. Cambia a la vista de director.
  3. Ve a Configuración > Dispositivos > Usuario > Dispositivo para acceder a la Vista de dispositivos.
  4. Selecciona Configuración > Otros > Sistema > Configuración > Configuración.
  5. En el panel Parámetros, haz clic en Editar.
  6. En la ventana Editar parámetros, selecciona LEF.
  7. En la sección Firewall, selecciona la casilla de verificación Incluir registro de ID de sesión.

  8. Haz clic en Aceptar.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
accCkt additional.fields[].key: "accCkt"
additional.fields[].value.string_value: accCkt
Es el valor que se toma directamente del campo accCkt.
accCktId additional.fields[].key: "accCktId"
additional.fields[].value.string_value: accCktId
Es el valor que se toma directamente del campo accCktId.
accCktName additional.fields[].key: "accCktName"
additional.fields[].value.string_value: accCktName
Es el valor que se toma directamente del campo accCktName.
accessType additional.fields[].key: "accessType"
additional.fields[].value.string_value: accessType
Es el valor que se toma directamente del campo accessType.
action security_result.action: action Si action, type, idpAction, avAction o urlAction son "allow", entonces ALLOW. Si action, type, idpAction, avAction o urlAction son "reject", "drop", "block" o "deny", entonces BLOCK. Si idpAction es cualquier otro valor, es UNKNOWN_ACTION.
alarmCause security_result.detection_fields[].key: "alarmCause"
security_result.detection_fields[].value: alarmCause
Es el valor que se toma directamente del campo alarmCause.
alarmClass security_result.detection_fields[].key: "alarmClass"
security_result.detection_fields[].value: alarmClass
Es el valor que se toma directamente del campo alarmClass.
alarmClearable security_result.detection_fields[].key: "alarmClearable"
security_result.detection_fields[].value: alarmClearable
Es el valor que se toma directamente del campo alarmClearable.
alarmEventType metadata.product_event_type: alarmEventType Es el valor que se toma directamente del campo alarmEventType.
alarmKey security_result.detection_fields[].key: "alarmKey"
security_result.detection_fields[].value: alarmKey
Es el valor que se toma directamente del campo alarmKey.
alarmKind security_result.detection_fields[].key: "alarmKind"
security_result.detection_fields[].value: alarmKind
Es el valor que se toma directamente del campo alarmKind.
alarmOwner security_result.detection_fields[].key: "alarmOwner"
security_result.detection_fields[].value: alarmOwner
Es el valor que se toma directamente del campo alarmOwner.
alarmSeqNo security_result.detection_fields[].key: "alarmSeqNo"
security_result.detection_fields[].value: alarmSeqNo
Es el valor que se toma directamente del campo alarmSeqNo.
alarmSeverity security_result.severity_details: alarmSeverity Es el valor que se toma directamente del campo alarmSeverity.
alarmText security_result.summary: alarmText Es el valor que se toma directamente del campo alarmText, sin comillas dobles.
alarmType security_result.description: alarmType Es el valor que se toma directamente del campo alarmType.
appFamily metadata.product_event_type: appFamily
security_result.detection_fields[].key: "appFamily"
security_result.detection_fields[].value: appFamily
Es el valor que se toma directamente del campo appFamily.
appId security_result.detection_fields[].key: "ID de aplicación"
security_result.detection_fields[].value: appId
Es el valor que se toma directamente del campo appId.
appIdStr security_result.detection_fields[].key: "appIdStr"
security_result.detection_fields[].value: appIdStr
Es el valor que se toma directamente del campo appIdStr.
applianceName principal.hostname: applianceName Es un valor que se toma directamente del campo applianceName, siteName o site.
appProductivity security_result.detection_fields[].key: "appProductivity"
security_result.detection_fields[].value: appProductivity
Es el valor que se toma directamente del campo appProductivity.
appRisk security_result.severity_details: appRisk Es el valor que se toma directamente del campo appRisk.
appSubFamily security_result.detection_fields[].key: "appSubFamily"
security_result.detection_fields[].value: appSubFamily
Es el valor que se toma directamente del campo appSubFamily.
avAccuracy additional.fields[].key: "avAccuracy"
additional.fields[].value.string_value: avAccuracy
Es el valor que se toma directamente del campo avAccuracy.
avAction security_result.action: avAction Consulta action para obtener información sobre la lógica.
avMalwareName security_result.threat_name: avMalwareName Es el valor que se toma directamente del campo avMalwareName.
avMalwareType security_result.category_details: avMalwareType Es el valor que se toma directamente del campo avMalwareType.
classMsg security_result.description: classMsg Es el valor que se toma directamente del campo classMsg, sin comillas dobles.
clientIPv4Address target.ip: clientIPv4Address Es el valor que se toma directamente del campo clientIPv4Address.
destIp target.ip: destIp
destinationIPv4Address: destIp
Es el valor que se toma directamente del campo destIp.
destinationIPv4Address target.ip: destinationIPv4Address Es un valor que se toma directamente de destinationIPv4Address o se deriva del campo networkPrefix.
destinationIPv6Address target.ip: destinationIPv6Address Es el valor que se toma directamente del campo destinationIPv6Address.
destinationPort target.port: destinationPort Es un valor que se toma directamente del campo destinationPort y se convierte en número entero.
destinationTransportPort target.port: destinationTransportPort Es un valor que se toma directamente del campo destinationTransportPort y se convierte en número entero.
deviceKey about.resource.attribute.labels[].key: "deviceKey"
about.resource.attribute.labels[].value: deviceKey
Es el valor que se toma directamente del campo deviceKey si no es "Desconocido".
deviceName about.resource.attribute.labels[].key: "deviceName"
about.resource.attribute.labels[].value: deviceName
Es el valor que se toma directamente del campo deviceName si no es "Desconocido".
duration network.session_duration.seconds: duration Es un valor que se toma directamente del campo duration y se convierte en número entero.
egressInterfaceName additional.fields[].key: "egressInterfaceName"
additional.fields[].value.string_value: egressInterfaceName
Es el valor que se toma directamente del campo egressInterfaceName.
event.type metadata.event_type: event.type Si están presentes applianceName (o sourceIPv4Address, user o sourceIPv6Address) y destinationIPv4Address (o remoteSite, destinationIPv6Address, clientIPv4Address o hostname), entonces NETWORK_CONNECTION. De lo contrario, STATUS_UPDATE. Si applianceName está vacío, entonces GENERIC_EVENT.
eventType principal.resource.attribute.labels[].key: "eventType"
principal.resource.attribute.labels[].value: eventType
Es el valor que se toma directamente del campo eventType.
family security_result.detection_fields[].key: "family"
security_result.detection_fields[].value: family
Es el valor que se toma directamente del campo family.
fc security_result.detection_fields[].key: "ForwardingClass"
security_result.detection_fields[].value: fc
Es el valor que se toma directamente del campo fc.
fileTransDir additional.fields[].key: "fileTransDir"
additional.fields[].value.string_value: fileTransDir
Es el valor que se toma directamente del campo fileTransDir.
filename target.file.names: filename Es el valor que se toma directamente del campo filename.
flowCookie metadata.collected_timestamp: flowCookie Es un valor que se toma directamente del campo flowCookie y se convierte en marca de tiempo con el formato UNIX.
flowId principal.resource.product_object_id: flowId Es el valor que se toma directamente del campo flowId.
forwardForwardingClass security_result.detection_fields[].key: "forwardForwardingClass"
security_result.detection_fields[].value: forwardForwardingClass
Es el valor que se toma directamente del campo forwardForwardingClass.
fromCountry principal.location.country_or_region: fromCountry
target.location.country_or_region: fromCountry
Es el valor que se toma directamente del campo fromCountry.
fromUser principal.user.userid: fromUser Es el valor que se toma directamente del campo fromUser si no está vacío, es "desconocido" o "Unknown".
fromZone additional.fields[].key: "fromZone"
additional.fields[].value.string_value: fromZone
Es el valor que se toma directamente del campo fromZone.
generateTime metadata.collected_timestamp: generateTime Es un valor que se toma directamente del campo generateTime y se convierte en marca de tiempo con el formato UNIX.
hostname target.hostname: hostname Es el valor que se toma directamente del campo hostname.
httpUrl target.url: httpUrl Es el valor que se toma directamente del campo httpUrl.
icmpTypeIPv4 additional.fields[].key: "icmpTypeIPv4"
additional.fields[].value.string_value: icmpTypeIPv4
Es el valor que se toma directamente del campo icmpTypeIPv4.
idpAction security_result.action: idpAction Consulta action para obtener información sobre la lógica.
ingressInterfaceName additional.fields[].key: "ingressInterfaceName"
additional.fields[].value.string_value: ingressInterfaceName
Es el valor que se toma directamente del campo ingressInterfaceName.
ipsApplication additional.fields[].key: "ipsApplication"
additional.fields[].value.string_value: ipsApplication
Es el valor que se toma directamente del campo ipsApplication.
ipsDirection security_result.detection_fields[].key: "ipsDirection"
security_result.detection_fields[].value: ipsDirection
Es el valor que se toma directamente del campo ipsDirection.
ipsProfile security_result.detection_fields[].key: "ipsProfile"
security_result.detection_fields[].value: ipsProfile
Es el valor que se toma directamente del campo ipsProfile.
ipsProfileRule security_result.rule_name: ipsProfileRule Es el valor que se toma directamente del campo ipsProfileRule.
ipsProtocol network.ip_protocol: ipsProtocol Es el valor que se toma directamente del campo ipsProtocol.
log_type metadata.description: log_type
metadata.log_type: log_type
Es el valor que se toma directamente del campo log_type.
mstatsTimeBlock metadata.collected_timestamp: mstatsTimeBlock Es un valor que se toma directamente del campo mstatsTimeBlock y se convierte en marca de tiempo con el formato UNIX.
mstatsTotRecvdOctets network.received_bytes: mstatsTotRecvdOctets Es un valor que se toma directamente del campo mstatsTotRecvdOctets y se convierte en un número entero sin signo.
mstatsTotSentOctets network.sent_bytes: mstatsTotSentOctets Es un valor que se toma directamente del campo mstatsTotSentOctets y se convierte en un número entero sin signo.
mstatsTotSessCount additional.fields[].key: "mstatsTotSessCount"
additional.fields[].value.string_value: mstatsTotSessCount
Es el valor que se toma directamente del campo mstatsTotSessCount.
mstatsTotSessDuration network.session_duration.seconds: mstatsTotSessDuration Es un valor que se toma directamente del campo mstatsTotSessDuration y se convierte en número entero.
mstatsType security_result.category_details: mstatsType Es el valor que se toma directamente del campo mstatsType.
networkPrefix target.ip: networkPrefix
target.port: networkPrefix
Dirección IP extraída del campo networkPrefix. Puerto extraído del campo networkPrefix y convertido a número entero.
protocolIdentifier network.ip_protocol: protocolIdentifier Es un valor que se toma directamente del campo protocolIdentifier, se convierte en número entero y se asigna al nombre del protocolo IP mediante una búsqueda.
recvdOctets network.received_bytes: recvdOctets Es un valor que se toma directamente del campo recvdOctets y se convierte en un número entero sin signo.
recvdPackets network.received_packets: recvdPackets Es un valor que se toma directamente del campo recvdPackets y se convierte en número entero.
remoteSite target.hostname: remoteSite Es el valor que se toma directamente del campo remoteSite.
reverseForwardingClass security_result.detection_fields[].key: "reverseForwardingClass"
security_result.detection_fields[].value: reverseForwardingClass
Es el valor que se toma directamente del campo reverseForwardingClass.
risk security_result.risk_score: risk Es un valor que se toma directamente del campo risk y se convierte en número de punto flotante.
rule security_result.rule_name: rule Es el valor que se toma directamente del campo rule.
sentOctets network.sent_bytes: sentOctets Es un valor que se toma directamente del campo sentOctets y se convierte en un número entero sin signo.
sentPackets network.sent_packets: sentPackets Es un valor que se toma directamente del campo sentPackets y se convierte en número entero.
serialNum security_result.detection_fields[].key: "serialNum"
security_result.detection_fields[].value: serialNum
Es el valor que se toma directamente del campo serialNum.
signatureId security_result.detection_fields[].key: "signatureID"
security_result.detection_fields[].value: signatureId
Es el valor que se toma directamente del campo signatureId.
signatureMsg security_result.detection_fields[].key: "signatureMsg"
security_result.detection_fields[].value: signatureMsg
Es el valor que se toma directamente del campo signatureMsg.
signaturePriority security_result.severity: signaturePriority Si signaturePriority es “bajo” (sin distinción entre mayúsculas y minúsculas), entonces LOW. Si signaturePriority es “mediano” (sin distinción entre mayúsculas y minúsculas), entonces MEDIUM. Si signaturePriority es "alto" (sin distinción entre mayúsculas y minúsculas), entonces HIGH.
site principal.hostname: site
applianceName: site
Es el valor que se toma directamente del campo site.
siteId additional.fields[].key: "siteId"
additional.fields[].value.string_value: siteId
Es el valor que se toma directamente del campo siteId.
siteName principal.hostname: siteName
applianceName: siteName
Es el valor que se toma directamente del campo siteName.
sourceIPv4Address principal.ip: sourceIPv4Address Es el valor que se toma directamente del campo sourceIPv4Address.
sourceIPv6Address principal.ip: sourceIPv6Address Es el valor que se toma directamente del campo sourceIPv6Address.
sourcePort principal.port: sourcePort Es un valor que se toma directamente del campo sourcePort y se convierte en número entero.
sourceTransportPort principal.port: sourceTransportPort Es un valor que se toma directamente del campo sourceTransportPort y se convierte en número entero.
subFamily security_result.detection_fields[].key: "subFamily"
security_result.detection_fields[].value: subFamily
Es el valor que se toma directamente del campo subFamily.
tcpConnAborted additional.fields[].key: "tcpConnAborted"
additional.fields[].value.string_value: tcpConnAborted
Es el valor que se toma directamente del campo tcpConnAborted si no está vacío o es “0”.
tcpConnRefused additional.fields[].key: "tcpConnRefused"
additional.fields[].value.string_value: tcpConnRefused
Es el valor que se toma directamente del campo tcpConnRefused si no está vacío o es “0”.
tcpPktsFwd network.sent_packets: tcpPktsFwd Es un valor que se toma directamente del campo tcpPktsFwd y se convierte en número entero.
tcpPktsRev network.received_packets: tcpPktsRev Es un valor que se toma directamente del campo tcpPktsRev y se convierte en número entero.
tcpReXmitFwd additional.fields[].key: "tcpReXmitFwd"
additional.fields[].value.string_value: tcpReXmitFwd
Es el valor que se toma directamente del campo tcpReXmitFwd si no está vacío o es “0”.
tcpReXmitRev additional.fields[].key: "tcpReXmitRev"
additional.fields[].value.string_value: tcpReXmitRev
Es el valor que se toma directamente del campo tcpReXmitRev si no está vacío o es “0”.
tcpSAA additional.fields[].key: "tcpSAA"
additional.fields[].value.string_value: tcpSAA
Es el valor que se toma directamente del campo tcpSAA si no está vacío o es “0”.
tcpSSA additional.fields[].key: "tcpSSA"
additional.fields[].value.string_value: tcpSSA
Es el valor que se toma directamente del campo tcpSSA si no está vacío o es “0”.
tcpSessCnt additional.fields[].key: "tcpSessCnt"
additional.fields[].value.string_value: tcpSessCnt
Es el valor que se toma directamente del campo tcpSessCnt.
tcpSessDur network.session_duration.seconds: tcpSessDur Es un valor que se toma directamente del campo tcpSessDur y se convierte en número entero.
tcpSynAckReXmit additional.fields[].key: "tcpSynAckReXmit"
additional.fields[].value.string_value: tcpSynAckReXmit
Es el valor que se toma directamente del campo tcpSynAckReXmit si no está vacío o es “0”.
tcpSynReXmit additional.fields[].key: "tcpSynReXmit"
additional.fields[].value.string_value: tcpSynReXmit
Es el valor que se toma directamente del campo tcpSynReXmit si no está vacío o es “0”.
tcpTWHS additional.fields[].key: "tcpTWHS"
additional.fields[].value.string_value: tcpTWHS
Es el valor que se toma directamente del campo tcpTWHS si no está vacío o es “0”.
tenantId principal.resource.attribute.labels[].key: "tenantId"
principal.resource.attribute.labels[].value: tenantId
Es el valor que se toma directamente del campo tenantId.
tenantName observer.hostname: tenantName Es el valor que se toma directamente del campo tenantName.
threatType security_result.detection_fields[].key: "threatType"
security_result.detection_fields[].value: threatType
Es el valor que se toma directamente del campo threatType.
toCountry target.location.country_or_region: toCountry Es el valor que se toma directamente del campo toCountry.
toZone additional.fields[].key: "toZone"
additional.fields[].value.string_value: toZone
Es el valor que se toma directamente del campo toZone.
traffType additional.fields[].key: "traffType"
additional.fields[].value.string_value: traffType
Es el valor que se toma directamente del campo traffType.
ts metadata.event_timestamp: ts Es un valor que se toma directamente del campo ts y se convierte en una marca de tiempo.
type security_result.action: type Consulta action para obtener información sobre la lógica.
urlAction security_result.action: urlAction Consulta action para obtener información sobre la lógica.
urlActionMessage security_result.summary: urlActionMessage Es el valor que se toma directamente del campo urlActionMessage.
urlCategory principal.resource.attribute.labels[].key: "urlCategory"
principal.resource.attribute.labels[].value: urlCategory
Es el valor que se toma directamente del campo urlCategory.
urlProfile additional.fields[].key: "urlProfile"
additional.fields[].value.string_value: urlProfile
Es el valor que se toma directamente del campo urlProfile.
urlReputation security_result.severity_details: urlReputation Es el valor que se toma directamente del campo urlReputation.
user principal.ip: user Es el valor que se toma directamente del campo user.
vsnId principal.resource.attribute.labels[].key: "vsnId"
principal.resource.attribute.labels[].value: vsnId
Es el valor que se toma directamente del campo vsnId. Valor hard-coded. Valor hard-coded.

Cambios

2024-06-03

  • Se asignó "idpAction" a "security_result.action".
  • Se asignó "threatType" a "security_result.detection_fields".
  • Se asignó "ipsDirection" a "security_result.detection_fields".
  • Se asignó "ipsProfile" a "security_result.detection_fields".
  • Se asignó "signaturePriority" a "security_result.severity".
  • Se asignó "signatureMsg" a "security_result.detection_fields".
  • Se asignó "signatureId" a "security_result.detection_fields".
  • Se asignó "ipsApplication" a "security_result.detection_fields".
  • Se asignó "classMsg" a "security_result.description".
  • Se asignó "ipsProfileRule" a "security_result.rule_name".
  • Se asignó "ipsProtocol" a "network.ip_protocol".

2023-07-03

  • Se agregó compatibilidad con "entitlementlog", "monstatslog" y "tcpappmonlog".

2022-11-04

  • Se creó el analizador de Mewly.