1. Introducción
En esta práctica vamos a construir una detección completa en Wazuh usando File Integrity Monitoring (FIM), una lista CDB y Active Response.
El objetivo es muy didáctico: monitorizar un directorio en un endpoint Linux, detectar el archivo de prueba EICAR por su hash SHA256 y, cuando la detección sea positiva, eliminar el archivo automáticamente desde el propio agente.
2. Arquitectura y flujo de la práctica
[Agente Ubuntu] ↓ FIM monitoriza /tmp/cdb-demo ↓ Se crea eicar.com.txt ↓ El agente calcula hashes y envía el evento ↓ [Wazuh Manager] ↓ La regla 100300 compara el SHA256 con la lista CDB ↓ Coincidencia positiva ↓ Alerta 100300 ↓ Active Response ejecuta remove-threat.sh en el agente ↓ El archivo se elimina automáticamente
3. Conceptos clave
3.1 File Integrity Monitoring (FIM)
FIM es el módulo de Wazuh que monitoriza cambios en archivos y directorios. Puede detectar creación, modificación y borrado de archivos, además de calcular hashes como MD5, SHA1 y SHA256.
3.2 Listas CDB
Una lista CDB es una base de datos de búsqueda rápida que Wazuh usa para comprobar si un valor existe o no en una lista. El formato es muy simple: clave:valor. En esta práctica, la clave será el hash SHA256 de EICAR y el valor será una etiqueta descriptiva.
3.3 Active Response
Active Response permite que Wazuh ejecute una acción automática cuando se cumple una regla. En este caso, cuando se dispare la regla 100300, se ejecutará un script personalizado en el agente para borrar el fichero.
3.4 Por qué usamos SHA256
En esta demo usamos SHA256 para alinear la detección con una práctica más robusta al trabajar con hashes en listas CDB. Además, Wazuh puede comparar directamente el campo sha256 de los eventos FIM con la lista.
4. Requisitos
- Un Wazuh Manager operativo.
- Un agente Linux registrado en el manager.
- Acceso administrativo en ambos sistemas.
- Conectividad desde el agente para descargar EICAR, o alternativa con
printf. - Paquete
jqinstalado en el agente para el script de Active Response.
5. Preparar el directorio de laboratorio en el agente
Vamos a usar un directorio simple y limpio para que la práctica sea fácil de seguir y depurar.
mkdir -p /tmp/cdb-demo ls -ld /tmp/cdb-demo
6. Configurar FIM en el agente
Edita el archivo /var/ossec/etc/ossec.conf del agente y añade o ajusta el bloque syscheck para monitorizar /tmp/cdb-demo en tiempo real.
nano /var/ossec/etc/ossec.conf
<syscheck> <disabled>no</disabled> <directories check_all="yes" realtime="yes">/tmp/cdb-demo</directories> </syscheck>
check_all="yes" hace que Wazuh calcule atributos y hashes del archivo. realtime="yes" permite detectar el cambio en cuanto se crea o modifica el fichero.
systemctl restart wazuh-agent
7. Crear la lista CDB en el manager
Las listas CDB se crean y se cargan en el manager, no en el agente. En esta práctica almacenaremos el SHA256 de EICAR.
mkdir -p /var/ossec/etc/lists cat > /var/ossec/etc/lists/malware-hashes << 'EOF' 275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f:eicar EOF chown wazuh:wazuh /var/ossec/etc/lists/malware-hashes chmod 660 /var/ossec/etc/lists/malware-hashes
275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f es el SHA256 correcto del fichero EICAR sin salto de línea adicional.8. Declarar la lista en el manager
Ahora hay que decirle a Wazuh que cargue la lista dentro del bloque ruleset de /var/ossec/etc/ossec.conf.
nano /var/ossec/etc/ossec.conf
<list>etc/lists/malware-hashes</list>
9. Crear la regla 100300 en local_rules.xml
Para esta práctica usaremos local_rules.xml porque es la opción más simple y clara para laboratorio. La regla se apoyará en los eventos FIM 550 y 554, y comparará el campo sha256 con la lista CDB.
nano /var/ossec/etc/rules/local_rules.xml
<group name="syscheck,malware,cdb,">
<rule id="100300" level="12">
<if_sid>554,550</if_sid>
<list field="sha256" lookup="match_key">etc/lists/malware-hashes</list>
<description>CDB - Hash malicioso detectado: $(file)</description>
</rule>
</group>
10. Reiniciar y validar la carga
Después de crear o modificar una lista CDB, es obligatorio reiniciar el manager para que Wazuh la compile y la cargue. Luego conviene verificar que exista el archivo .cdb.
systemctl restart wazuh-manager ls -l /var/ossec/etc/lists/malware-hashes*
Deberías ver dos archivos:
/var/ossec/etc/lists/malware-hashes/var/ossec/etc/lists/malware-hashes.cdb
.cdb existe, la lista se ha compilado correctamente.11. Descargar EICAR y probar la detección
Ahora generaremos el evento real en el agente creando el archivo de prueba EICAR dentro del directorio monitorizado.
wget https://secure.eicar.org/eicar.com.txt -O /tmp/cdb-demo/eicar.com.txt sha256sum /tmp/cdb-demo/eicar.com.txt
El resultado esperado del hash es:
275a021bbfb648564fd2b7f4b43406a1611acd2524bb265fc95c65dbf20c1f55 /tmp/cdb-demo/eicar.com.txt
12. Añadir Active Response en el manager
Como en este laboratorio no estaba disponible el ejecutable nativo remove-threat, vamos a usar un script personalizado llamado remove-threat.sh.
En el manager, dentro de /var/ossec/etc/ossec.conf y siempre dentro de <ossec_config>, añade estos bloques:
<command> <name>remove-threat</name> <executable>remove-threat.sh</executable> <timeout_allowed>no</timeout_allowed> </command> <active-response> <disabled>no</disabled> <command>remove-threat</command> <location>local</location> <rules_id>100300</rules_id> </active-response>
</ossec_config>.13. Crear el script remove-threat.sh en el agente
Este script leerá el JSON que envía Wazuh, extraerá la ruta del archivo desde parameters.alert.syscheck.path y lo eliminará.
apt update apt -y install jq
cat > /var/ossec/active-response/bin/remove-threat.sh << 'EOF'
#!/bin/bash
LOCAL=$(dirname "$0")
cd "$LOCAL/.." || exit 1
PWD=$(pwd)
read INPUT_JSON
COMMAND=$(echo "$INPUT_JSON" | jq -r .command)
FILENAME=$(echo "$INPUT_JSON" | jq -r .parameters.alert.syscheck.path)
LOG_FILE="${PWD}/../logs/active-responses.log"
if [ "$COMMAND" = "add" ]; then
printf '{"version":1,"origin":{"name":"remove-threat","module":"active-response"},"command":"check_keys","parameters":{"keys":[]}}\n'
read RESPONSE
COMMAND2=$(echo "$RESPONSE" | jq -r .command)
if [ "$COMMAND2" != "continue" ]; then
echo "$(date '+%Y/%m/%d %H:%M:%S') $0: $INPUT_JSON Active response abortada" >> "${LOG_FILE}"
exit 0
fi
fi
rm -f "$FILENAME"
if [ $? -eq 0 ]; then
echo "$(date '+%Y/%m/%d %H:%M:%S') $0: $INPUT_JSON Archivo eliminado correctamente" >> "${LOG_FILE}"
else
echo "$(date '+%Y/%m/%d %H:%M:%S') $0: $INPUT_JSON Error eliminando archivo" >> "${LOG_FILE}"
fi
exit 0
EOF
chmod 750 /var/ossec/active-response/bin/remove-threat.sh
chown root:wazuh /var/ossec/active-response/bin/remove-threat.sh
14. Probar la eliminación automática
Una vez añadida la configuración y creado el script, reinicia manager y agente.
# En el manager systemctl restart wazuh-manager # En el agente systemctl restart wazuh-agent
Ahora repite la descarga del fichero EICAR:
rm -f /tmp/cdb-demo/eicar.com.txt wget https://secure.eicar.org/eicar.com.txt -O /tmp/cdb-demo/eicar.com.txt
Si todo está bien, el archivo se creará y se eliminará automáticamente casi al instante.
15. Visualización en tiempo real
Esta parte queda muy bien tanto para validación como para grabación del vídeo. Usa varias terminales para verlo todo a la vez.
watch -n 1 ls -l /tmp/cdb-demo
tail -f /var/ossec/logs/active-responses.log
wget https://secure.eicar.org/eicar.com.txt -O /tmp/cdb-demo/eicar.com.txt
watch conviene ejecutarlo en una terminal separada, dejándolo abierto mientras haces la descarga en otra sesión.16. Qué deberías ver al final
| Componente | Resultado esperado |
|---|---|
| Manager | Alerta 100300 con el texto CDB - Hash malicioso detectado. |
| Dashboard | Evento de Active Response indicando que se ejecutó remove-threat.sh. |
| Agente | El archivo aparece y desaparece del directorio /tmp/cdb-demo. |
| active-responses.log | Registro con el JSON de la acción y el mensaje de eliminación correcta. |
17. Errores comunes y cómo resolverlos
| Problema | Causa habitual | Solución |
|---|---|---|
| No salta la 100300 | El hash del archivo no coincide con el de la lista | Validar con sha256sum que sea 275a021bbfb648564fd2b7f4b43406a1611acd2524bb265fc95c65dbf20c1f55. |
| No se genera el .cdb | La lista no se cargó o no se reinició el manager | Revisar permisos, reiniciar wazuh-manager y comprobar el archivo compilado. |
| No hay eventos FIM | El directorio no está monitorizado o no se reinició el agente | Comprobar syscheck y reiniciar wazuh-agent. |
| No se borra el fichero | El script no existe o tiene permisos incorrectos | Verificar que /var/ossec/active-response/bin/remove-threat.sh tenga 750 y propietario root:wazuh. |
| XML inválido en ossec.conf | Bloques command o active-response fuera de ossec_config |
Asegurarse de añadirlos antes de </ossec_config>. |