Recoger registros de Versa Networks Secure Access Service Edge (SASE)

Disponible en:

En este documento se describe cómo puede recoger los registros de Versa Networks Secure Access Service Edge (SASE). El analizador extrae pares clave-valor después de un filtro grok inicial. A continuación, asigna estos valores al modelo de datos unificado (UDM), gestiona varios formatos de registro (como eventos de firewall, registros de aplicaciones y registros de alarmas) y realiza conversiones y enriquecimientos de campos específicos, como el protocolo IP y la puntuación de riesgo.

Antes de empezar

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

Obtener el archivo de autenticación de ingestión de Google SecOps

  1. Inicia sesión en la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Agentes de recogida.
  3. Descarga el archivo de autenticación de ingestión. Guarda el archivo de forma segura en el sistema en el que se instalará el agente de Bindplane.

Obtener el ID de cliente de Google SecOps

  1. Inicia sesión en 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.

Instalar 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 un terminal con privilegios de superusuario 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

Configurar el agente de Bindplane para ingerir Syslog y enviarlo a Google SecOps

  1. Accede al archivo de configuración:

    • Busca el archivo config.yaml. Normalmente, 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. Sustituye el puerto y la dirección IP según sea necesario en tu infraestructura.

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

  5. Actualiza /path/to/ingestion-authentication-file.json a la ruta en la que se guardó el archivo de autenticación en la sección Obtener el archivo de autenticación de ingestión 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 Servicios o introducir el siguiente comando:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Configurar Versa Networks SASE

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

Para configurar los nodos de analíticas de Versa, haz lo siguiente:

  • Habilitar el reenvío de registros
  • Habilitar el registro de IDs de sesión

Habilitar el reenvío de registros

  1. Inicia sesión en el servidor de analíticas de Versa.
  2. Ve a CLI ejecutando el comando cli.
  3. Cambia al modo de configuración ejecutando el comando configure y, a continuación, introduce load merge terminal.
  4. Copia y pega los siguientes comandos para configurar el reenvío de registros:

    • Sustituye <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
    

Habilitar el registro de IDs de sesión

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

  1. Inicia sesión en Versa Director.
  2. Cambia a Vista del director.
  3. Ve a Configuración > Dispositivos > Inquilino > Dispositivo para acceder a Vista de electrodoméstico.
  4. Selecciona Configuración > Otros > Sistema > Configuración > Configuración.
  5. En el panel Parámetros, haga clic en Editar.
  6. En la ventana Editar parámetros, selecciona LEF.
  7. En la sección Firewall, marca la casilla 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
Valor tomado directamente del campo accCkt.
accCktId additional.fields[].key: "accCktId"
additional.fields[].value.string_value: accCktId
Valor tomado directamente del campo accCktId.
accCktName additional.fields[].key: "accCktName"
additional.fields[].value.string_value: accCktName
Valor tomado directamente del campo accCktName.
accessType additional.fields[].key: "accessType"
additional.fields[].value.string_value: accessType
Valor tomado directamente del campo accessType.
action security_result.action: action Si action, type, idpAction, avAction o urlAction tienen el valor "allow", entonces ALLOW. Si action, type, idpAction, avAction o urlAction son "reject", "drop", "block" o "deny", entonces BLOCK. Si idpAction es cualquier otro valor que no sea UNKNOWN_ACTION.
alarmCause security_result.detection_fields[].key: "alarmCause"
security_result.detection_fields[].value: alarmCause
Valor tomado directamente del campo alarmCause.
alarmClass security_result.detection_fields[].key: "alarmClass"
security_result.detection_fields[].value: alarmClass
Valor tomado directamente del campo alarmClass.
alarmClearable security_result.detection_fields[].key: "alarmClearable"
security_result.detection_fields[].value: alarmClearable
Valor tomado directamente del campo alarmClearable.
alarmEventType metadata.product_event_type: alarmEventType Valor tomado directamente del campo alarmEventType.
alarmKey security_result.detection_fields[].key: "alarmKey"
security_result.detection_fields[].value: alarmKey
Valor tomado directamente del campo alarmKey.
alarmKind security_result.detection_fields[].key: "alarmKind"
security_result.detection_fields[].value: alarmKind
Valor tomado directamente del campo alarmKind.
alarmOwner security_result.detection_fields[].key: "alarmOwner"
security_result.detection_fields[].value: alarmOwner
Valor tomado directamente del campo alarmOwner.
alarmSeqNo security_result.detection_fields[].key: "alarmSeqNo"
security_result.detection_fields[].value: alarmSeqNo
Valor tomado directamente del campo alarmSeqNo.
alarmSeverity security_result.severity_details: alarmSeverity Valor tomado directamente del campo alarmSeverity.
alarmText security_result.summary: alarmText Valor tomado directamente del campo alarmText, sin comillas dobles.
alarmType security_result.description: alarmType Valor tomado directamente del campo alarmType.
appFamily metadata.product_event_type: appFamily
security_result.detection_fields[].key: "appFamily"
security_result.detection_fields[].value: appFamily
Valor tomado directamente del campo appFamily.
appId security_result.detection_fields[].key: "ID de aplicación"
security_result.detection_fields[].value: appId
Valor tomado directamente del campo appId.
appIdStr security_result.detection_fields[].key: "appIdStr"
security_result.detection_fields[].value: appIdStr
Valor tomado directamente del campo appIdStr.
applianceName principal.hostname: applianceName Valor tomado directamente del campo applianceName, siteName o site.
appProductivity security_result.detection_fields[].key: "appProductivity"
security_result.detection_fields[].value: appProductivity
Valor tomado directamente del campo appProductivity.
appRisk security_result.severity_details: appRisk Valor tomado directamente del campo appRisk.
appSubFamily security_result.detection_fields[].key: "appSubFamily"
security_result.detection_fields[].value: appSubFamily
Valor tomado directamente del campo appSubFamily.
avAccuracy additional.fields[].key: "avAccuracy"
additional.fields[].value.string_value: avAccuracy
Valor tomado directamente del campo avAccuracy.
avAction security_result.action: avAction Consulta la lógica en action.
avMalwareName security_result.threat_name: avMalwareName Valor tomado directamente del campo avMalwareName.
avMalwareType security_result.category_details: avMalwareType Valor tomado directamente del campo avMalwareType.
classMsg security_result.description: classMsg Valor tomado directamente del campo classMsg, sin comillas dobles.
clientIPv4Address target.ip: clientIPv4Address Valor tomado directamente del campo clientIPv4Address.
destIp target.ip: destIp
destinationIPv4Address: destIp
Valor tomado directamente del campo destIp.
destinationIPv4Address target.ip: destinationIPv4Address Valor tomado directamente de destinationIPv4Address o derivado del campo networkPrefix.
destinationIPv6Address target.ip: destinationIPv6Address Valor tomado directamente del campo destinationIPv6Address.
destinationPort target.port: destinationPort Valor tomado directamente del campo destinationPort y convertido en un número entero.
destinationTransportPort target.port: destinationTransportPort Valor tomado directamente del campo destinationTransportPort y convertido en un número entero.
deviceKey about.resource.attribute.labels[].key: "deviceKey"
about.resource.attribute.labels[].value: deviceKey
Valor tomado directamente del campo deviceKey si no es "Unknown".
deviceName about.resource.attribute.labels[].key: "deviceName"
about.resource.attribute.labels[].value: deviceName
Valor tomado directamente del campo deviceName si no es "Unknown".
duration network.session_duration.seconds: duration Valor tomado directamente del campo duration y convertido en un número entero.
egressInterfaceName additional.fields[].key: "egressInterfaceName"
additional.fields[].value.string_value: egressInterfaceName
Valor tomado directamente del campo egressInterfaceName.
event.type metadata.event_type: event.type Si se incluyen applianceName (o sourceIPv4Address, user o sourceIPv6Address) y destinationIPv4Address (o remoteSite, destinationIPv6Address, clientIPv4Address o hostname), se aplica NETWORK_CONNECTION. De lo contrario, STATUS_UPDATE. Si applianceName está vacío, GENERIC_EVENT.
eventType principal.resource.attribute.labels[].key: "eventType"
principal.resource.attribute.labels[].value: eventType
Valor tomado directamente del campo eventType.
family security_result.detection_fields[].key: "family"
security_result.detection_fields[].value: family
Valor tomado directamente del campo family.
fc security_result.detection_fields[].key: "ForwardingClass"
security_result.detection_fields[].value: fc
Valor tomado directamente del campo fc.
fileTransDir additional.fields[].key: "fileTransDir"
additional.fields[].value.string_value: fileTransDir
Valor tomado directamente del campo fileTransDir.
filename target.file.names: filename Valor tomado directamente del campo filename.
flowCookie metadata.collected_timestamp: flowCookie Valor tomado directamente del campo flowCookie y convertido a marca de tiempo con el formato UNIX.
flowId principal.resource.product_object_id: flowId Valor tomado directamente del campo flowId.
forwardForwardingClass security_result.detection_fields[].key: "forwardForwardingClass"
security_result.detection_fields[].value: forwardForwardingClass
Valor tomado directamente del campo forwardForwardingClass.
fromCountry principal.location.country_or_region: fromCountry
target.location.country_or_region: fromCountry
Valor tomado directamente del campo fromCountry.
fromUser principal.user.userid: fromUser Valor tomado directamente del campo fromUser si no está vacío, "unknown" o "Unknown".
fromZone additional.fields[].key: "fromZone"
additional.fields[].value.string_value: fromZone
Valor tomado directamente del campo fromZone.
generateTime metadata.collected_timestamp: generateTime Valor tomado directamente del campo generateTime y convertido a marca de tiempo con el formato UNIX.
hostname target.hostname: hostname Valor tomado directamente del campo hostname.
httpUrl target.url: httpUrl Valor tomado directamente del campo httpUrl.
icmpTypeIPv4 additional.fields[].key: "icmpTypeIPv4"
additional.fields[].value.string_value: icmpTypeIPv4
Valor tomado directamente del campo icmpTypeIPv4.
idpAction security_result.action: idpAction Consulta la lógica en action.
ingressInterfaceName additional.fields[].key: "ingressInterfaceName"
additional.fields[].value.string_value: ingressInterfaceName
Valor tomado directamente del campo ingressInterfaceName.
ipsApplication additional.fields[].key: "ipsApplication"
additional.fields[].value.string_value: ipsApplication
Valor tomado directamente del campo ipsApplication.
ipsDirection security_result.detection_fields[].key: "ipsDirection"
security_result.detection_fields[].value: ipsDirection
Valor tomado directamente del campo ipsDirection.
ipsProfile security_result.detection_fields[].key: "ipsProfile"
security_result.detection_fields[].value: ipsProfile
Valor tomado directamente del campo ipsProfile.
ipsProfileRule security_result.rule_name: ipsProfileRule Valor tomado directamente del campo ipsProfileRule.
ipsProtocol network.ip_protocol: ipsProtocol Valor tomado directamente del campo ipsProtocol.
log_type metadata.description: log_type
metadata.log_type: log_type
Valor tomado directamente del campo log_type.
mstatsTimeBlock metadata.collected_timestamp: mstatsTimeBlock Valor tomado directamente del campo mstatsTimeBlock y convertido a marca de tiempo con el formato UNIX.
mstatsTotRecvdOctets network.received_bytes: mstatsTotRecvdOctets Valor tomado directamente del campo mstatsTotRecvdOctets y convertido en un número entero sin signo.
mstatsTotSentOctets network.sent_bytes: mstatsTotSentOctets Valor tomado directamente del campo mstatsTotSentOctets y convertido en un número entero sin signo.
mstatsTotSessCount additional.fields[].key: "mstatsTotSessCount"
additional.fields[].value.string_value: mstatsTotSessCount
Valor tomado directamente del campo mstatsTotSessCount.
mstatsTotSessDuration network.session_duration.seconds: mstatsTotSessDuration Valor tomado directamente del campo mstatsTotSessDuration y convertido en un número entero.
mstatsType security_result.category_details: mstatsType Valor tomado directamente del campo mstatsType.
networkPrefix target.ip: networkPrefix
target.port: networkPrefix
Dirección IP extraída del campo networkPrefix. El puerto se ha extraído del campo networkPrefix y se ha convertido en un número entero.
protocolIdentifier network.ip_protocol: protocolIdentifier Valor tomado directamente del campo protocolIdentifier, convertido en un número entero y asignado al nombre del protocolo IP mediante una búsqueda.
recvdOctets network.received_bytes: recvdOctets Valor tomado directamente del campo recvdOctets y convertido en un número entero sin signo.
recvdPackets network.received_packets: recvdPackets Valor tomado directamente del campo recvdPackets y convertido en un número entero.
remoteSite target.hostname: remoteSite Valor tomado directamente del campo remoteSite.
reverseForwardingClass security_result.detection_fields[].key: "reverseForwardingClass"
security_result.detection_fields[].value: reverseForwardingClass
Valor tomado directamente del campo reverseForwardingClass.
risk security_result.risk_score: risk Valor tomado directamente del campo risk y convertido a flotante.
rule security_result.rule_name: rule Valor tomado directamente del campo rule.
sentOctets network.sent_bytes: sentOctets Valor tomado directamente del campo sentOctets y convertido en un número entero sin signo.
sentPackets network.sent_packets: sentPackets Valor tomado directamente del campo sentPackets y convertido en un número entero.
serialNum security_result.detection_fields[].key: "serialNum"
security_result.detection_fields[].value: serialNum
Valor tomado directamente del campo serialNum.
signatureId security_result.detection_fields[].key: "signatureID"
security_result.detection_fields[].value: signatureId
Valor tomado directamente del campo signatureId.
signatureMsg security_result.detection_fields[].key: "signatureMsg"
security_result.detection_fields[].value: signatureMsg
Valor tomado directamente del campo signatureMsg.
signaturePriority security_result.severity: signaturePriority Si signaturePriority es "low" (sin distinguir entre mayúsculas y minúsculas), entonces LOW. Si signaturePriority es "medium" (sin distinguir entre mayúsculas y minúsculas), entonces MEDIUM. Si signaturePriority es "high" (sin distinguir entre mayúsculas y minúsculas), entonces HIGH.
site principal.hostname: site
applianceName: site
Valor tomado directamente del campo site.
siteId additional.fields[].key: "siteId"
additional.fields[].value.string_value: siteId
Valor tomado directamente del campo siteId.
siteName principal.hostname: siteName
applianceName: siteName
Valor tomado directamente del campo siteName.
sourceIPv4Address principal.ip: sourceIPv4Address Valor tomado directamente del campo sourceIPv4Address.
sourceIPv6Address principal.ip: sourceIPv6Address Valor tomado directamente del campo sourceIPv6Address.
sourcePort principal.port: sourcePort Valor tomado directamente del campo sourcePort y convertido en un número entero.
sourceTransportPort principal.port: sourceTransportPort Valor tomado directamente del campo sourceTransportPort y convertido en un número entero.
subFamily security_result.detection_fields[].key: "subFamily"
security_result.detection_fields[].value: subFamily
Valor tomado directamente del campo subFamily.
tcpConnAborted additional.fields[].key: "tcpConnAborted"
additional.fields[].value.string_value: tcpConnAborted
Valor tomado directamente del campo tcpConnAborted si no está vacío o es "0".
tcpConnRefused additional.fields[].key: "tcpConnRefused"
additional.fields[].value.string_value: tcpConnRefused
Valor tomado directamente del campo tcpConnRefused si no está vacío o es "0".
tcpPktsFwd network.sent_packets: tcpPktsFwd Valor tomado directamente del campo tcpPktsFwd y convertido en un número entero.
tcpPktsRev network.received_packets: tcpPktsRev Valor tomado directamente del campo tcpPktsRev y convertido en un número entero.
tcpReXmitFwd additional.fields[].key: "tcpReXmitFwd"
additional.fields[].value.string_value: tcpReXmitFwd
Valor tomado directamente del campo tcpReXmitFwd si no está vacío o es "0".
tcpReXmitRev additional.fields[].key: "tcpReXmitRev"
additional.fields[].value.string_value: tcpReXmitRev
Valor tomado directamente del campo tcpReXmitRev si no está vacío o es "0".
tcpSAA additional.fields[].key: "tcpSAA"
additional.fields[].value.string_value: tcpSAA
Valor tomado directamente del campo tcpSAA si no está vacío o es "0".
tcpSSA additional.fields[].key: "tcpSSA"
additional.fields[].value.string_value: tcpSSA
Valor tomado directamente del campo tcpSSA si no está vacío o es "0".
tcpSessCnt additional.fields[].key: "tcpSessCnt"
additional.fields[].value.string_value: tcpSessCnt
Valor tomado directamente del campo tcpSessCnt.
tcpSessDur network.session_duration.seconds: tcpSessDur Valor tomado directamente del campo tcpSessDur y convertido en un número entero.
tcpSynAckReXmit additional.fields[].key: "tcpSynAckReXmit"
additional.fields[].value.string_value: tcpSynAckReXmit
Valor tomado directamente del campo tcpSynAckReXmit si no está vacío o es "0".
tcpSynReXmit additional.fields[].key: "tcpSynReXmit"
additional.fields[].value.string_value: tcpSynReXmit
Valor tomado directamente del campo tcpSynReXmit si no está vacío o es "0".
tcpTWHS additional.fields[].key: "tcpTWHS"
additional.fields[].value.string_value: tcpTWHS
Valor tomado 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
Valor tomado directamente del campo tenantId.
tenantName observer.hostname: tenantName Valor tomado directamente del campo tenantName.
threatType security_result.detection_fields[].key: "threatType"
security_result.detection_fields[].value: threatType
Valor tomado directamente del campo threatType.
toCountry target.location.country_or_region: toCountry Valor tomado directamente del campo toCountry.
toZone additional.fields[].key: "toZone"
additional.fields[].value.string_value: toZone
Valor tomado directamente del campo toZone.
traffType additional.fields[].key: "traffType"
additional.fields[].value.string_value: traffType
Valor tomado directamente del campo traffType.
ts metadata.event_timestamp: ts Valor tomado directamente del campo ts y convertido a una marca de tiempo.
type security_result.action: type Consulta la lógica en action.
urlAction security_result.action: urlAction Consulta la lógica en action.
urlActionMessage security_result.summary: urlActionMessage Valor tomado directamente del campo urlActionMessage.
urlCategory principal.resource.attribute.labels[].key: "urlCategory"
principal.resource.attribute.labels[].value: urlCategory
Valor tomado directamente del campo urlCategory.
urlProfile additional.fields[].key: "urlProfile"
additional.fields[].value.string_value: urlProfile
Valor tomado directamente del campo urlProfile.
urlReputation security_result.severity_details: urlReputation Valor tomado directamente del campo urlReputation.
user principal.ip: user Valor tomado directamente del campo user.
vsnId principal.resource.attribute.labels[].key: "vsnId"
principal.resource.attribute.labels[].value: vsnId
Valor tomado directamente del campo vsnId. Valor codificado. Valor codificado.

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.