Background
Wazuh Decoders Regex SIEM Logs Tutorial

Cómo Crear Decoders Personalizados en Wazuh: Guía Práctica con Regex

Aprende a crear decoders personalizados en Wazuh paso a paso. Entiende las expresiones regulares (regex) y extrae campos de cualquier log para crear reglas y alertas.

AI Security
15 min lectura
Background

Introducción

Uno de los superpoderes de Wazuh es su capacidad de procesar cualquier tipo de log. Pero para aprovechar esta potencia, necesitas saber crear decoders personalizados. En esta guía vamos a ver cómo hacerlo paso a paso, usando un ejemplo real de logs de un NAS.

Lo más importante: no intentes crear el decoder completo de una vez. Hazlo poco a poco, probando cada cambio con la herramienta de test.

Video: Crear Decoders Personalizados en Wazuh

¿Qué es un Decoder y por qué lo necesitas?

Un decoder es un "traductor" que lee un log en texto plano y extrae los campos importantes en variables estructuradas. Sin un decoder, Wazuh solo ve texto sin significado.

Sin decoder:

NAS: Users: marialopez, Source IP: 192.168.1.100, Computer name: MariaPC...

→ Wazuh ve solo texto, no puede crear reglas específicas

Con decoder:

srcuser: marialopez
srcip: 192.168.1.100
computer_name: MariaPC
action: Write
resource: Certificados/CertificadoDigital.pfx

→ Ahora puedes crear reglas: "Si action=Write AND resource contiene Certificado → Alerta nivel 10"

El ejemplo: Log de acceso a NAS

Vamos a trabajar con este log real de un NAS (Network Attached Storage):

NAS: Users: marialopez, Source IP: 192.168.1.100, Computer name: MariaPC, Connection type: SMB, Accessed resources: shared/Certificados/CertificadoDigital.pfx, Action: Write

Los campos que queremos extraer son:

  • Usuario: marialopez
  • IP origen: 192.168.1.100
  • Nombre equipo: MariaPC
  • Tipo conexión: SMB
  • Recurso: shared/Certificados/CertificadoDigital.pfx
  • Acción: Write

Paso 1: Empezar simple (solo el usuario)

Regla de oro: nunca intentes capturar todo de una vez. Empieza con un solo campo y ve añadiendo.

<decoder name="nas-access">
  <prematch>^NAS: </prematch>
  <regex>^NAS: Users: (\S+)</regex>
  <order>srcuser</order>
</decoder>

Explicación de cada parte:

Elemento Significado
name="nas-access" Nombre único para identificar el decoder
<prematch> Filtro rápido: solo procesa logs que empiecen por "NAS: "
^ Ancla al inicio de la línea
(\S+) Captura uno o más caracteres que NO sean espacios
<order> Asigna la captura a la variable "srcuser"

Probar con el Decoder Test

En Wazuh Dashboard, ve a Tools → Ruleset Test (o usa /var/ossec/bin/wazuh-logtest por terminal) y pega el log. Si funciona, verás:

**Phase 2: Decoding
   name: 'nas-access'
   srcuser: 'marialopez'

✓ ¡Funciona! El usuario se ha extraído correctamente.

Paso 2: Añadir la IP de origen

Ahora expandimos la regex para capturar también la IP:

<decoder name="nas-access">
  <prematch>^NAS: </prematch>
  <regex type="pcre2">^NAS: Users: (\S+), Source IP: (\d+\.\d+\.\d+\.\d+)</regex>
  <order>srcuser,srcip</order>
</decoder>

Novedades:

Elemento Significado
type="pcre2" Usa regex PCRE2 (más potente y estándar)
\d+ Uno o más dígitos (0-9)
\. Un punto literal (escapado con \)
\d+\.\d+\.\d+\.\d+ Patrón completo de una IP (ej: 192.168.1.100)

Paso 3: El decoder completo

Siguiendo el mismo proceso, añadimos el resto de campos:

<decoder name="nas-access">
  <prematch>^NAS: </prematch>
  <regex type="pcre2">^NAS: Users: (\S+), Source IP: (\d+\.\d+\.\d+\.\d+), Computer name: (\S+), Connection type: (\S+), Accessed resources: (.+), Action: (\w+)$</regex>
  <order>srcuser,srcip,computer_name,conn_type,resource,action</order>
</decoder>

Guía Rápida de Regex para Wazuh

Estas son las expresiones regulares más útiles para crear decoders:

Regex Significado Ejemplo
\S+ Uno o más caracteres NO espacios marialopez, admin123
\d+ Uno o más dígitos 192, 443, 2024
\w+ Uno o más caracteres alfanuméricos (letras, números, _) Write, Read, user_name
.+ Uno o más de CUALQUIER carácter shared/Docs/file.pdf
.* Cero o más de cualquier carácter (puede estar vacío)
^ Inicio de línea ^NAS: (empieza por NAS:)
$ Fin de línea Write$ (termina en Write)
\. Punto literal (escapado) 192\.168 (IP literal)
( ) Grupo de captura → se asigna a variable Users: (\S+) → srcuser

¿Por qué usar PCRE2?

Wazuh soporta dos tipos de regex:

  • Regex nativa de Wazuh: Más simple pero limitada
  • PCRE2 (type="pcre2"): Estándar de la industria, más potente

Recomendación: usa siempre type="pcre2" para decoders complejos. La sintaxis es la misma que usarías en Python, JavaScript o cualquier otro lenguaje.

¿Para qué sirve extraer estos campos?

Una vez que el decoder extrae los campos, puedes crear reglas específicas:

<!-- Alerta: Alguien modifica un certificado -->
<rule id="100001" level="12">
  <decoded_as>nas-access</decoded_as>
  <field name="action">Write</field>
  <field name="resource">Certificado</field>
  <description>Modificación de certificado en NAS por $(srcuser) desde $(srcip)</description>
</rule>

<!-- Alerta: Acceso desde IP externa -->
<rule id="100002" level="10">
  <decoded_as>nas-access</decoded_as>
  <field name="srcip">^(?!192\.168\.)</field>
  <description>Acceso a NAS desde IP externa: $(srcip)</description>
</rule>

<!-- Alerta: Usuario desconocido -->
<rule id="100003" level="8">
  <decoded_as>nas-access</decoded_as>
  <field name="srcuser">^(?!admin|marialopez|juangarcia)</field>
  <description>Acceso a NAS con usuario no autorizado: $(srcuser)</description>
</rule>

Sin el decoder, nada de esto sería posible. Solo tendrías el texto plano sin poder filtrar por usuario, IP o acción.

Metodología: Construir decoders poco a poco

1 Empieza con <prematch> para filtrar logs
2 Captura un solo campo con la regex
3 Prueba con Ruleset Test o wazuh-logtest
4 Si funciona, añade el siguiente campo
5 Repite hasta completar el decoder

No saltes pasos. Si intentas escribir la regex completa de una vez, cuando falle no sabrás qué parte está mal.

Dónde guardar el decoder

Los decoders personalizados se guardan en:

/var/ossec/etc/decoders/local_decoder.xml

Después de modificar el archivo, reinicia el manager:

systemctl restart wazuh-manager

Resumen

  • Decoder = traductor de logs a campos estructurados
  • Sin decoder, no puedes crear reglas específicas
  • Usa type="pcre2" para regex estándar
  • Construye poco a poco y prueba cada paso
  • Regex esenciales: \S+ (no espacios), \d+ (dígitos), .+ (todo), ( ) (captura)

Próximos pasos

Una vez que domines los decoders, el siguiente paso es crear reglas personalizadas que usen los campos extraídos para generar alertas. En el Curso de Wazuh cubrimos todo el flujo completo: decoders → reglas → alertas → notificaciones.

¿Quieres aprender a crear reglas y configurar alertas por Discord/Email?

Ver Curso de Wazuh
Background