Recopila registros de Cisco Meraki

Se admite en los siguientes sistemas operativos:

En este documento, se explica cómo transferir registros de Cisco Meraki a Google Security Operations con Bindplane.

El analizador extrae campos de los registros con formato JSON y de syslog de Cisco Meraki. Utiliza el análisis de grok o JSON para procesar el mensaje de registro y, luego, asigna estos valores al Modelo de datos unificado (UDM). También establece valores de metadatos predeterminados para el origen y el tipo del evento.

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos previos:

  • Una instancia de Google SecOps
  • Windows Server 2016 o versiones posteriores, o host de Linux con systemd
  • Si se ejecuta detrás de un proxy, asegúrate de que los puertos de firewall estén abiertos según los requisitos del agente de Bindplane.
  • Acceso con privilegios al panel de Cisco Meraki

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

Instala el agente de Bindplane en tu sistema operativo Windows o Linux según las siguientes instrucciones.

Instalación en Windows

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

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. Espera a que se complete la instalación.

  4. Ejecute el siguiente comando para verificar la instalación:

    sc query observiq-otel-collector
    

El servicio debe mostrarse como RUNNING.

Instalación en Linux

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

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. Espera a que se complete la instalación.

  4. Ejecute el siguiente comando para verificar la instalación:

    sudo systemctl status observiq-otel-collector
    

El servicio debería mostrarse como activo (en ejecución).

Recursos de instalación adicionales

Para obtener más opciones de instalación y solucionar problemas, consulta la guía de instalación del agente de Bindplane.

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

Ubica el archivo de configuración

  • Linux:

    sudo nano /etc/bindplane-agent/config.yaml
    
  • Windows:

    notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
    

Edita el archivo de configuración

  • Reemplaza todo el contenido de config.yaml con la siguiente configuración:

    receivers:
        udplog:
            listen_address: "0.0.0.0:514"
    
    exporters:
        chronicle/chronicle_w_labels:
            compression: gzip
            creds_file_path: '/path/to/ingestion-authentication-file.json'
            customer_id: 'YOUR_CUSTOMER_ID'
            endpoint: malachiteingestion-pa.googleapis.com
            log_type: 'CISCO_MERAKI'
            raw_log_field: body
            ingestion_labels:
    
    service:
        pipelines:
            logs/source0__chronicle_w_labels-0:
                receivers:
                    - udplog
                exporters:
                    - chronicle/chronicle_w_labels
    

Parámetros de configuración

  • Reemplaza los marcadores de posición que se indican más abajo:

    • Configuración del receptor:

      • udplog: Usa udplog para el registro del sistema UDP o tcplog para el registro del sistema TCP.
      • 0.0.0.0: Dirección IP en la que se realizará la escucha (0.0.0.0 para escuchar en todas las interfaces)
      • 514: Número de puerto en el que se debe escuchar (puerto syslog estándar)
    • Configuración del exportador:

      • creds_file_path: Ruta de acceso completa al archivo de autenticación de la transferencia:
        • Linux: /etc/bindplane-agent/ingestion-auth.json
        • Windows: C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
      • YOUR_CUSTOMER_ID: ID de cliente de la sección Obtén el ID de cliente
      • endpoint: URL del extremo regional:
        • EE.UU.: malachiteingestion-pa.googleapis.com
        • Europa: europe-malachiteingestion-pa.googleapis.com
        • Asia: asia-southeast1-malachiteingestion-pa.googleapis.com
        • Consulta Extremos regionales para obtener la lista completa.
      • log_type: Tipo de registro tal como aparece en Chronicle (CISCO_MERAKI)

Guarda el archivo de configuración

  • Después de editarlo, guarda el archivo:
    • Linux: Presiona Ctrl+O, luego Enter y, después, Ctrl+X.
    • Windows: Haz clic en Archivo > Guardar

Reinicia el agente de Bindplane para aplicar los cambios

  • Para reiniciar el agente de Bindplane en Linux, ejecuta el siguiente comando:

    sudo systemctl restart observiq-otel-collector
    
    1. Verifica que el servicio esté en ejecución:

        sudo systemctl status observiq-otel-collector
      
    2. Revisa los registros en busca de errores:

        sudo journalctl -u observiq-otel-collector -f
      
  • Para reiniciar el agente de Bindplane en Windows, elige una de las siguientes opciones:

    • Símbolo del sistema o PowerShell como administrador:

      net stop observiq-otel-collector && net start observiq-otel-collector
      
    • Consola de Services:

      1. Presiona Win+R, escribe services.msc y presiona Intro.
      2. Busca observIQ OpenTelemetry Collector.
      3. Haz clic con el botón derecho y selecciona Reiniciar.

      4. Verifica que el servicio esté en ejecución:

        sc query observiq-otel-collector
        
      5. Revisa los registros en busca de errores:

        type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
        

Configura el reenvío de Syslog en Cisco Meraki

  1. Accede al panel de Cisco Meraki en https://dashboard.meraki.com.
  2. Selecciona la red de destino en el menú desplegable de redes.
  3. Ve a Configuración de la red > General.
  4. Ve a la sección Informes.
  5. Ubica Servidores Syslog y haz clic en Agregar un servidor Syslog.
  6. Proporciona los siguientes detalles de configuración:
    • IP del servidor: Ingresa la dirección IP del host del agente de Bindplane.
    • Puerto: Ingresa 514.
    • Roles: Selecciona los tipos de registros que se reenviarán:
      • Flujos: Datos de flujo de red
      • URLs: Registros de acceso a URLs
      • Eventos de seguridad: Alertas de IDS/IPS
      • Registro de eventos del dispositivo: Eventos del dispositivo MX
      • Eventos de Air Marshal: Detección de amenazas inalámbricas
      • Alertas de IDS: Son alertas del sistema de detección de intrusiones.
  7. Haz clic en Guardar.
  8. Para verificar que se envíen los mensajes de syslog, consulta los registros del agente de Bindplane.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
acción security_result.action El valor se convierte en mayúsculas. Si el valor es "deny", se reemplaza por "BLOCK". Si sc_action contiene "allow", el valor se reemplaza por "ALLOW". De lo contrario, si la decisión contiene "block", el valor se reemplaza por "BLOCK". De lo contrario, si la autorización es "success", se establece como "ALLOW", y si es "failure", se establece como "BLOCK". De lo contrario, si el patrón es "1 all", "deny all" o "Group Policy Deny", se establece en "BLOCK". Si el patrón es "permitir todo", "Permitir la política de grupo" o "0 todo", se establece en "ALLOW". De lo contrario, se establece como "UNKNOWN_ACTION". Si la decisión contiene "block", se establece como "BLOCK".
id de anuncio principal.user.user_display_name Se asigna directamente desde el campo adId en los registros JSON.
agente network.http.user_agent Se quitan los apóstrofos. Se asigna directamente desde el campo del agente. También se convirtió a network.http.parsed_user_agent con el filtro parseduseragent.
ayuda network.session_id Se asigna directamente desde el campo de ayuda.
appProtocol network.application_protocol Se convirtió a mayúsculas. Se asigna directamente desde el campo appProtocol.
attr additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "attr".
autorización security_result.action_details Se asigna directamente desde el campo de autorización en los registros JSON.
correa additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "band".
bssids.bssid principal.mac Se cambiaron a minúsculas. Se combinó en el array principal.mac.
bssids.detectedBy.device intermediary.asset.asset_id Tiene el formato "ID del dispositivo: ".
bssids.detectedBy.rssi intermediary.asset.product_object_id Se convirtió en una cadena.
Canal about.resource.attribute.labels Se agrega como un par clave-valor al array about.resource.attribute.labels con la clave "Channel".
clientDescription additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "clientDescription".
clientId additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "clientId".
clientIp principal.ip, principal.asset.ip Se asigna directamente desde el campo clientIp.
clientMac principal.mac Se cambiaron a minúsculas. Se asigna directamente desde el campo clientMac en los registros JSON.
client_ip principal.ip, principal.asset.ip Se asigna directamente desde el campo client_ip.
client_mac principal.mac Se cambiaron a minúsculas. Se asigna directamente desde el campo client_mac.
código additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "code".
collection_time metadata.event_timestamp Los campos de segundos y nanosegundos se combinan para crear una marca de tiempo.
Condiciones security_result.about.resource.attribute.labels Los retornos de carro, los saltos de línea y las tabulaciones se reemplazan por espacios, y se sustituyen valores específicos. El valor modificado se agrega como un par clave-valor al array security_result.about.resource.attribute.labels con la clave "Conditions".
decisión security_result.action Si el valor es "blocked", se establece en "BLOCK".
desc metadata.description Se asigna directamente desde el campo desc.
descripción security_result.description Se asigna directamente desde el campo de descripción en los registros JSON.
DestAddress target.ip, target.asset.ip Se asigna directamente desde el campo DestAddress.
DestPort target.port Se convierte en un número entero. Se asigna directamente desde el campo DestPort.
deviceIp target.ip Se asigna directamente desde el campo deviceIp.
deviceMac target.mac Se cambiaron a minúsculas. Se asigna directamente desde el campo deviceMac.
deviceName target.hostname, target.asset.hostname Se asigna directamente desde el campo deviceName en los registros JSON.
deviceSerial target.asset.hardware.serial_number Se asigna directamente desde el campo deviceSerial en los registros JSON.
Dirección network.direction Se quitan los caracteres especiales y el valor se asigna a network.direction.
DisabledPrivilegeList target.user.attribute Se reemplazan los retornos de carro, los saltos de línea y las tabulaciones, y el valor modificado se analiza como JSON y se combina en el objeto target.user.attribute.
dport target.port Se convierte en un número entero. Se asigna directamente desde el campo dport.
DST target.ip, target.asset.ip Se asigna directamente desde el campo dst.
dstIp target.ip, target.asset.ip Se asigna directamente desde el campo dstIp.
dstPort target.port Se convierte en un número entero. Se asigna directamente desde el campo dstPort.
dvc intermediary.hostname Se asigna directamente desde el campo dvc.
EnabledPrivilegeList target.user.attribute Se reemplazan los retornos de carro, los saltos de línea y las tabulaciones, y el valor modificado se analiza como JSON y se combina en el objeto target.user.attribute.
eventData.aid principal.asset_id Se formatea como "ASSET_ID:".
eventData.client_ip principal.ip, principal.asset.ip Se asigna directamente desde el campo eventData.client_ip en los registros JSON.
eventData.client_mac principal.mac Se cambiaron a minúsculas. Se asigna directamente desde el campo eventData.client_mac en los registros JSON.
eventData.group principal.group.group_display_name Se asigna directamente desde el campo eventData.group en los registros JSON.
eventData.identity principal.hostname Se asigna directamente desde el campo eventData.identity en los registros JSON.
eventData.ip principal.ip, principal.asset.ip Se asigna directamente desde el campo eventData.ip en los registros JSON.
EventID metadata.product_event_type, security_result.rule_name Se convirtió en una cadena. Se asigna a metadata.product_event_type. También se usa para crear security_result.rule_name en el formato "EventID: ". Se usa para determinar event_type y sec_action.
eventSummary security_result.summary, metadata.description Se asigna directamente desde el campo eventSummary. También se usa en security_result.description para algunos eventos.
eventType metadata.product_event_type Se asigna directamente desde el campo eventType. Se usa para determinar qué lógica de análisis se debe aplicar.
filename principal.process.file.full_path Se asigna directamente desde el campo de nombre de archivo.
FilterId target.resource.product_object_id Se asigna directamente desde el campo FilterId para el EventID 5447.
FilterName target.resource.name Se asigna directamente desde el campo FilterName para EventID 5447.
FilterRTID security_result.detection_fields Se agrega como un par clave-valor al array security_result.detection_fields con la clave "FilterRTID".
firstSeen security_result.detection_fields Se convirtió en una cadena. Se agrega como un par clave-valor al array security_result.detection_fields con la clave "firstSeen".
gatewayDeviceMac target.mac Se cambiaron a minúsculas. Se combinó en el array target.mac.
grupo additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "group".
GroupMembership target.user Se quitan los retornos de carro, las nuevas líneas, los tabuladores y los caracteres especiales. El valor modificado se analiza como JSON y se combina con el objeto target.user.
Nombre de host principal.hostname, principal.asset.hostname Se asigna directamente desde el campo Nombre de host.
nivel empresarial target.user.userid Se asigna directamente desde el campo de identidad.
instigador additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "instigator".
int_ip intermediary.ip Se asigna directamente desde el campo int_ip.
ip_msg principal.resource.attribute.labels Se agrega como un par clave-valor al array principal.resource.attribute.labels con la clave "IPs".
is_8021x additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "is_8021x".
KeyName target.resource.name Se asigna directamente desde el campo KeyName.
KeyFilePath target.file.full_path Se asigna directamente desde el campo KeyFilePath.
lastSeen security_result.detection_fields Se convirtió en una cadena. Se agrega como un par clave-valor al array security_result.detection_fields con la clave "lastSeen".
last_known_client_ip principal.ip, principal.asset.ip Se asigna directamente desde el campo last_known_client_ip.
LayerName security_result.detection_fields Se agrega como un par clave-valor al array detection_fields de security_result con la clave "Layer Name".
LayerRTID security_result.detection_fields Se agrega como un par clave-valor al array security_result.detection_fields con la clave "LayerRTID".
localIp principal.ip, principal.asset.ip Se asigna directamente desde el campo localIp.
acceder principal.user.email_addresses Se asigna directamente desde el campo de acceso en los registros JSON si coincide con un formato de dirección de correo electrónico.
LogonGuid additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "LogonGuid".
LogonType extensions.auth.mechanism Se asigna a un mecanismo de autenticación específico según su valor. Si PreAuthType está presente, anula LogonType. Los valores se asignan de la siguiente manera: 2 -> USERNAME_PASSWORD, 3 -> NETWORK, 4 -> BATCH, 5 -> SERVICE, 7 -> UNLOCK, 8 -> NETWORK_CLEAR_TEXT, 9 -> NEW_CREDENTIALS, 10 -> REMOTE_INTERACTIVE, 11 -> CACHED_INTERACTIVE, 12 -> CACHED_REMOTE_INTERACTIVE, 13 -> CACHED_UNLOCK, other -> MECHANISM_UNSPECIFIED.
mac principal.mac Se cambiaron a minúsculas. Se combinó en el array principal.mac.
MandatoryLabel additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "MandatoryLabel".
Mensaje security_result.description, security_result.summary Si AccessReason está presente, Message se asigna a security_result.summary y AccessReason se asigna a security_result.description. De lo contrario, Message se asigna a security_result.description.
método network.http.method Se asigna directamente desde el campo del método.
msg security_result.description Se asigna directamente desde el campo msg.
nombre principal.user.user_display_name Se asigna directamente desde el campo name en los registros JSON.
natsrcIp principal.nat_ip Se asigna directamente desde el campo natsrcIp.
natsrcport principal.nat_port Se convierte en un número entero. Se asigna directamente desde el campo natsrcport.
network_id additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "ID de red".
NewProcessId target.process.pid Se asigna directamente desde el campo NewProcessId.
NewProcessName target.process.file.full_path Se asigna directamente desde el campo NewProcessName.
NewSd target.resource.attribute.labels Se agrega como un par clave-valor al array target.resource.attribute.labels con la clave "Nuevo descriptor de seguridad".
occurredAt metadata.event_timestamp Se analiza como una marca de tiempo con el formato ISO8601.
ObjectName target.file.full_path, target.registry.registry_key, target.process.file.full_path, additional.fields Si EventID es 4663 y ObjectType es "Process", se asigna a target.process.file.full_path. Si ObjectType es "Key", se asigna a target.registry.registry_key. De lo contrario, se asigna a target.file.full_path. Para otros eventos, se agrega como un par clave-valor al array additional.fields con la clave "ObjectName".
ObjectType additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "ObjectType". Se usa para determinar event_type.
OldSd target.resource.attribute.labels Se agrega como un par clave-valor al array target.resource.attribute.labels con la clave "Descriptor de seguridad original".
organizationId principal.resource.id Se asigna directamente desde el campo organizationId en los registros JSON.
ParentProcessName target.process.parent_process.file.full_path Se asigna directamente desde el campo ParentProcessName.
patrón security_result.description Se asigna directamente a security_result.description. Se usa para determinar security_result.action.
peer_ident target.user.userid Se asigna directamente desde el campo peer_ident.
PreAuthType extensions.auth.mechanism Se usa para determinar el mecanismo de autenticación, si está presente. Anula LogonType.
principalIp principal.ip, principal.asset.ip Se asigna directamente desde el campo principalIp.
principalMac principal.mac Se cambiaron a minúsculas. Se combinó en el array principal.mac.
principalPort principal.port Se convierte en un número entero. Se asigna directamente desde el campo principalPort.
prin_ip2 principal.ip, principal.asset.ip Se asigna directamente desde el campo prin_ip2.
prin_url principal.url Se asigna directamente desde el campo prin_url.
priority security_result.priority Se asigna a un nivel de prioridad según su valor: 1 -> HIGH_PRIORITY, 2 -> MEDIUM_PRIORITY, 3 -> LOW_PRIORITY y otros -> UNKNOWN_PRIORITY.
ProcessID principal.process.pid Se convirtió en una cadena. Se asigna directamente desde el campo ProcessID.
ProcessName principal.process.file.full_path, target.process.file.full_path Si EventID es 4689, se asigna a target.process.file.full_path. De lo contrario, se asigna a principal.process.file.full_path.
prod_log_id metadata.product_log_id Se asigna directamente desde el campo prod_log_id.
protocolo network.ip_protocol Se convirtió a mayúsculas. Si es un número, se convierte en el nombre del protocolo IP correspondiente. Si es "ICMP6", se reemplaza por "ICMP". Se asigna directamente desde el campo del protocolo.
ProviderGuid metadata.product_deployment_id Se asigna directamente desde el campo ProviderGuid.
consulta network.dns.questions.name Se asigna directamente desde el campo de búsqueda.
query_type network.dns.questions.type Se cambió el nombre a question.type y se combinó en el array network.dns.questions. Se asigna a un valor numérico según el tipo de consulta de DHCP.
radio additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "radio".
Reason additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "reason".
rec_bytes network.received_bytes Se convierte en un número entero sin signo. Se asigna directamente desde el campo rec_bytes.
RecordNumber metadata.product_log_id Se convirtió en una cadena. Se asigna directamente desde el campo RecordNumber.
RelativeTargetName target.process.file.full_path Se asigna directamente desde el campo RelativeTargetName.
response_ip principal.ip, principal.asset.ip Se asigna directamente desde el campo response_ip.
rssi intermediary.asset.product_object_id Se asigna directamente desde el campo rssi.
sc_action security_result.action_details Se asigna directamente desde el campo sc_action.
sec_action security_result.action Se combinó en el array security_result.action.
server_ip client_ip Se asigna directamente al campo client_ip.
Gravedad security_result.severity Se asigna a un nivel de gravedad según su valor: "Info" -> INFORMATIONAL, "Error" -> ERROR, "Warning" -> MEDIUM, otro -> UNKNOWN_SEVERITY.
sha256 target.file.sha256 Se asigna directamente desde el campo sha256.
firma additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "signature".
SourceAddress principal.ip, principal.asset.ip Se asigna directamente desde el campo SourceAddress.
SourceHandleId src.resource.id Se asigna directamente desde el campo SourceHandleId.
SourceModuleName observer.labels Se agrega como un par clave-valor al array observer.labels con la clave "SourceModuleName".
SourceModuleType observer.application Se asigna directamente desde el campo SourceModuleType.
SourcePort principal.port Se convierte en un número entero. Se asigna directamente desde el campo SourcePort.
SourceProcessId src.process.pid Se asigna directamente desde el campo SourceProcessId.
source_client_ip client_ip Se asigna directamente al campo client_ip.
deporte principal.port Se convierte en un número entero. Se asigna directamente desde el campo de deporte.
src principal.ip, principal.asset.ip Se asigna directamente desde el campo src.
ssid network.session_id Se asigna directamente desde el campo ssid en los registros JSON.
ssidName additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "ssidName".
state additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "state".
Estado additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "Status".
status_code network.http.response_code Se convierte en un número entero. Se asigna directamente desde el campo status_code.
SubjectDomainName principal.administrative_domain Se asigna directamente desde el campo SubjectDomainName.
SubjectLogonId principal.resource.attribute.labels Se agrega como un par clave-valor al array principal.resource.attribute.labels con la clave "SubjectLogonId".
SubjectUserName principal.user.userid Se asigna directamente desde el campo SubjectUserName.
SubjectUserSid principal.user.windows_sid Se asigna directamente desde el campo SubjectUserSid.
targetHost target.hostname, target.asset.hostname Se convierte en una dirección IP si es posible. De lo contrario, se analiza para extraer el nombre de host y se asigna a target.hostname y target.asset.hostname.
TargetHandleId target.resource.id Se asigna directamente desde el campo TargetHandleId.
TargetLogonId principal.resource.attribute.labels Se agrega como un par clave-valor al array principal.resource.attribute.labels con la clave "TargetLogonId" si es diferente de SubjectLogonId.
TargetProcessId target.process.pid Se asigna directamente desde el campo TargetProcessId.
TargetUserName target.user.userid Se asigna directamente desde el campo TargetUserName.
TargetUserSid target.user.windows_sid Se asigna directamente desde el campo TargetUserSid.
Tarea additional.fields Se convirtió en una cadena. Se agrega como un par clave-valor al array additional.fields con la clave "Task".
timestamp metadata.event_timestamp El campo de segundos se usa para crear una marca de tiempo.
ts metadata.event_timestamp Si ts está vacío, se crea combinando tsDate, tsTime y tsTZ. Si contiene "", se analiza para extraer el valor entero. Luego, se analiza como una marca de tiempo con varios formatos.
tipo security_result.summary, metadata.product_event_type Se asigna directamente desde el campo type en los registros JSON. También se usa como eventSummary y metadata.product_event_type en algunos casos.
url target.url, principal.url Se asigna directamente desde el campo de URL.
url1 target.url Se asigna directamente desde el campo url1.
usuario target.user.group_identifiers Se fusionó en el array target.user.group_identifiers.
user_id target.user.userid Se asigna directamente desde el campo user_id.
UserID principal.user.windows_sid Se asigna directamente desde el campo UserID.
UserName principal.user.userid Se asigna directamente desde el campo UserName.
user_agent network.http.user_agent Se asigna directamente desde el campo user_agent.
userid target.user.userid Se asigna directamente desde el campo userId.
vap additional.fields Se agrega como un par clave-valor al array additional.fields con la clave "vap".
VirtualAccount security_result.about.labels Se agrega como un par clave-valor al array security_result.about.labels con la clave "VirtualAccount".
wiredLastSeen security_result.detection_fields Se convirtió en una cadena. Se agrega como un par clave-valor al array security_result.detection_fields con la clave "wiredLastSeen".
wiredMacs intermediary.mac Se cambiaron a minúsculas. Se combinó en el array intermediary.mac.
WorkstationName principal.hostname, principal.asset.hostname Se asigna directamente desde el campo WorkstationName.

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.