Recopilación y análisis de datos de Zeek con Elastic Security
En este blog, te guiaré a través del proceso de configuración tanto de Filebeat como de Zeek (anteriormente conocido como Bro), lo que te permitirá realizar analíticas de los datos de Zeek mediante Elastic Security. La configuración predeterminada de Filebeat y sus módulos funciona para muchos entornos; sin embargo, es posible que necesites personalizar los ajustes específicos para tu entorno. Los pasos detallados en este blog deberían facilitar la comprensión de los pasos necesarios para personalizar tu configuración con el objetivo de poder ver los datos de Zeek dentro de Elastic Security.
Beats son agentes ligeros ideales para recopilar y enviar datos desde o cerca del borde de tu red a un cluster de Elasticsearch. Beats envía datos que cumplen con el Elastic Common Schema (ECS). Filebeat, un miembro de la familia Beat, incluye módulos internos que simplifican la recopilación, el parseo y la visualización de formatos de logs comunes. Los módulos logran esto combinando rutas predeterminadas automáticas basadas en tu sistema operativo. Usaremos Filebeat para parsear datos de Zeek.
También cubriré detalles específicos sobre el proceso de enriquecimiento de GeoIP para mapear los eventos en Elastic Security. Además, detallaré cómo configurar Zeek para la salida de datos en formato JSON, lo cual es requerido por Filebeat. Este blog cubre solo la configuración. Asumo que ya tienes un cluster de Elasticsearch configurado con Filebeat y Zeek instalados.
Detalles del entorno
Mi cluster de Elastic se creó usando Elasticsearch Service, que está hospedado en Elastic Cloud. Puedes activar fácilmente un cluster con una prueba gratuita de 14 días, sin necesidad de tarjeta de crédito. Deberías probarlo, ya que hace que comenzar con el Elastic Stack sea rápido y sencillo.
Estoy usando Zeek 3.0.0. Puedes encontrar Zeek para descargar en el sitio web de Zeek.
Visión general de Filebeat
Filebeat se envía con docenas de integraciones listas para usar, lo que hace que pasar de los datos al dashboard en minutos sea una realidad. Puedes encontrar fácilmente lo que necesitas en nuestra lista completa de integraciones. Los módulos no solo entienden cómo parsear los datos de origen, sino que también configurarán un pipeline de ingesta para transformar los datos al formato ECS.
Elastic está trabajando para mejorar la experiencia de incorporación de datos e ingesta de datos con Elastic Agent e Ingest Manager. Sin embargo, actualmente es una versión experimental, por lo que nos centraremos en usar los módulos de Filebeat listos para producción. Además, muchos de los módulos proporcionarán uno o más dashboards de Kibana listos para usar.

Habilitar el módulo de Zeek en Filebeat
Lo primero que debemos hacer es habilitar el módulo de Zeek en Filebeat. Todos los módulos proporcionados por Filebeat están deshabilitados de forma predeterminada.
Paso 1: Habilitar el módulo de Zeek en Filebeat
Habilitar el módulo de Zeek en Filebeat es tan sencillo como ejecutar el siguiente comando:
sudo filebeat modules enable zeek
Este comando habilitará Zeek a través del archivo de configuración zeek.yml en el directorio modules.d de Filebeat. Filebeat debería ser accesible desde tu path. Si no lo es, la ubicación predeterminada para Filebeat es /usr/bin/filebeat si instalaste Filebeat usando el repositorio de GitHub de Elastic.
Paso 2: Agregar la ruta de log de Zeek a zeek.yml
Las rutas de los logs de Zeek se configuran en el módulo de Filebeat de Zeek, no en Filebeat en sí. Debes editar el archivo de configuración del módulo de Filebeat de Zeek, zeek.yml. Para mi instalación de Filebeat, se encuentra en /etc/filebeat/modules.d/zeek.yml. Debes agregar entradas para cada uno de los logs de Zeek que te interesen. El directorio base donde mi instalación de Zeek escribe los logs es /usr/local/zeek/logs/current
Aquí tienes la lista completa de rutas de logs de Zeek. Deberás editar estas rutas para que sean adecuadas para tu entorno.
# Módulo: zeek
# Documentos: /guide/en/beats/filebeat/7.6/filebeat-module-zeek.html
- module: zeek
capture_loss:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/capture_loss.log"]
conexión:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/conn.log"]
dce_rpc:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dce_rpc.log"]
dhcp:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dhcp.log"]
dnp3:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dnp3.log"]
DNS:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dns.log"]
dpd:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dpd.log"]
archivos:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/files.log"]
ftp:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/ftp.log"]
http:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/http.log"]
inteligencia:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/intel.log"]
irc:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/irc.log"]
kerberos:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/kerberos.log"]
modbus:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/modbus.log"]
MySQL:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/mysql.log"]
aviso:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/notice.log"]
ntlm:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/ntlm.log"]
ocsp:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/ocsp.log"]
pe:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/pe.log"]
radio:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/radius.log"]
rdp:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/rdp.log"]
rfb:
enabled: true
var.paths: ["/usr/local/Zeek/log/current/rfb.log"]
# firmas:
# enabled: true
# var.paths: ["/usr/local/zeek/logs/current/signatures.log"]
SIBE:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/sip.log"]
smb_cmd:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/smb_cmd.log"]
smb_files:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/smb_files.log"]
smb_mapping:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/smb_mapping.log"]
smtp:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/smtp.log"]
snmp:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/snmp.log"]
socks:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/socks.log"]
ssh:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/ssh.log"]
ssl:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/ssl.log"]
estadísticas:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/stats.log"]
syslog:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/syslog.log"]
traceroute:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/traceroute.log"]
túnel:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/tunnel.log"]
extraño:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/weird.log"]
x509:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/x509.log"]
Nota: El log de firma está comentado porque el analizador de Filebeat no incluye (a la fecha de publicación) soporte para el log de firma en el momento de este blog.
Paso 3: Reiniciar Filebeat
Una vez que hayas terminado de editar y guardar tu archivo de configuración zeek.yml, deberías reiniciar Filebeat. Aunque tu versión de Linux puede requerir una ligera variación, esto se hace normalmente mediante:
sudo systemctl restart filebeat
En este punto, normalmente esperarías ver datos de Zeek visibles en Elastic Security y en los índices de Filebeat. No te sorprendas cuando no veas tus datos de Zeek en Discover o en ningún dashboard. Hay algunos pasos más que debes seguir.
Configura Zeek para dar salida a JSON
De forma predeterminada, Zeek no da salida a logs en formato JSON. Esto es lo que provoca que los datos de Zeek no aparezcan en los índices de Filebeat. El módulo de Zeek de Filebeat asume que los logs de Zeek están en JSON. Es probable que veas errores de parseo de logs si intentas parsear los logs predeterminados de Zeek.
- Debes editar el archivo de configuración
local.zeekpara configurar la salida de logging JSON. La ubicación de este archivo de configuración dependerá de tu instalación de Zeek. Mi instalación de Zeek se encuentra en/usr/local/zeek. Mi archivo de configuración se encuentra en/usr/local/zeek/share/zeek/site/local.zeek. - Agrega la siguiente línea al final del archivo de configuración:
@load policy/tuning/json-logs.zeek
- Después de terminar de editar el archivo de configuración
local.zeek, deberás reiniciar Zeek usando:sudo zeekctl desplegar
Esto reiniciará Zeek usando la configuración actualizada del archivo. - Una vez que hayas realizado esa edición, deberías reiniciar Filebeat. En este punto, deberías ver los datos de Zeek visibles en tus índices de Filebeat.
Esta es una vista de Discover (Descubrir) que muestra los valores de los campos geo poblados con datos:

Enriquecimiento con GeoIP
Una vez que los datos de Zeek estuvieron en los índices de Filebeat, me sorprendió no ver ninguna de las líneas de “pew pew” en la pestaña Network en Elastic Security. Creé el pipeline de ingesta geoip-info como se documenta en la documentación de la UI de configuración de mapear de SIEM. También verifiqué que estaba haciendo referencia a ese pipeline en la sección de salida de la configuración de Filebeat, tal como se documenta.
Este es un ejemplo de cómo definir el pipeline en el archivo de configuración filebeat.yml:
salida.elasticsearch: # Matriz de hosts a los que conectarse. hosts: ["localhost:9200"] pipeline: geoip-info
Los Node en los que estoy ejecutando Zeek utilizan direcciones IP no enrutables, por lo que necesité usar el procesador add_field de Filebeat para mapear la información geográfica basada en la dirección IP. Aunque esa información está documentada en el enlace anterior, hubo un problema con los nombres de los campos.
El pipeline de GeoIP asume que la información de IP estará en source.ip y destination.ip. Esto es cierto para la mayoría de las fuentes. Sin embargo, con Zeek, esa información está contenida en source.address y destination.address. ¿Por qué sucede esto? Realmente se reduce al flujo de datos y a cuándo se activa el pipeline de ingesta.
El módulo de Zeek para Filebeat crea un pipeline de ingesta para convertir datos a ECS. Este pipeline copia los valores de source.address a source.ip y de destination.address a destination.ip. Sin embargo, el procesador add_fields que agrega campos en Filebeat ocurre antes de que el pipeline de ingesta procese los datos. Por lo tanto, los valores de source.ip y destination.ip aún no están poblados cuando el procesador add_field está activo.
Modifiqué mi configuración de Filebeat para usar el procesador add_field y usar address en lugar de ip. Esto es lo que se ve:
procesadores:
- add_host_metadata:
- add_cloud_metadata:
- add_fields:
when.network.source.address: 10.128.0.0/24
campo:
source.geo.location:
lat: 41.619549
lon: -93.598022
source.geo.continent_name: Norteamérica
source.geo.country_iso_code: EE. UU.
source.geo.region_iso_code: US-IA
source.geo.region_name: Iowa
target: ''
- add_fields:
when.network.destination.address: 10.128.0.0/24
campo:
destination.geo.location:
lat: 41.619549
lon: -93.598022
destination.geo.continent_name: Norteamérica
destination.geo.country_iso_code: EE. UU.
Debes tener en cuenta que estoy usando el campo address en la línea when.network.source.address en lugar de when.network.source.ip como se indica en la documentación. Esto también es válido para la línea destination. Esto soluciona el tiempo del flujo de datos que mencioné anteriormente. En esta etapa del flujo de datos, la información que necesito está en el campo source.address.
Verifica los datos de Zeek en Elastic Security
Una vez que hayas completado todos los cambios en tu archivo de configuración filebeat.yml, deberás reiniciar Filebeat usando:
sudo systemctl restart filebeat
Ahora abre Elastic Security y navega a la pestaña Network. El mapa debería mostrar correctamente las líneas "pew pew" que esperábamos ver.

Además del mapa de red, también deberías ver datos de Zeek en la pestaña de visión general de Elastic Security. En este ejemplo, puedes ver que Filebeat ha recopilado más de 500 000 eventos de Zeek en las últimas 24 horas.

También puedes ver los eventos de Zeek aparecer como alertas externas dentro de Elastic Security.

El número de pasos necesarios para completar esta configuración fue relativamente pequeño. Por lo general, debería tomar solo unos minutos completar esta configuración, ¡lo que reafirma lo fácil que es pasar de los datos al dashboard en minutos!
¿Qué sigue?
Entonces, ¿cuáles son los siguientes pasos? Piensa en otros feeds de datos que quizás quieras incorporar, como Suricata y flujos de datos de host. Te animo a que eches un vistazo a nuestro blog Getting started with adding a new seguridad datos source in Elastic SIEM, que te guía a través de la adición de nuevas fuentes de datos de seguridad para su uso en Elastic Security.
¿Listo para una protección de datos integral con Elastic Security? Pruébalo gratis hoy en Elasticsearch Service en Elastic Cloud.
.