TL;DR — Resumen Rápido
Guía completa de CrowdSec: instala, configura bouncers, escenarios personalizados, listas comunitarias y protección Nginx+SSH en servidores Linux.
Cada servidor conectado a Internet está bajo ataque constante: escáneres SSH, crawlers de vulnerabilidades web, bots de credential-stuffing y abusadores de API generan millones de peticiones maliciosas cada hora. CrowdSec es un sistema de prevención de intrusiones moderno y de código abierto que va más allá del simple análisis de logs en un único servidor: analiza tus registros localmente, detecta patrones de ataque mediante escenarios de comportamiento y comparte IPs de atacantes de forma anónima con una comunidad global para construir listas de bloqueo colaborativas. Esta guía cubre la configuración completa de CrowdSec: arquitectura, instalación en Debian/Ubuntu y RHEL/Rocky, colecciones, bouncers, escenarios personalizados, listas blancas, despliegue multi-servidor y un recorrido de hardening en producción para Nginx y SSH.
Requisitos Previos
Antes de comenzar, asegúrate de tener:
- Un servidor Linux con Ubuntu 20.04/22.04/24.04, Debian 11/12 o RHEL/Rocky/AlmaLinux 8/9
- Acceso root o sudo
- systemd como sistema de inicio
- iptables, nftables o firewalld disponibles para el bouncer de firewall
- Familiaridad básica con archivos de configuración YAML
Cómo Funciona CrowdSec
CrowdSec separa la detección de amenazas de su aplicación en tres capas:
1. Agente (detección)
El agente de CrowdSec lee logs desde archivos, journald, Docker, Kafka o syslog. Los logs pasan por una cadena de parsers en etapas: S00-raw normaliza el texto crudo, S01-parse extrae campos estructurados (IP, timestamp, método HTTP, ruta) y S02-enrich agrega datos de GeoIP e inteligencia de amenazas (CTI). Los eventos parseados alimentan escenarios — máquinas de estado YAML que implementan lógica de leaky-bucket, trigger o contador para identificar patrones de ataque.
2. API Local (coordinación) La API Local (LAPI) recibe decisiones del agente, las almacena en SQLite o PostgreSQL y las sirve a los bouncers. En un entorno multi-máquina, un servidor ejecuta la LAPI mientras todos los demás agentes y bouncers se conectan a ella por HTTPS.
3. API Central (inteligencia comunitaria)
Al registrar tu instancia, la API Central en api.crowdsec.net envía listas de bloqueo comunitarias a tu LAPI y recibe informes anónimos de IPs de tu parte. Esto convierte cada despliegue de CrowdSec en un sensor que alimenta la red global de amenazas.
4. Bouncers (aplicación) Los bouncers consultan la LAPI para obtener decisiones activas y las aplican: el bouncer de firewall agrega reglas a iptables/nftables, el bouncer de Nginx emite respuestas HTTP 403 o desafíos CAPTCHA, y el bouncer de Cloudflare crea reglas de firewall en el borde mediante la API de Cloudflare.
Instalación
Ubuntu / Debian
curl -s https://install.crowdsec.net | sudo bash
sudo apt install crowdsec -y
sudo systemctl enable --now crowdsec
sudo systemctl status crowdsec
RHEL / Rocky / AlmaLinux
curl -s https://install.crowdsec.net | sudo bash
sudo dnf install crowdsec -y
sudo systemctl enable --now crowdsec
Docker
services:
crowdsec:
image: crowdsecurity/crowdsec:latest
restart: unless-stopped
environment:
COLLECTIONS: "crowdsecurity/linux crowdsecurity/nginx crowdsecurity/sshd"
volumes:
- /var/log:/var/log:ro
- crowdsec_data:/var/lib/crowdsec/data
- crowdsec_config:/etc/crowdsec
ports:
- "8080:8080"
volumes:
crowdsec_data:
crowdsec_config:
Kubernetes (Helm)
helm repo add crowdsec https://crowdsecurity.github.io/helm-charts
helm repo update
helm install crowdsec crowdsec/crowdsec \
--set agent.acquisition[0].namespace=default \
--set agent.acquisition[0].podName="*" \
--set agent.acquisition[0].program=nginx
Instalación de Colecciones
Las colecciones agrupan parsers y escenarios para un servicio específico. Instálalas con cscli:
# Colección base de Linux (auth, syslog)
sudo cscli collections install crowdsecurity/linux
# Detección de fuerza bruta SSH
sudo cscli collections install crowdsecurity/sshd
# Detección de ataques Nginx
sudo cscli collections install crowdsecurity/nginx
# Apache
sudo cscli collections install crowdsecurity/apache2
# WordPress
sudo cscli collections install crowdsecurity/wordpress
# Recargar después de instalar nuevas colecciones
sudo systemctl reload crowdsec
Lista el contenido instalado del hub:
sudo cscli hub list
sudo cscli collections list
sudo cscli scenarios list
sudo cscli parsers list
Adquisición de Logs
CrowdSec descubre fuentes de logs mediante /etc/crowdsec/acquis.yaml. Se soportan múltiples métodos:
Fuente de archivo
filenames:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
labels:
type: nginx
# --- (next source)
filenames:
- /var/log/auth.log
labels:
type: syslog
journald / systemd
source: journalctl
journalctl_filter:
- "_SYSTEMD_UNIT=sshd.service"
labels:
type: syslog
Contenedores Docker
source: docker
container_name:
- nginx
- myapp
labels:
type: nginx
Después de editar acquis.yaml, reinicia el agente:
sudo systemctl restart crowdsec
Escenarios y Parsers
Tipos de escenario
| Tipo | Descripción | Caso de uso |
|---|---|---|
leakybucket | Cuenta eventos en ventana deslizante; el desbordamiento dispara la decisión | Fuerza bruta (N fallos en T segundos) |
trigger | Un solo evento dispara inmediatamente | Eventos críticos únicos |
counter | Cuenta valores distintos (p. ej., URLs escaneadas) | Escáneres, enumeradores |
Escenario personalizado de ejemplo
Crea /etc/crowdsec/scenarios/myapp-bruteforce.yaml:
type: leakybucket
name: myapp/bruteforce
description: "Detectar fuerza bruta en endpoint de login de myapp"
filter: "evt.Meta.service == 'myapp' && evt.Meta.log_type == 'auth_failed'"
groupby: "evt.Meta.source_ip"
distinct: "evt.Meta.username"
capacity: 5
leakspeed: "10s"
blackhole: "5m"
labels:
service: myapp
type: bruteforce
remediation: true
Campos clave:
| Campo | Significado |
|---|---|
capacity | Máximo llenado del cubo antes del desbordamiento |
leakspeed | Velocidad de drenaje del cubo |
blackhole | Tiempo mínimo entre desbordamientos repetidos para la misma IP |
groupby | Por qué agrupar los eventos (normalmente IP de origen) |
distinct | Cuenta valores distintos para evitar evasión con múltiples usuarios |
remediation: true | El desbordamiento genera una decisión de bloqueo |
Instalación y Configuración de Bouncers
Bouncer de firewall (iptables/nftables)
# Backend iptables
sudo apt install crowdsec-firewall-bouncer-iptables -y
# Backend nftables
sudo apt install crowdsec-firewall-bouncer-nftables -y
sudo systemctl enable --now crowdsec-firewall-bouncer
Verifica el registro:
sudo cscli bouncers list
Bouncer de Nginx
sudo apt install crowdsec-nginx-bouncer -y
Configuración en /etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf:
API_KEY=<auto-generado>
API_URL=http://localhost:8080
MODE=ban # ban | captcha | throttle
CAPTCHA_SITE_KEY=<clave-recaptcha-v2>
CAPTCHA_SECRET_KEY=<secreto-recaptcha-v2>
CAPTCHA_GRACE_TIME=1800
Bouncer de Cloudflare
sudo apt install crowdsec-cloudflare-bouncer -y
sudo crowdsec-cloudflare-bouncer -g <CF_API_TOKEN> -o /etc/crowdsec/bouncers/crowdsec-cloudflare-bouncer.yaml
sudo systemctl enable --now crowdsec-cloudflare-bouncer
Referencia de cscli
# Decisiones
sudo cscli decisions list # Todos los bloqueos activos
sudo cscli decisions add -i 203.0.113.42 # Bloqueo manual
sudo cscli decisions add -r 10.0.0.0/8 -t ban -d 1h # Bloquear CIDR
sudo cscli decisions delete -i 203.0.113.42 # Eliminar bloqueo
# Alertas
sudo cscli alerts list # Escenarios disparados recientemente
sudo cscli alerts inspect <id> # Contexto completo de la alerta
# Gestión del hub
sudo cscli hub list
sudo cscli hub update
sudo cscli collections upgrade crowdsecurity/nginx
# Gestión de máquinas (multi-servidor)
sudo cscli machines list
sudo cscli machines add agent-web-02 --auto
# Gestión de bouncers
sudo cscli bouncers list
sudo cscli bouncers add mi-bouncer
# Métricas
sudo cscli metrics
Listas de Bloqueo Comunitarias y API Central
Regístrate en la API Central para desbloquear las listas comunitarias:
sudo cscli console enroll <tu-token-de-app.crowdsec.net>
sudo systemctl restart crowdsec
Las listas comunitarias incluyen:
- Lista de reputación de IPs de CrowdSec — IPs detectadas atacando despliegues de CrowdSec en todo el mundo
- Firehol Level 1 — IPs maliciosas conocidas
- Nodos de salida Tor — opcional, para bloquear tráfico anónimo
- Listas de proxy/VPN — IPs de salida de proveedores cloud usadas por bots
Cada decisión de la API Central tiene un type: ban (bloqueo duro), captcha (desafío CAPTCHA) o throttle (limitación de velocidad).
Listas Blancas
Lista blanca de parser (pre-escenario)
Crea /etc/crowdsec/parsers/s02-enrich/whitelist.yaml:
name: miempresa/whitelists
description: "IPs de oficina y monitoreo"
whitelist:
reason: "IPs internas y de confianza"
ip:
- "192.168.1.0/24"
- "10.0.0.0/8"
cidr:
- "172.16.0.0/12"
Lista blanca post-desbordamiento
name: miempresa/postoverflow-whitelist
description: "Permitir monitoreo sintético desde IPs conocidas"
whitelist:
reason: "Monitoreo de disponibilidad"
expression:
- "evt.Overflow.Alert.Source.IP in ['203.0.113.100', '203.0.113.101']"
Configuración Multi-Servidor
Servidor LAPI
# /etc/crowdsec/config.yaml
api:
server:
listen_uri: 0.0.0.0:8080
tls:
cert_file: /etc/crowdsec/ssl/cert.pem
key_file: /etc/crowdsec/ssl/key.pem
Registro de agentes adicionales
En cada servidor adicional:
sudo apt install crowdsec -y
sudo cscli lapi register -u https://servidor-lapi:8080
# En el servidor LAPI, validar:
sudo cscli machines validate <machine-id>
Bouncer conectado a LAPI remota
# /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
api_url: https://servidor-lapi:8080
api_key: <clave-bouncer-del-servidor-lapi>
Monitoreo: Prometheus y Grafana
CrowdSec expone métricas Prometheus en http://localhost:6060/metrics. Importa el dashboard oficial de Grafana (ID 14584) para una vista visual de:
- Decisiones emitidas por hora
- Servicios más atacados
- Tasas de acierto de parsers
- Frecuencia de desbordamiento de escenarios
Comprobación rápida por CLI:
sudo cscli metrics
CrowdSec vs Alternativas
| Herramienta | Mecanismo | Lenguaje | Multi-servidor | Inteligencia Comunitaria | Bouncers |
|---|---|---|---|---|---|
| CrowdSec | Escenarios de comportamiento | Go | LAPI nativo | Sí (API Central) | Firewall, Nginx, CF, personalizado |
| Fail2Ban | Regex de logs | Python | Sync manual | No | iptables, nftables, firewalld |
| Suricata | IDS/IPS de red | C | Modo clúster | Suscripciones de reglas | NFQueue |
| OSSEC/Wazuh | HIDS + análisis de logs | C | Manager-agente | Reglas Wazuh cloud | Respuesta activa |
| ModSecurity | WAF (capa HTTP) | C | Proxy inverso | OWASP CRS | Módulo Nginx/Apache |
| Cloudflare WAF | Firewall de borde | N/A | CDN global | Intel de amenazas CF | Solo borde CF |
Despliegue en Producción: Nginx + SSH
Paso 1 — Instalar CrowdSec y colecciones:
curl -s https://install.crowdsec.net | sudo bash
sudo apt install crowdsec -y
sudo cscli collections install crowdsecurity/linux \
crowdsecurity/sshd \
crowdsecurity/nginx
Paso 2 — Configurar adquisición de logs en /etc/crowdsec/acquis.yaml:
filenames:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
labels:
type: nginx
# --- (next source)
source: journalctl
journalctl_filter:
- "_SYSTEMD_UNIT=sshd.service"
labels:
type: syslog
Paso 3 — Instalar bouncer de firewall:
sudo apt install crowdsec-firewall-bouncer-nftables -y
sudo systemctl enable --now crowdsec-firewall-bouncer
Paso 4 — Lista blanca de IPs de confianza:
# /etc/crowdsec/parsers/s02-enrich/whitelist.yaml
name: miserv/whitelist
description: "IPs de confianza"
whitelist:
reason: "Oficina y VPN"
ip:
- "192.168.1.0/24"
Paso 5 — Registrarse en la API Central:
sudo cscli console enroll <token-de-app.crowdsec.net>
sudo systemctl restart crowdsec
Paso 6 — Verificar que la protección está activa:
sudo cscli decisions list
sudo cscli metrics
sudo cscli bouncers list
Casos Especiales y Advertencias
- Falsos positivos de balanceadores de carga: Si todo el tráfico llega a través de un proxy inverso, CrowdSec ve solo la IP del proxy. Configura el parsing de
X-Forwarded-Foro agrega la IP del proxy a la lista blanca y asegúrate de extraer la IP real del cliente. - Logs de Docker: Los logs de Docker requieren el tipo de adquisición
source: docker. Montar/var/logno funciona para contenedores que escriben en stdout/stderr. - Brechas de cobertura de parsers: Revisa
sudo cscli metricspara valores altos deunparsed— indican líneas de log sin parser instalado. - Claves API de bouncers: Si regeneras las claves (p. ej., tras reinstalar la LAPI), actualiza el archivo de configuración de cada bouncer y reinicia el servicio.
Resumen
CrowdSec ofrece un sistema de prevención de intrusiones en capas y potenciado por la comunidad que escala desde un único VPS hasta una flota multi-datacenter:
- El agente analiza logs mediante una cadena de parsers por etapas y evalúa eventos con escenarios YAML de tipo leaky-bucket, trigger y contador
- La API Local coordina decisiones y conecta bouncers con agentes en despliegues multi-servidor
- Los bouncers aplican decisiones en el firewall (iptables/nftables), aplicación (Nginx) o CDN (Cloudflare)
cscligestiona colecciones, decisiones, alertas, máquinas, bouncers y métricas desde la línea de comandos- Las listas de bloqueo comunitarias vía la API Central añaden inteligencia de amenazas global sin configuración adicional
- Los escenarios y listas blancas personalizados permiten ajustar la protección con precisión