1. Introduccion
Esta guia integra un Sophos Firewall (SFOS), series XG/XGS, con Wazuh SIEM mediante syslog. El firewall envia sus logs de red al Wazuh Manager, que los decodifica con un decoder personalizado, los evalua contra un conjunto de reglas propio, y genera alertas visibles en el Wazuh Dashboard.
2. Variables de esta guia
Todos los bloques de configuracion usan los siguientes marcadores en MAYUSCULAS. Sustituyelos por los valores reales de la red donde se aplique esta guia.
| Marcador | Que es | Donde se obtiene |
|---|---|---|
IP_WAZUH_MANAGER | IP del servidor donde corre el Wazuh Manager | La interfaz de red de ese servidor |
IP_SOPHOS_ORIGEN | IP desde la que el Sophos envia los logs al Wazuh Manager | La interfaz del firewall en esa red |
ZONA_ORIGEN | Zona de Sophos donde reside el Wazuh Manager (normalmente LAN) | Network > Zones en Sophos |
NOMBRE_DISPOSITIVO | Hostname configurado en el Sophos (campo device_name del log) | Se ve en cualquier log capturado; es configurable y no afecta al funcionamiento del decoder |
IP_DESTINO_PRUEBA | Direccion reservada para documentacion (TEST-NET-3), nunca es una IP real | Fija: 203.0.113.99 |
3. Arquitectura y flujo
[SOPHOS FIREWALL - SFOS]
Syslog server: IP_WAZUH_MANAGER : 514 (UDP)
Formato: Device standard format (legacy)
|
v syslog UDP/TCP 514
[WAZUH MANAGER] IP_WAZUH_MANAGER
Decoder + reglas personalizadas
|
v
[WAZUH INDEXER] (OpenSearch, almacena las alertas)
|
v
[WAZUH DASHBOARD]
Discover / Threat hunting
El firewall envia los logs por syslog directamente al Wazuh Manager, sin pasar por un agente. Por eso, en el Dashboard, estos eventos aparecen asociados al propio manager (agent.id: "000") y no a un agente independiente con nombre "Sophos".
4. Requisitos
- Sophos Firewall (SFOS), series XG/XGS, version 19, 20 o 21.
- Wazuh Manager 4.14.x instalado y en ejecucion.
- Conectividad de red entre el Sophos y el Wazuh Manager.
- Puerto 514/udp abierto en el sistema operativo del Wazuh Manager.
- Acceso administrador tanto al panel de Sophos como al servidor Wazuh (
sudo/root).
5. Configurar el servidor de syslog en Sophos
Menu: System services > Log settings, boton Add.
| Campo | Valor |
|---|---|
| Nombre | SIEM (o cualquier nombre descriptivo) |
| Direccion IP / Dominio | IP_WAZUH_MANAGER |
| Transmision de registro segura | Desactivada, salvo que se configure TLS aparte |
| Puerto | 514 |
| Recurso | DAEMON |
| Nivel de Gravedad | Depuracion mientras se verifica el montaje; puede subirse despues |
| Formato | Device standard format (legacy) |
clave="valor" (por ejemplo device_name="..."). Si se selecciona Standard syslog protocol en su lugar, la estructura del mensaje es distinta y el decoder no encuentra los campos.6. Seleccionar los registros que se envian
En la misma pagina de Log settings, columna SIEM, se decide que categorias de log se envian al servidor de syslog recien creado. No todas las categorias aportan valor de forma continua; muchas generan ruido de fondo sin relacion con el trafico que interesa monitorizar.
| Categoria (dentro de "Firewall") | Recomendacion |
|---|---|
| Reglas de firewall | Activar — es la categoria imprescindible, cubre trafico permitido y denegado por las reglas |
| Trafico no valido | Activar (opcional) — util para detectar trafico malformado o fuera de estado |
| ACL locales | Desactivar — suele generar avisos constantes de trafico de difusion (broadcast) de la propia red hacia la interfaz del firewall, sin valor de seguridad práctico |
| Ataque DoS, paquetes ICMP/origen/fragmentados descartados, filtrado MAC, par IP-MAC, anti-suplantacion, tunel VPN SSL, servidor de aplicaciones protegidas, mensaje de error ICMP, ACL puente | Desactivar salvo que se este monitorizando ese caso especifico — generan volumen sin aportar señal relevante en un montaje basico |
| Heartbeat | Desactivar — genera eventos periodicos constantes de estado de salud, no relacionados con trafico de red |
| IPS (Anomalia, Firmas) | Activar (opcional) — señal de seguridad real, no ruido |
7. Activar el registro de trafico por regla
Menu: Rules and policies > Firewall rules.
Ademas de seleccionar las categorias de log en el paso anterior, cada regla de firewall necesita tener activada individualmente la opcion "Log firewall traffic" (Registrar trafico de firewall). Sin este paso, el trafico que coincide con esa regla no se registra en ningun sitio, aunque las categorias esten bien configuradas.
8. Configurar el Wazuh Manager para recibir syslog
sudo nano /var/ossec/etc/ossec.conf
Añadir este bloque dentro de <ossec_config>:
<remote> <connection>syslog</connection> <port>514</port> <protocol>udp</protocol> <allowed-ips>IP_SOPHOS_ORIGEN</allowed-ips> <local_ip>IP_WAZUH_MANAGER</local_ip> </remote>
sudo systemctl restart wazuh-manager
agent.id: "000"), no a un agente independiente. Al filtrar en el Dashboard por nombre de agente no va a aparecer un agente "Sophos"; hay que filtrar por agent.id: "000" o por el grupo de la regla.9. Crear el decoder personalizado
sudo nano /var/ossec/etc/decoders/sophos_decoder.xml
<decoder name="sophos_firewall">
<prematch>device_name="</prematch>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>device_name="(\.*)"</regex>
<order>device_name</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>timestamp="(\.*)"</regex>
<order>timestamp</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>device_model="(\.*)"</regex>
<order>device_model</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>device_serial_id="(\.*)"</regex>
<order>device_serial_id</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>log_type="(\.*)"</regex>
<order>log_type</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>log_component="(\.*)"</regex>
<order>log_component</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>log_subtype="(\.*)"</regex>
<order>log_subtype</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>severity="(\.*)"</regex>
<order>severity</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>fw_rule_id="(\.*)"</regex>
<order>fw_rule_id</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>fw_rule_name="(\.*)"</regex>
<order>fw_rule_name</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>fw_rule_type="(\.*)"</regex>
<order>fw_rule_type</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>in_interface="(\.*)"</regex>
<order>in_interface</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>src_mac="(\.*)"</regex>
<order>src_mac</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>src_ip="(\.*)"</regex>
<order>src_ip</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>src_country="(\.*)"</regex>
<order>src_country</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>dst_ip="(\.*)"</regex>
<order>dst_ip</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>dst_country="(\.*)"</regex>
<order>dst_country</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>protocol="(\.*)"</regex>
<order>protocol</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>src_port=(\.*) </regex>
<order>src_port</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>dst_port=(\.*) </regex>
<order>dst_port</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>app_resolved_by="(\.*)"</regex>
<order>app_resolved_by</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>app_name="(\.*)"</regex>
<order>app_name</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>app_risk=(\.*) </regex>
<order>app_risk</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>app_category="(\.*)"</regex>
<order>app_category</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>duration=(\.*) </regex>
<order>duration</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>bytes_sent=(\.*) </regex>
<order>bytes_sent</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>bytes_received=(\.*) </regex>
<order>bytes_received</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>user_name="(\.*)"</regex>
<order>user_name</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>src_zone_type="(\.*)"</regex>
<order>src_zone_type</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>src_zone="(\.*)"</regex>
<order>src_zone</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>dst_zone_type="(\.*)"</regex>
<order>dst_zone_type</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>dst_zone="(\.*)"</regex>
<order>dst_zone</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>url="(\.*)"</regex>
<order>url</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>domain="(\.*)"</regex>
<order>domain</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>http_category="(\.*)"</regex>
<order>http_category</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>http_status="(\.*)"</regex>
<order>http_status</order>
</decoder>
<decoder name="sophos_firewall_child">
<parent>sophos_firewall</parent>
<regex>message="(\.*)"</regex>
<order>message</order>
</decoder>
sudo chown wazuh:wazuh /var/ossec/etc/decoders/sophos_decoder.xml sudo chmod 660 /var/ossec/etc/decoders/sophos_decoder.xml
\. significa "cualquier caracter" y un punto sin barra significa "punto literal" — es lo opuesto a la convencion de un regex estandar (PCRE). Por eso (\.*) captura cualquier valor hasta el siguiente caracter fijo del patron (la comilla de cierre).prematch un valor que en realidad es el hostname configurado en un ejemplo concreto (por ejemplo, si un log de referencia trae device_name="SFW", tomar literalmente SFW como prematch). Ese valor es el nombre que alguien le puso a su propio firewall, no un identificador fijo de Sophos, asi que en cualquier otro firewall con otro hostname el decoder nunca coincidiria. El prematch correcto es un fragmento de la estructura del log que siempre esta presente, como device_name=", independientemente de como se llame el dispositivo.10. Crear las reglas personalizadas
sudo nano /var/ossec/etc/rules/sophos_rules.xml
<group name="sophos,">
<!-- Regla base: todo evento decodificado como Sophos -->
<rule id="100500" level="0">
<decoded_as>sophos_firewall</decoded_as>
<description>Sophos Firewall event</description>
<group>firewall,</group>
</rule>
<!-- Conexiones permitidas -->
<rule id="100501" level="3">
<if_sid>100500</if_sid>
<field name="log_subtype">Allowed</field>
<description>Sophos Firewall - $(log_component): conexion permitida ($(src_ip) -> $(dst_ip))</description>
<group>firewall,allowed,</group>
</rule>
<!-- Conexiones denegadas -->
<rule id="100502" level="5">
<if_sid>100500</if_sid>
<field name="log_subtype">Denied</field>
<description>Sophos Firewall - $(log_component): conexion denegada ($(src_ip) -> $(dst_ip))</description>
<group>firewall,denied,</group>
</rule>
<!-- Multiples denegaciones desde el mismo origen: posible escaneo/ataque -->
<rule id="100503" level="8" frequency="10" timeframe="300">
<if_matched_sid>100502</if_matched_sid>
<same_source_ip />
<description>Sophos Firewall - Multiples conexiones denegadas ($(firedtimes)) desde $(src_ip) en 5 minutos</description>
<group>firewall,denied,multiple_attempts,</group>
</rule>
<!-- Severidad critica reportada por el propio Sophos -->
<rule id="100504" level="10">
<if_sid>100500</if_sid>
<field name="severity">Critical</field>
<description>Sophos Firewall - CRITICO: evento de $(log_component)</description>
<group>firewall,critical,</group>
</rule>
<!-- Contenido web bloqueado -->
<rule id="100505" level="5">
<if_sid>100500</if_sid>
<field name="log_component">HTTP</field>
<field name="log_subtype">Denied</field>
<description>Sophos Firewall - Filtrado web: $(url) bloqueado</description>
<group>firewall,content_filtering,denied,</group>
</rule>
<!-- Protocolos de alto riesgo (RDP, SMB, Telnet...) -->
<rule id="100506" level="6">
<if_sid>100500</if_sid>
<field name="dst_port">23|135|139|445|1433|3389</field>
<description>Sophos Firewall - Conexion a protocolo de alto riesgo hacia $(dst_ip):$(dst_port)</description>
<group>firewall,high_risk_protocol,</group>
</rule>
<!-- Ruido de broadcast LAN hacia la propia interfaz del firewall: no accionable -->
<rule id="100507" level="2">
<if_sid>100502</if_sid>
<field name="log_component">Appliance Access</field>
<field name="dst_ip">255.255.255.255|224.0.0.1|0.0.0.0</field>
<description>Sophos Firewall - Ruido de broadcast LAN descartado (no accionable)</description>
<group>firewall,noise,</group>
</rule>
</group>
sudo chown wazuh:wazuh /var/ossec/etc/rules/sophos_rules.xml sudo chmod 660 /var/ossec/etc/rules/sophos_rules.xml sudo systemctl restart wazuh-manager
Esta base cubre conexiones permitidas y denegadas, deteccion de multiples intentos desde un mismo origen, eventos de severidad critica, filtrado web y protocolos de alto riesgo. La regla 100507 es la que silencia el ruido de difusion (broadcast) mencionado en el paso 6: no elimina el evento, solo le baja el nivel para que no aparezca como alerta.
11. Verificar la decodificacion con wazuh-logtest
Antes de comprobar el resultado en el Dashboard, conviene validar que el decoder y las reglas funcionan sobre una linea de log real.
Capturar una linea limpia
Es preferible evitar tcpdump para esto: la opcion -A mezcla bytes binarios de las cabeceras IP/UDP con el mensaje real, lo que ensucia cualquier copia. Es mas fiable activar temporalmente el archivo de eventos completo del manager:
sudo nano /var/ossec/etc/ossec.conf
<global> <logall>yes</logall> <logall_json>yes</logall_json> </global>
sudo systemctl restart wazuh-manager sudo tail -f /var/ossec/logs/archives/archives.log
La linea que aparece aqui, generada por trafico real del firewall, es la que hay que copiar — sin basura binaria, exactamente como la procesa el motor de analisis. Conviene desactivar logall/logall_json una vez terminada la verificacion, ya que generan bastante volumen de disco si se dejan activos.
Probar con wazuh-logtest
sudo /var/ossec/bin/wazuh-logtest
Al pegar una linea como la siguiente:
<30>device_name="NOMBRE_DISPOSITIVO" timestamp="2026-07-11T07:45:40+0200" device_model="SFVH" device_serial_id="V01001JVVBRGP65" log_id="010302602002" log_type="Firewall" log_component="Appliance Access" log_subtype="Denied" log_version=1 severity="Information" fw_rule_id="N/A" nat_rule_id="0" fw_rule_type="NETWORK" ether_type="IPv4 (0x0800)" in_interface="Port2" src_mac="24:0a:c4:40:5f:b8" src_ip="192.168.1.211" src_country="R1" dst_ip="255.255.255.255" dst_country="R1" protocol="UDP" src_port=55555 dst_port=55555 hb_status="No Heartbeat" app_resolved_by="Signature" app_is_cloud="FALSE" qualifier="New" in_display_interface="Port2" log_occurrence="1"
La salida deberia mostrar la decodificacion completa y la regla disparada:
**Phase 2: Completed decoding.
name: 'sophos_firewall'
device_name: 'NOMBRE_DISPOSITIVO'
log_component: 'Appliance Access'
log_subtype: 'Denied'
src_ip: '192.168.1.211'
dst_ip: '255.255.255.255'
...
**Phase 3: Completed filtering (rules).
id: '100502'
level: '5'
description: 'Sophos Firewall - Appliance Access: conexion denegada (192.168.1.211 -> 255.255.255.255)'
groups: '[\'sophos\', \'firewall\', \'denied\']'
name: 'sophos_firewall', el decoder no esta coincidiendo (revisar el formato elegido en Sophos y el prematch del decoder). Si la Fase 2 funciona pero la Fase 3 no dispara ninguna regla, comparar los valores de field de las reglas contra lo que realmente llego — mayusculas y minusculas importan.12. Consultar las alertas en el Wazuh Dashboard
- Ir a Explore > Discover (o Threat hunting, segun la version del Dashboard) y filtrar por
rule.groups: firewall. - Como el log llega directo por syslog, sin agente, los eventos aparecen asociados al propio manager. Si no aparece nada al buscar por nombre de agente, filtrar por
agent.id: "000".
13. Generar trafico de prueba controlado
Para comprobar que una alerta concreta llega de extremo a extremo, sin depender de que se produzca trafico real bloqueado en ese momento, es util crear una regla de firewall dedicada exclusivamente a pruebas, apuntando a una direccion reservada para documentacion que nunca es una IP real (203.0.113.99, rango TEST-NET-3). El bloqueo resultante es inofensivo y 100% reproducible.
Menu: Rules and policies > Firewall rules > Add firewall rule > New firewall rule.
| Campo | Valor |
|---|---|
| Nombre de regla | Demo-Block-Test |
| Accion | Rechazar (el cliente recibe respuesta inmediata; "Descartar" tambien es valido pero es silencioso) |
| Registrar trafico de firewall | Activar |
| Posicion de regla | Arriba, para que se evalue antes que la regla general de salida a Internet |
| Zonas de origen | ZONA_ORIGEN (la zona donde esta el Wazuh Manager) |
| Dispositivos y redes de origen | Cualquiera |
| Zonas de destino | WAN |
| Redes de destino | IP_DESTINO_PRUEBA (203.0.113.99) |
| Servicios | Cualquiera |
Desde cualquier host situado en la zona de origen configurada, se puede disparar la regla con:
curl -m 3 http://IP_DESTINO_PRUEBA # o bien ping -c 3 IP_DESTINO_PRUEBA
14. Reducir el ruido en el Dashboard
Las palancas que si funcionan:
- En Sophos, limitar que categorias de log se envian al SIEM (ver la tabla del paso 6): mantener solo Reglas de firewall y, opcionalmente, Trafico no valido e IPS; desactivar el resto.
- En Wazuh, usar una regla de silenciado como la
100507del paso 10, que reduce el nivel de eventos de ruido conocido sin borrar el evento — sigue disponible para analisis forense, pero deja de generar alertas visibles en el Dashboard.
Combinando ambos ajustes, el Dashboard queda con las conexiones denegadas reales y las alertas generadas de forma deliberada, sin el ruido de fondo de trafico de difusion o eventos periodicos de estado.
15. Errores comunes y como resolverlos
| Problema | Causa probable | Solucion |
|---|---|---|
| No llega nada al Wazuh Manager | Puerto 514 cerrado en el sistema operativo del manager, o redes sin ruta entre ambos equipos | ss -tulnp | grep 514; revisar el firewall del propio sistema operativo y la conectividad de red |
| Llega trafico pero wazuh-logtest no decodifica | Formato incorrecto en Sophos, o prematch del decoder atado a un valor variable como el hostname |
Usar Device standard format (legacy) en Sophos; usar <prematch>device_name="</prematch>, nunca un valor fijo como un nombre de dispositivo concreto |
| Decodifica pero no dispara ninguna regla | Los <field> de las reglas no coinciden exactamente con el valor recibido |
Comparar el resultado de wazuh-logtest campo a campo con el XML de las reglas; revisar mayusculas y minusculas |
| Solo se ven eventos de sistema, no trafico normal | Falta activar "Log firewall traffic" en las reglas de Sophos | Activarlo por regla en Rules and policies |
| No aparece nada al filtrar por agente en el Dashboard | El trafico llega directo por syslog, no proviene de un agente instalado | Filtrar por agent.id: "000" o por rule.groups: firewall |
| Demasiado ruido en el Dashboard | Demasiadas categorias de log activas en la columna SIEM de Sophos | Desactivar categorias irrelevantes (ver paso 6) y añadir la regla de silenciado 100507 en Wazuh |
| Aviso de "Rule ID duplicado" en wazuh-logtest | Choque de identificadores entre distintos archivos de reglas personalizadas instalados en el mismo manager | grep -rn "<ID>" /var/ossec/etc/rules/ y renombrar el identificador repetido |
16. Notas de ampliacion
El conjunto de reglas de esta guia cubre los casos basicos de un primer montaje. Para un entorno mas completo se puede ampliar con:
- Reglas de geolocalizacion, usando los campos
src_country/dst_countrypara marcar conexiones hacia paises de riesgo. - Deteccion de aplicaciones de alto riesgo, usando los campos
app_name,app_riskyapp_category. - Alertas por transferencias de datos inusualmente grandes, usando
bytes_sentybytes_received. - Alertas por conexiones de duracion inusualmente larga, usando el campo
duration. - Reglas especificas para actividad de usuarios administradores, usando el campo
user_name.
100508) para evitar coincidencias con otros conjuntos de reglas personalizadas que puedan existir en el mismo manager.