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

TipoDescripciónCaso de uso
leakybucketCuenta eventos en ventana deslizante; el desbordamiento dispara la decisiónFuerza bruta (N fallos en T segundos)
triggerUn solo evento dispara inmediatamenteEventos críticos únicos
counterCuenta 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:

CampoSignificado
capacityMáximo llenado del cubo antes del desbordamiento
leakspeedVelocidad de drenaje del cubo
blackholeTiempo mínimo entre desbordamientos repetidos para la misma IP
groupbyPor qué agrupar los eventos (normalmente IP de origen)
distinctCuenta valores distintos para evitar evasión con múltiples usuarios
remediation: trueEl 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

HerramientaMecanismoLenguajeMulti-servidorInteligencia ComunitariaBouncers
CrowdSecEscenarios de comportamientoGoLAPI nativoSí (API Central)Firewall, Nginx, CF, personalizado
Fail2BanRegex de logsPythonSync manualNoiptables, nftables, firewalld
SuricataIDS/IPS de redCModo clústerSuscripciones de reglasNFQueue
OSSEC/WazuhHIDS + análisis de logsCManager-agenteReglas Wazuh cloudRespuesta activa
ModSecurityWAF (capa HTTP)CProxy inversoOWASP CRSMódulo Nginx/Apache
Cloudflare WAFFirewall de bordeN/ACDN globalIntel de amenazas CFSolo 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-For o 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/log no funciona para contenedores que escriben en stdout/stderr.
  • Brechas de cobertura de parsers: Revisa sudo cscli metrics para valores altos de unparsed — 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)
  • cscli gestiona 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

Artículos Relacionados