Análisis Profundo de SYSLOG
En nuestro último blog de ELK, configuramos ELK (Elasticsearch, Logstash y Kibana) en Docker. Ahora vamos a transformar esos registros complejos en bloques de construcción que te permitirán crear visualizaciones en Kibana.
Si aún no has leído Práctica Práctica con ELK Stack, entonces puedes comenzar clonando el siguiente repositorio de GitHub para configurar tu ELK Stack: https://github.com/object1st/elk-stack.git
cd elk-stack
comando de ejecución:
docker-compose up -d
Luego, navega a tu navegador en la dirección IP o nombre DNS de tu VM (o localhost si lo estás haciendo localmente) y en el puerto 5601, accede a Kibana: http://myvm:5601
Análisis de Syslog
Al final de este recorrido, puedes esperar tener:
- Analizado un mensaje syslog complejo
- Creado detección de amenazas inteligente que detecta un indicador de ransomware automáticamente
- Construido un panel para mostrar la alerta
El Desafío: Estructuras de Registro Complejas
Comencemos con un mensaje syslog del mundo real.
Ejemplo: Veeam Detección de Malware
Mar 20, 2025 @ 14:06:09.662 VBRSRV01 Veeam_MP: [origin enterpriseId="31023"] [categoryId=0 instanceId=41600 DetectionTimeUTC="03/20/2025 13:05:41" OibID="0e54d3bf-add8-48eb-9122-fad3ac1e8fb3" ActivityType="EncryptedData" UserName="TECH\user1" ObjectName="VM01" VbrHostName="vbrsrv01.tech.local" Description="Potential malware activity detected for OIB: 0e54d3bf-add8-48eb-9122-fad3ac1e8fb3 (VM01), rule: Encrypted data by user: TECH\user1."]
Por qué Estos Mensajes Son Importantes
Encontrarás información valiosa en este mensaje de registro—tómate un momento para explorarlo.
Veeam mensaje:
- Actividad potencial de ransomware en progreso
- Cuenta de usuario específica involucrada (TECH\user1)
- Máquina virtual afectada (VM01)
- Patrón de comportamiento (Actividad de Datos Encriptados)
Pero en su estado actual, no puedes fácilmente:
- Rastrear qué VMs están potencialmente afectadas.
- Correlacionar actividad sospechosa a través del tiempo
- Generar informes sobre esta actividad
Paso 1: Comenzar Simple, Construir Inteligente
Aquí es donde la mayoría de las personas se equivocan: tratando de analizar todo a la vez y terminando con una configuración que no funciona.
Si deseas seguir, localiza los archivos en la carpeta “Ejemplos” del repositorio de GitHub. Si ya has instalado ELK en Docker desde la publicación anterior del blog, simplemente copia esos archivos en tu configuración. A medida que trabajas a través de este blog, reemplaza los archivos existentes con las versiones actualizadas proporcionadas aquí. Si cometes un error o te pierdes mientras editas, siempre puedes volver a clonar el repositorio para comenzar de nuevo.
- Para usar, elimina el logstash.conf en la canalización reemplazándolo con
logstash_version1.conf ($ cp ~/elk-stack/Examples/logstash_version1.conf ~/elk-stack/logstash/pipeline/logstash.conf)
- Reinicia el contenedor de logstash ($ docker-compose restart logstash).
Por qué este enfoque funciona:
- Comienza con entrada/salida funcional
- Usa stdout para ver exactamente qué recibe Logstash (se mostrará en los registros del contenedor de docker)
- Los registros en bruto aún van a Elasticsearch (nada se pierde)
- Construye complejidad gradualmente sin romper cosas
Paso 2: Prueba Tu Configuración
- Envía tus mensajes de muestra a Logstash y observa la salida. Aquí hay algunos métodos que puedes usar para enviar un mensaje syslog tú mismo.
- Usando netcat:
- Copia y pega el siguiente comando en tu CLI (Veeam Mensaje Syslog):
echo '<14>1 2025-03-20T14:06:09.662307+02:00 VBRSRV01 Veeam_MP - - [origin enterpriseId="31023"] [categoryId=0 instanceId=41600 DetectionTimeUTC="03/20/2025 13:05:41" OibID="0e54d3bf-add8-48eb-9122-fad3ac1e8fb3" ActivityType="EncryptedData" UserName="TECH\user1" ObjectName="VM01" VbrHostName="vbrsrv01.tech.local" Description="Potential malware activity detected"]' | nc -u -q0 localhost 5514
- Deberías ver algo como esto cuando escribas docker logs logstash:
Este es un problema porque todo lo Valioso está Atrapado en un Gran Campo de Mensaje:
“"message" => "<14>1 2025-03-20T14:06:09.662307+02:00 VBRSRV01 Veeam_MP - - [origin enterpriseId=\"31023\"] [categoryId=0 instanceId=41600 DetectionTimeUTC=\"03/20/2025 13:05:41\" OibID=\"0e54d3bf-add8-48eb-9122-fad3ac1e8fb3\" ActivityType=\"EncryptedData\" UserName=\"TECH\\user1\" ObjectName=\"VM01\" VbrHostName=\"vbrsrv01.tech.local\" Description=\"Potential malware activity detected\"]\n",”
Para abordar este problema, analiza los registros para hacerlos más limpios.
Aquí es donde las cosas se ponen interesantes (y ligeramente aterradoras si eres nuevo en regex). Vamos a diseccionar este registro y hacerlo más fácil para seleccionar fragmentos de información.
Antes de escribir cualquier código, entendamos con qué estamos trabajando:
Veeam Estructura: [timestamp] [hostname] [application]: [origin_data] [detection_data]
Paso 3: Análisis Básico
Copia el siguiente archivo de logstash:
1. Para usar, elimina el logstash.conf en la canalización reemplazándolo con logstash_version2.conf ($
cp ~/elk-stack/Examples/logstash_version2.conf ~/elk-stack/logstash/pipeline/logstash.conf)
2. Reinicia el contenedor de logstash ($ docker-compose restart logstash)
Patrón Grok Decodificado:
- %{POSINT:priority} → Captura enteros positivos como "priority"
- %{TIMESTAMP_ISO8601:timestamp} → Patrón incorporado para marcas de tiempo ISO
- %{IPORHOST:host} → Dirección IP o nombre de host
- %{GREEDYDATA:raw_message} → Todo lo demás (analizaremos esto a continuación)
Este nuevo patrón Grok está diseñado para descomponer mensajes syslog en bruto en datos estructurados y utilizables. Específicamente, separa los componentes básicos de un mensaje syslog (como la marca de tiempo, el nombre de host y el nivel de registro), identifica la fuente de la aplicación que genera el registro y etiqueta cada mensaje para un procesamiento posterior en la canalización. Este paso fundamental es lo que permite un análisis más avanzado, enriquecimiento y lógica de alertas más adelante en el flujo de trabajo.
3. Prueba nuevamente para ver las diferencias:
echo '<14>1 2025-03-20T14:06:09.662307+02:00 VBRSRV01 Veeam_MP - - [origin enterpriseId="31023"] [categoryId=0 instanceId=41600 DetectionTimeUTC="03/20/2025 13:05:41" OibID="0e54d3bf-add8-48eb-9122-fad3ac1e8fb3" ActivityType="EncryptedData" UserName="TECH\user1" ObjectName="VM01" VbrHostName="vbrsrv01.tech.local" Description="Potential malware activity detected"]' | nc -u -q0 localhost 5514
4. Luego, verifica los registros del contenedor de logstash ($ docker logs logstash).
Los campos que extraímos:
priority → 0
timestamp → 2025-03-20T14:06:09.662307+02:00
host → ["172.19.0.1", "VBRSRV01"]
application → "Veeam_MP"
severity → "Emergency"
severity_level → 0
Paso 4: Análisis Más Profundo
Ahora haremos aún más análisis. El archivo es demasiado grande para imprimir aquí, pero está en tu carpeta “Ejemplos” como logstash_version3.conf.
- Para usar, elimina el logstash.conf en la canalización reemplazándolo con: logstash_version3.conf ($
cp ~/elk-stack/Examples/logstash_version3.conf ~/elk-stack/logstash/pipeline/logstash.conf)
- Reinicia el contenedor de logstash ($ docker-compose restart logstash).
- En este punto, prueba tu configuración. Deberías ver campos individuales en lugar de un gran bloque de mensaje.
- Ejecuta el mismo mensaje de prueba nuevamente, luego verifica los registros del contenedor de logstash ($ docker logs logstash).
Los campos que extraímos:
enterprise_id → "31023"
category_id → 0 (convertido a entero)
instance_id → 41600 (convertido a entero)
detection_time_utc → "03/20/2025 13:05:41"
detection_timestamp → 2025-03-20T13:05:41.000Z (marca de tiempo correctamente analizada)
oib_id → "0e54d3bf-add8-48eb-9122-fad3ac1e8fb3" (ID de alerta único)
activity_type → "EncryptedData" (indicador de malware)
username → "TECH\\user1"
object_name → "VM01" (VM afectada)
vbr_hostname → "vbrsrv01.tech.local"
description → "Actividad potencial de malware detectada"
Paso 5: Veeam Inteligencia de Amenazas y Manejo de Errores
Por último, pero no menos importante, necesitamos agregar inteligencia a nuestro sistema y manejo de errores para ayudarnos a depurar si es necesario. Agregar inteligencia es importante porque permite filtrar por impacto en el negocio, permite alertas basadas en prioridades, hace que la creación de paneles sea intuitiva, proporciona recomendaciones accionables y reduce la fatiga de alertas.
Así es como agregar inteligencia y manejar errores:
- Para usar, elimina el logstash.conf en la canalización reemplazándolo con: logstash_version4.conf ($
cp ~/elk-stack/Examples/logstash_version4.conf ~/elk-stack/logstash/pipeline/logstash.conf)
- Reinicia el contenedor de logstash ($ docker-compose restart logstash).
- Espera a que la canalización esté en funcionamiento y luego envía el mensaje de prueba nuevamente:
echo '<14>1 2025-03-20T14:06:09.662307+02:00 VBRSRV01 Veeam_MP - - [origin enterpriseId="31023"] [categoryId=0 instanceId=41600 DetectionTimeUTC="03/20/2025 13:05:41" OibID="0e54d3bf-add8-48eb-9122-fad3ac1e8fb3" ActivityType="EncryptedData" UserName="TECH\user1" ObjectName="VM01" VbrHostName="vbrsrv01.tech.local" Description="Potential malware activity detected"]' | nc -u -q0 localhost 5514
Qué nuevos campos hemos extraído:
threat_type → "potential_ransomware" (categorización inteligente de amenazas)
event_category → "malware" (clasificación de seguridad)
business_impact → "high" (evaluación de riesgos)
alert_priority → "critical" (prioridad de escalación)
recommendation → "Investigación inmediata requerida" (guía de respuesta)
event_type → "security_event" (clasificación de eventos)
Resumen de la Sección
En esta sección, hemos completado con éxito lo siguiente:
- Agregado contexto empresarial a eventos en bruto
- Creado clasificación de severidad inteligente
- Construido sistema de categorización de amenazas
- Habilitado alertas basadas en prioridades
Paso 6: Crear una Plantilla de Índice
Antes de comenzar a enviar datos a Elasticsearch, necesitamos optimizarlo para nuestro caso de uso específico.
1. En el repositorio de GitHub, encontrarás el archivo index_template.json, que podemos importar a Kibana.
2. Utilicemos un comando curl para importar nuestro index_template.json desde la carpeta “Ejemplos”.
Si tienes problemas para copiar los comandos aquí, también puedes encontrarlos en el archivo README.md del repositorio de github
curl -X PUT "localhost:9200/_index_template/veeam-syslog-template" \ -H "Content-Type: application/json" \ -d @index_template.json
3. Deberías ver este mensaje si la importación fue exitosa.
4. A continuación, crearemos un Patrón de Índice (en versiones posteriores llamado Vistas de Datos).
- Escribe el siguiente comando:
curl -X POST "localhost:5601/api/saved_objects/index-pattern/syslog-pattern" -H "Content-Type: application/json" -H "kbn-xsrf: true" -d '{"attributes":{"title":"syslog-*","timeFieldName":"@timestamp"}}'
- También podrías crear a través de la WebUI.
5. Verifica si se creó el Patrón de Índice tomando las siguientes acciones:
- Ve a Gestión de Pila
- Haz clic en “Patrones de Índice” bajo “Kibana”
- Aquí podemos ver nuestro Patrón de Índice recién creado.
6. A continuación, necesitamos crear una visualización.
- Haz clic en “Biblioteca de Visualizaciones.”
- Haz clic en el mosaico “Lens.”
- Desde el menú desplegable, elige “Métrica.”
7. En el campo de filtro, escribe: threat_type: “potential_ransomware”
8. Elige “Overtime” en el medio (esta es tu elección de cómo quieres que se vea el panel).
9. Guarda la Visualización haciendo clic en el botón "Guardar” en la esquina superior derecha y añádela a un nuevo Panel:
10. Cambia el “Nombre” bajo Métricas a “Alertas” y elige Registros a la izquierda.
- Deberías terminar con esto:
11. Guarda esto en tu Biblioteca de Visualizaciones y elige “Sin Panel” por ahora.
12. A continuación, crea otra visualización que llamaremos “Máquinas Afectadas.”
- Esta vez, elige Tabla, no Métrica, y utiliza el campo “Top values of object_name” y nuevamente registro. Cambia los nombres de las Columnas presionando sobre los nombres del lado derecho y cambiando el nombre de Visualización:
13. Guarda en tu biblioteca nuevamente.
14. Ahora, vamos a crear otra visualización de tabla—esta vez usando el campo “Top Values of Username”. Esto puede ayudar a identificar qué usuarios podrían haber estado conectados durante el ataque. Ten en cuenta que esto es puramente con fines exploratorios y demuestra cuán creativamente puedes aprovechar los datos.
15. Finalmente, crea una visualización de área—esta vez mostrando alertas y líneas de tiempo.
16. Siéntete libre de crear más o cambiar las existentes para familiarizarte con esto. Hemos creado algunas visualizaciones muy básicas solo para explicar el proceso.
17. Finalmente, crea un Panel y añade estas visualizaciones.
18. Guarda el Panel con el nombre “Ransomware Potencial.”
19. Para probar, enviemos otra alerta como si fuera de Veeam pero cambiemos algunos de los componentes del mensaje para que podamos ver si se ingiere correctamente.
20. Cambiemos el nombre de usuario a Gustev y la VM a MainFrameSuper.
echo '<14>1 2025-03-20T14:06:09.662307+02:00 VBRSRV01 Veeam_MP - - [origin enterpriseId="31023"] [categoryId=0 instanceId=41600 DetectionTimeUTC="03/20/2025 13:05:41" OibID="0e54d3bf-add8-48eb-9122-fad3ac1e8fb3" ActivityType="EncryptedData" UserName="NASA\Gustev\" ObjectName="MainFrameSuper" VbrHostName="vbrsrv01.tech.local" Description="Potential malware activity detected"]' | nc -u -q0 localhost 5514
- Como podemos ver, nuestro Panel nos alerta inmediatamente al recibir el mensaje syslog:
Conclusión
Cuando comenzaste esta serie, te enfrentaste a una pared de texto críptico de 347 caracteres:
<14>1 2025-03-20T14:06:09.662307+02:00 VBRSRV01 Veeam_MP - - [origin enterpriseId="31023"] [categoryId=0 instanceId=41600 DetectionTimeUTC="03/20/2025 13:05:41" OibID="0e54d3bf-add8-48eb-9122-fad3ac1e8fb3" ActivityType="EncryptedData" UserName="TECH\user1" ObjectName="VM01" VbrHostName="vbrsrv01.tech.local" Description="Potential malware activity detected"]
Ahora, ese mismo mensaje activa un sistema de monitoreo de seguridad inteligente que identifica inmediatamente:
- Tipo de Amenaza: Actividad potencial de ransomware
- Nivel de Prioridad: Impacto crítico en el negocio
- Usuario Afectado: TECH\user1 (identificado como humano, no cuenta de servicio)
- Activo Comprometido: Máquina virtual VM01
En este blog, proporcionamos a los lectores una imagen más clara de lo que necesita suceder a un mensaje syslog en bruto antes de que pueda ser útil en un SIEM—específicamente dentro de la pila ELK. Desde el análisis hasta el enriquecimiento, desglosamos los pasos esenciales que convierten registros ruidosos en información procesable.
En la siguiente y última parte de nuestra mini serie de blogs sobre SIEM Elasticsearch, revisaremos brevemente el aprovechamiento de Fluentd en lugar de Logstash y tocaremos Elastic Security.