Recoger registros de Versa Networks Secure Access Service Edge (SASE)
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
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recogida.
- 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
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Perfil.
- 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
- Abre el símbolo del sistema o PowerShell como administrador.
Ejecuta el siguiente comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Instalación de Linux
- Abre un terminal con privilegios de superusuario o sudo.
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
- Para ver otras opciones de instalación, consulta esta guía de instalación.
Configurar el agente de Bindplane para ingerir Syslog y enviarlo a Google SecOps
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).
- Busca el archivo
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
Sustituye el puerto y la dirección IP según sea necesario en tu infraestructura.
Sustituye
<customer_id>
por el ID de cliente real.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
- Inicia sesión en el servidor de analíticas de Versa.
- Ve a CLI ejecutando el comando
cli
. - Cambia al modo de configuración ejecutando el comando
configure
y, a continuación, introduceload merge terminal
. 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
- Sustituye
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.
- Inicia sesión en Versa Director.
- Cambia a Vista del director.
- Ve a Configuración > Dispositivos > Inquilino > Dispositivo para acceder a Vista de electrodoméstico.
- Selecciona Configuración > Otros > Sistema > Configuración > Configuración.
- En el panel Parámetros, haga clic en Editar.
- En la ventana Editar parámetros, selecciona LEF.
En la sección Firewall, marca la casilla Incluir registro de ID de sesión.
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.