Mascota Jacar — leyendo contigo Un portátil cuyos ojos siguen el cursor mientras lees.
Cómo Instalar Tecnología

Cómo instalar CrowdSec como WAF comunitario

Cómo instalar CrowdSec como WAF comunitario

Actualizado: 2026-05-03

CrowdSec[1] es la evolución moderna de fail2ban con un enfoque muy diferente al del clásico: separa la detección del bloqueo, expone una API y aprovecha una blocklist alimentada por miles de instalaciones voluntarias repartidas por el mundo. En la actualidad, tras varios años de desarrollo activo, es una herramienta madura que merece estar en el toolkit de cualquiera que gestione servicios expuestos a internet. Esta guía recorre la instalación y la integración con Traefik poniendo el énfasis en entender por qué cada pieza existe, no solo en copiar comandos.

Puntos clave

  • CrowdSec separa detección (agente + LAPI) de bloqueo (bouncers): la misma fuente de decisiones puede alimentar un bouncer HTTP en Traefik y otro de red en iptables simultáneamente.
  • La acquisition es el paso que más se olvida: decirle al agente de qué logs leer, con las etiquetas correctas, es crítico.
  • La remediación con captcha (Cloudflare Turnstile) es más inteligente que el ban directo para escenarios de fuerza bruta.
  • La blocklist comunitaria bloquea cientos de IPs conocidas antes de que lleguen a hacer nada.
  • En un VPS de hobby, fail2ban sigue siendo más simple; CrowdSec paga a partir de varias capas que proteger.

Por qué vale la pena el cambio desde fail2ban

La diferencia más importante es arquitectónica. fail2ban lee logs, decide y ejecuta una regla de iptables en el mismo proceso. CrowdSec separa esas responsabilidades:

  • El agente lee logs y emite decisiones a la LAPI (una API REST local).
  • Los bouncers consultan la LAPI y ejecutan el bloqueo.

Esta separación tiene consecuencias importantes. Puedes tener un bouncer en el firewall para SSH, otro en Traefik para HTTP y ambos actúan sobre las mismas decisiones. Cambias la detección sin tocar el bloqueo. Y si decides contribuir tus detecciones a la comunidad, recibes a cambio una lista actualizada de IPs que están atacando a otros en este momento.

La segunda diferencia es la expresividad. fail2ban usa regex sobre líneas de log; CrowdSec usa scenarios declarativos en YAML que combinan detección, capacidad, ventana de tiempo y grupo. Escribir un scenario para un nuevo patrón es un ejercicio de quince minutos.

Instalación del agente

En Debian o Ubuntu:

bash
curl -s https://install.crowdsec.net | sudo sh
sudo apt install crowdsec

El agente y la LAPI quedan en el mismo proceso, escuchando en localhost. sudo cscli version y sudo systemctl status crowdsec confirman que todo arrancó.

Collections: trabajo ahorrado desde el primer día

Una collection agrupa parsers (cómo leer un formato de log) y scenarios (patrones de ataque) para una tecnología concreta. Para un stack típico con Traefik, WordPress y Gitea:

bash
sudo cscli collections install crowdsecurity/traefik
sudo cscli collections install crowdsecurity/wordpress
sudo cscli collections install crowdsecurity/gitea

Cada collection trae lo que necesitas: la de WordPress detecta fuerza bruta en login, escaneo de usuarios y accesos a rutas sensibles como wp-config.php. No necesitas entender cada scenario desde el primer día; a los pocos días habrás revisado cuáles se disparan en tu tráfico real.

Decirle al agente qué logs leer

Este es el paso que más se olvida. La configuración va en /etc/crowdsec/acquis.yaml. Para un setup con Traefik en Docker y SSH via systemd:

yaml
- filenames:
    - /var/log/traefik/access.log
  labels:
    type: traefik
- source: journald
  journalctl_filter:
    - "_SYSTEMD_UNIT=sshd.service"
  labels:
    type: syslog

La etiqueta type no es arbitraria: los parsers filtran por ella. Si pones type: traefik-access cuando el parser espera type: traefik, no detectará nada sin mostrar error explícito. Este es el error más común entre usuarios nuevos. Tras editar: sudo systemctl restart crowdsec. Y a los pocos minutos, sudo cscli metrics debe mostrar líneas siendo procesadas.

Diagnóstico: qué ver los primeros días

Tres comandos que deben convertirse en rutina:

  • sudo cscli alerts list: alertas disparadas (detecciones).
  • sudo cscli decisions list: decisiones activas (IPs actualmente bloqueadas o bajo captcha).
  • sudo cscli metrics: ritmo de detecciones, aciertos de cache, estado general.

Si llevas 24 horas corriendo y nada de esto muestra actividad, tu acquisition probablemente no está leyendo lo que crees.

Los bouncers: de detección a bloqueo efectivo

CrowdSec detecta, pero todavía no bloquea nada. Necesitas al menos un bouncer. Para Traefik, el plugin oficial es maxlerebourg/crowdsec-bouncer-traefik-plugin:

Se declara en la configuración estática de Traefik como plugin experimental y en la dinámica como middleware. El plugin consulta la LAPI en modo stream (cachea decisiones y se actualiza cada pocos segundos), manteniendo la latencia percibida en cero.

La clave de API del bouncer se genera así:

bash
sudo cscli bouncers add traefik-bouncer

Copia el token que aparece una única vez y ponlo en la configuración del middleware.

Para SSH, añade el firewall bouncer:

bash
sudo apt install crowdsec-firewall-bouncer-iptables

Se configura solo. Ahora tienes dos bouncers compartiendo la misma fuente de decisiones.

Remediación con captcha: no todo es ban

El error clásico del WAF es banear todo lo sospechoso y descubrir a la semana que estabas bloqueando clientes legítimos. CrowdSec permite emitir decisiones de tipo captcha en lugar de ban. El bouncer de Traefik sabe interpretarlas: muestra un desafío de Cloudflare Turnstile en lugar de cortar.

El patrón que funciona bien en producción:

  • Fuerza bruta (alguien probando contraseñas) → captcha. El usuario legítimo lo resuelve y sigue.
  • Exploits conocidos (CVEs, acceso a rutas sensibles) → ban directo. Un bot de exploit no resuelve captchas.

La integración con Turnstile solo requiere dos claves (site key y secret key) del panel de Cloudflare, ambas gratuitas y sin límites prácticos para uso normal.

El valor real de la blocklist comunitaria

Registrar tu instalación con la CAPI central (sudo cscli capi register) te pone en la red comunitaria. Empiezas a recibir una lista actualizada de IPs que están atacando a otros ahora mismo, y contribuyes (de forma anonimizada) las tuyas. El impacto es claramente medible: revisa las métricas antes y después de activar la CAPI y verás cómo cae el ruido de intentos sobre endpoints típicos.

Matiz ético: al compartir detecciones contribuyes a una defensa colectiva, pero también envías información sobre tu tráfico. Para la mayoría de instalaciones el cambio es aceptable; para entornos con exigencias de privacidad estrictas, leer los términos antes de activar.

Monitorización

CrowdSec expone métricas Prometheus en un endpoint HTTP local. Métricas útiles:

  • cs_bucket_overflow_count: detecciones acumuladas.
  • cs_active_decisions: IPs bloqueadas en este momento.

Hay un dashboard oficial de Grafana listo para usar. La alerta más importante no es el pico de detecciones (puede ser ruidoso) sino la ausencia de métricas durante más de cinco minutos: señal de que el agente paró o la acquisition se rompió.

Whitelists y errores comunes

Antes de bloquear nada en serio, asegúrate de que tus propias IPs están en whitelist: tu oficina, el VPN que usas, el CI/CD que hace deploys, los monitores externos. Va en /etc/crowdsec/parsers/s02-enrich/whitelists.yaml y acepta IPs individuales y rangos CIDR. El número de administradores que se han bloqueado a sí mismos en las primeras horas supera al de atacantes que han frustrado ese mismo día.

Otro error frecuente: no reiniciar el agente después de editar la configuración. CrowdSec no detecta cambios en caliente; un systemctl restart crowdsec tras editar es disciplina básica.

Cuándo no compensa CrowdSec

Hay escenarios donde fail2ban sigue siendo más simple y adecuado:

  • Servidor único con bajo tráfico y sin necesidad de compartir inteligencia entre nodos.
  • Sin Traefik (sin plugin HTTP) y sin capas múltiples que proteger.

CrowdSec empieza a pagar cuando tienes más de una capa (web + SSH + aplicaciones), cuando la blocklist comunitaria corta ruido significativo, o cuando quieres integrar con Ansible para gestionar whitelists y configuración de forma centralizada.

Mi recomendación

Si vas a probarlo, despliegue progresivo:

  1. Instala el agente, configura la acquisition y déjalo una semana en modo detección sin bouncer.
  2. Revisa qué se dispara, ajusta scenarios si hay ruido, añade whitelists.
  3. Solo entonces activa el primer bouncer (Traefik).
  4. Espera otra semana, añade captcha remediation para fuerza bruta.
  5. Por último, conecta con la CAPI.

Llegar a este punto de madurez lleva dos o tres semanas de convivencia. La inversión es razonable para cualquier stack con exposición real a internet.

¿Te ha resultado útil?
[Total: 10 · Media: 4.3]
  1. CrowdSec

Escrito por

CEO - Jacar Systems

Apasionado de la tecnología, la infraestructura cloud y la inteligencia artificial. Escribe sobre DevOps, IA, plataformas y software desde Madrid.