Recopila registros del perímetro de servicio de acceso seguro (SASE) de Versa Networks
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 de 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 ejecutas la herramienta detrás de un proxy, asegúrate de que los puertos del firewall estén abiertos.
- Asegúrate de tener acceso privilegiado a Versa SASE.
Obtén el archivo de autenticación de transferencia de Google SecOps
- Accede a la consola de Google SecOps.
- Ve a SIEM Settings > Collection Agents.
- Descarga el archivo de autenticación de transferencia. Guarda el archivo de forma segura en el sistema en el que se instalará el agente de BindPlane.
Obtén el ID de cliente de Google SecOps
- Accede a la consola de Google SecOps.
- Ve a SIEM Settings > Profile.
- Copia y guarda el ID de cliente de la sección Detalles de la organización.
Instala el agente de BindPlane
Instalación en 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 en Linux
- Abre una terminal con privilegios de raíz 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 adicionales de instalación
- Para obtener más opciones de instalación, consulta esta guía de instalación.
Configura el agente de Bindplane para que ingiera Syslog y lo envíe a Google SecOps
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).
- Ubica 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
Reemplaza el puerto y la dirección IP según sea necesario en tu infraestructura.
Reemplaza
<customer_id>
por el ID de cliente real.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 Cómo obtener el archivo de autenticación de la transferencia de datos 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 de Servicios o ingresar el siguiente comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Configura SASE de Versa Networks
Los administradores deben configurar recopiladores remotos en cada nodo de Versa Analytics para reenviar registros a sistemas de terceros.
Para configurar los nodos de análisis 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
- Accede al servidor de análisis de Versa.
- Ejecuta el comando
cli
para ir a la CLI. - Ejecuta el comando
configure
y, luego, ingresaload merge terminal
para cambiar al modo de configuración. 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
- Reemplaza
Guarda la configuración:
save
Habilita el registro del ID de sesión
Para registrar información relacionada con la IP, habilita el registro del ID de sesión.
- Accede a Versa Director.
- Cambia a la Vista del director.
- Ve a Configuration > Devices > Tenant > Device para acceder a Appliance View.
- Selecciona Configuration > Others > System > Configuration > Configuration.
- En el panel Parámetros, haz clic en Editar.
- En la ventana Editar parámetros, selecciona LEF.
En la sección Firewall, selecciona la casilla de verificación 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 son "allow", entonces ALLOW . Si action , type , idpAction , avAction o urlAction son "rechazar", "descartar", "bloquear" o "denegar", entonces BLOCK . Si idpAction es cualquier otro valor, se devuelve 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 la 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 action para ver la lógica. |
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 del campo 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 número entero. |
destinationTransportPort |
target.port : destinationTransportPort |
Valor tomado directamente del campo destinationTransportPort y convertido en número entero. |
deviceKey |
about.resource.attribute.labels[].key : "deviceKey"about.resource.attribute.labels[].value : deviceKey |
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 |
Valor que se toma directamente del campo deviceName si no es "Desconocido". |
duration |
network.session_duration.seconds : duration |
Valor tomado directamente del campo duration y convertido en 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 están presentes applianceName (o sourceIPv4Address o user o sourceIPv6Address ) y destinationIPv4Address (o remoteSite o destinationIPv6Address o clientIPv4Address o hostname ), entonces NETWORK_CONNECTION . En caso contrario, STATUS_UPDATE . Si applianceName está vacío, entonces 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 action para ver la lógica. |
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 número entero. |
mstatsType |
security_result.category_details : mstatsType |
Valor tomado directamente del campo mstatsType . |
networkPrefix |
target.ip : networkPrefix target.port : networkPrefix |
Es la dirección IP extraída del campo networkPrefix . Es el puerto extraído del campo networkPrefix y convertido en número entero. |
protocolIdentifier |
network.ip_protocol : protocolIdentifier |
Valor tomado directamente del campo protocolIdentifier , convertido a número entero y asignado al nombre del protocolo de IP a través de 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 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 un número de punto 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 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 distinción entre mayúsculas y minúsculas), entonces LOW . Si signaturePriority es "medium" (sin distinción entre mayúsculas y minúsculas), entonces MEDIUM . Si signaturePriority es "high" (sin distinción 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 número entero. |
sourceTransportPort |
principal.port : sourceTransportPort |
Valor tomado directamente del campo sourceTransportPort y convertido en 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 número entero. |
tcpPktsRev |
network.received_packets : tcpPktsRev |
Valor tomado directamente del campo tcpPktsRev y convertido en 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 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 en marca de tiempo. |
type |
security_result.action : type |
Consulta action para ver la lógica. |
urlAction |
security_result.action : urlAction |
Consulta action para ver la lógica. |
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? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.