
Pipeline de seguridad de código abierto y autoalojado para IT, IA y OT. Entra con registro. Sale evidencia.: Normalización OCSF, 46 reglas de detección (etiquetadas con MITRE/ATLAS/ICS), correlación, paquetes de evidencia, borradores NIS2, consola React reconstruida + demo en GitHub Pages. Apache-2.0.
Inicia sesión. Obtén evidencia.
Pipeline de seguridad de código abierto para IT, IA y OT: de los logs en bruto a un incidente verificado y un borrador de notificación NIS2.
Página del proyecto y demo en vivo · Inicio rápido · Consola · Arquitectura · Estado (SSOT)
Las insignias reflejan la última ejecución real en
main, no una promesa. Los hallazgos restantes de Scorecard son concesiones aceptadas y documentadas, no carencias; véase SSOT.md §1.
FENGARDE conecta la telemetría de seguridad de IT, IA y OT para mostrar qué ocurrió, quién o qué actuó, qué se vio afectado, cómo se relacionan los eventos y qué evidencia respalda la conclusión.
Diseñado para la mediana empresa industrial europea: código abierto, autoalojado, Apache-2.0, con una ruta de borrador de notificación de incidentes NIS2, un generador de informes determinista en alemán/inglés, RBAC/MFA/registro de auditoría/multitenencia opcionales para despliegues tipo MSP, un perfil de alta disponibilidad opcional (probado con kill en vivo, no solo cableado), y triaje con IA que nunca sale de tu red.
Los logs se recopilan, se normalizan a un único esquema (OCSF), se procesan mediante reglas de correlación sobre una ventana deslizante, se agrupan en incidentes con un grafo causal y un paquete de evidencia encadenado por hash, y se indexan en OpenSearch. Cada servicio es independiente y se comunica con el resto solo a través de un bus de mensajes, de modo que cualquier pieza puede escalarse o reemplazarse sin reescribir las demás.
OLLAMA_URL está definido; en caso contrario, un
stub determinista etiquetado. Los datos de alertas nunca se envían a través de una API de LLM de terceros,
y la consola indica qué motor se ejecutó realmente. La calidad de los veredictos es deficiente en los dos modelos medidos (qwen2.5:3b 1 de 54 alertas etiquetadas correctas, qwen2.5:7b 7 de 54, en su mayoría respuestas suspicious); véase
eval/llm_triage/RESULTS.md.OpenSearch, no Elastic: sin asterisco de licencia en el motor de almacenamiento (ADR 003). Vale la pena saberlo, pero no es un diferenciador frente a Wazuh (su indexador también es un fork de OpenSearch).
| Vía | Requiere | Qué obtienes |
|---|---|---|
| La página del proyecto | Un navegador | La consola real sobre una grabación de una ejecución de laboratorio, con un ataque reproducible, la arquitectura, las 46 reglas y cuatro recorridos grabados. Estática; las escrituras permanecen en tu navegador (docs/console-demo.md indica exactamente qué es real). |
make e2e | Python 3 | Fuerza bruta SSH hasta una alerta real, idempotente bajo repetición. Sin Docker, Redis ni OpenSearch. |
make demo | Docker | El stack completo en vivo; una alerta real de fuerza bruta aparece en la consola en aproximadamente un minuto. |
git clone https://github.com/supermhel/fengarde.git && cd fengarde
make preflight # doctor: checks vm.max_map_count, Docker RAM, free ports
make demo # docker compose up -- a real SSH brute-force alert appears
# in the dashboard within ~30-60s, no manual step
# open http://localhost:8080
¿No tienes Docker a mano? Todo el pipeline de detección se ejecuta sin infraestructura:
make e2e # SSH brute-force -> real alert -> idempotent replay, no Docker/Redis/OpenSearch
bash tools/demo.sh # same test, narrated (Windows: powershell -File tools\demo.ps1)
Lo que estás viendo: 10 inicios de sesión fallidos desde una sola IP en un plazo de 60 segundos (SSH Failed password o Windows EventID 4625 — ambos se normalizan al mismo evento de autenticación OCSF) activan common_bruteforce.yml (threshold: 10, window_seconds: 60, agrupados por IP de origen), y la alerta aparece en la lista de alertas del panel, de forma idempotente ante reenvíos.
Requisitos previos: Docker Desktop o Docker Engine + Compose v2, ≥4 GB de RAM asignados a Docker; Linux, macOS o Windows mediante WSL2 (contenedores Linux, scripts sh POSIX). Python 3 solo si vas a contribuir con un parser — para eso no se necesita Docker (consulta Contributing).
vm.max_map_count primerosudo sysctl -w vm.max_map_count=262144
# persist across reboots:
echo 'vm.max_map_count=262144' | sudo tee /etc/sysctl.d/99-fengarde.conf
Sin esto, OpenSearch falla con un bloqueo de la JVM, no con un error útil. No es necesario en macOS Docker Desktop (se gestiona dentro de su VM). make preflight lo comprueba por ti e imprime la solución exacta si falta algo.
Otros objetivos: