Gestión de la Consola y Bouncers de CrowdSec

CrowdSec es un sistema de seguridad colaborativo que analiza los logs del servidor en tiempo real para detectar comportamientos maliciosos y comparte automáticamente las IPs de atacantes con la comunidad global, creando una inteligencia colectiva de amenazas. Los bouncers son los componentes que ejecutan las acciones de remediación (banear, redirigir, responder con captcha), mientras que la consola en la nube proporciona visibilidad centralizada de todas las alertas.

Requisitos Previos

  • CrowdSec instalado y funcionando (versión 1.5+)
  • Acceso root o sudo al servidor
  • Nginx o Apache instalados (para el bouncer web)
  • Cuenta gratuita en console.crowdsec.net (para la consola)

Instalación de Bouncers de Firewall

El bouncer de firewall es el más eficiente: bloquea el tráfico directamente en el kernel:

# Instalar el bouncer de firewall (cs-firewall-bouncer)
# Compatible con iptables, nftables y ipset

# Añadir el repositorio de CrowdSec si no está
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh \
  | sudo bash

# Ubuntu/Debian
sudo apt install -y crowdsec-firewall-bouncer-nftables

# Para iptables en lugar de nftables
sudo apt install -y crowdsec-firewall-bouncer-iptables

# CentOS/Rocky
sudo yum install -y crowdsec-firewall-bouncer-nftables

# El servicio se configura automáticamente y se conecta al agente local
sudo systemctl status crowdsec-firewall-bouncer

# Ver las IPs actualmente bloqueadas
sudo ipset list crowdsec-blacklists 2>/dev/null || \
  sudo nft list set inet crowdsec blacklists 2>/dev/null

Verificar la comunicación entre el bouncer y el agente:

# Listar los bouncers registrados
sudo cscli bouncers list

# Resultado esperado:
# Name                         IP Address  Valid     Last API Pull
# FirewallBouncer              127.0.0.1   true      2024-01-15T10:30:00Z

# Ver las decisiones de bloqueo activas
sudo cscli decisions list

# Ver estadísticas del bouncer
sudo cscli metrics | grep -A10 "Bouncer metrics"

Configuración avanzada del bouncer de firewall:

# Editar la configuración del bouncer
sudo nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
# /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
mode: nftables  # o iptables según tu sistema

# Conexión al agente CrowdSec local
api_url: http://127.0.0.1:8080/
api_key: TU_API_KEY_BOUNCER

# Actualizar las reglas cada 10 segundos
update_frequency: 10s

# Incluir decisiones de la comunidad (blocklist compartida)
include_scenarios_containing: []
exclude_scenarios_containing: []

# Para nftables: configurar la tabla y el set
nftables:
  ipv4:
    enabled: true
    set-only: false
    table: crowdsec
    chain: CROWDSEC_CHAIN
    priority: -10
    set:
      type: ipv4_addr
      flags:
        - interval
  ipv6:
    enabled: true
    set-only: false
    table: crowdsec
    chain: CROWDSEC_CHAIN
    priority: -10

Instalación del Bouncer de Nginx

El bouncer de Nginx puede responder con captcha, redirigir o bloquear IPs malas:

# Instalar el módulo de Nginx para CrowdSec (OpenResty necesario)
# Alternativa: usar el módulo nativo de Nginx

# Método con crowdsec-nginx-bouncer (basado en Lua/OpenResty)
sudo apt install -y crowdsec-nginx-bouncer

# O instalar manualmente para Nginx estándar:
# El bouncer funciona como middleware en el servidor

# Ver la configuración generada
cat /etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf

Configuración en Nginx:

# /etc/nginx/conf.d/crowdsec.conf - Integración CrowdSec

# El bouncer de Nginx requiere Lua (OpenResty o nginx-extras con módulo Lua)
lua_shared_dict crowdsec_cache 50m;

# Incluir la lógica del bouncer
init_by_lua_block {
  cs = require "plugins.crowdsec.crowdsec"
  config_path = "/etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf"
  cs:init(config_path, "crowdsec_cache")
}

access_by_lua_block {
  local remediation = cs:get_remediation(ngx.var.remote_addr)
  if remediation == "ban" then
    return ngx.exit(403)
  elseif remediation == "captcha" then
    -- Redirigir a captcha
    return ngx.redirect("/crowdsec-captcha")
  end
}

Registro en la Consola CrowdSec

La consola proporciona visibilidad centralizada de todas las instancias:

# Paso 1: Crear cuenta en https://console.crowdsec.net/

# Paso 2: Obtener el token de registro desde la consola
# Ve a: Security Engines > Add Security Engine > Copy enrollment key

# Paso 3: Registrar tu instancia
sudo cscli console enroll TU_ENROLLMENT_KEY

# Paso 4: Aceptar el registro en la consola web
# Ve a: Security Engines > Pending > Accept

# Verificar que la instancia está registrada
sudo cscli console status

# Configurar qué métricas enviar a la consola
sudo cscli console configure --all  # Enviar todas las métricas

# Ver las opciones disponibles
sudo cscli console configure --help

# Opciones disponibles para enviar a la consola:
# - context: contexto de las alertas
# - manual: decisiones manuales
# - tainted: fuentes contaminadas (FP)
# - custom: escenarios personalizados

Ajuste de Escenarios

Los escenarios definen qué comportamientos se consideran maliciosos:

# Listar escenarios instalados
sudo cscli scenarios list

# Instalar escenarios adicionales del Hub
sudo cscli scenarios install crowdsecurity/nginx-req-limit-exceeded
sudo cscli scenarios install crowdsecurity/http-bad-user-agent
sudo cscli scenarios install crowdsecurity/ssh-slow-bf

# Ver todos los escenarios disponibles
sudo cscli hub list -t scenarios

# Actualizar todos los escenarios
sudo cscli hub update && sudo cscli hub upgrade

# Ver los detalles de un escenario
sudo cscli scenarios inspect crowdsecurity/ssh-bf

Crear un escenario personalizado:

sudo tee /etc/crowdsec/scenarios/custom-api-abuse.yaml << 'EOF'
type: leaky
name: custom/api-abuse
description: "Detecta abuso de la API - demasiadas peticiones en poco tiempo"
filter: "evt.Meta.service == 'nginx' && evt.Meta.http_path startswith '/api/'"
leakspeed: "10s"
capacity: 30
labels:
  service: http
  type: bruteforce
  behavior: "http:api-abuse"
blackhole: 5m
EOF

sudo systemctl reload crowdsec
sudo cscli scenarios list | grep custom

Listas de Permitidos y Bloqueados

# Añadir una IP a la lista blanca (nunca bloquear)
sudo cscli whitelists add ip 192.168.1.100 "Servidor de monitorización"

# Añadir un rango de red a la lista blanca
sudo cscli whitelists add range 10.0.0.0/8 "Red interna corporativa"

# Ver las listas blancas
sudo cscli whitelists list

# Eliminar de la lista blanca
sudo cscli whitelists remove 192.168.1.100

# Bloquear manualmente una IP
sudo cscli decisions add --ip 203.0.113.50 --reason "IP abusiva confirmada" --duration 24h

# Bloquear un rango de red
sudo cscli decisions add --range 198.51.100.0/24 --reason "ASN malicioso" --duration 168h

# Levantar el bloqueo de una IP
sudo cscli decisions delete --ip 203.0.113.50

# Ver todas las decisiones activas
sudo cscli decisions list

# Importar una blocklist externa
sudo cscli decisions import -i /tmp/blocklist.txt --format plain

# Exportar las decisiones actuales
sudo cscli decisions export -o /tmp/mis-decisiones.json

Configurar listas blancas en el fichero de configuración:

sudo tee /etc/crowdsec/whitelists.yaml << 'EOF'
name: mis-listas-blancas
description: "IPs y rangos de confianza para mi infraestructura"
whitelist:
  reason: "IP interna de confianza"
  ip:
    - "127.0.0.1"
    - "192.168.1.254"  # Gateway
  cidr:
    - "10.0.0.0/8"
    - "172.16.0.0/12"
    - "192.168.0.0/16"
  expression:
    - "evt.Meta.http_path startswith '/health'"  # Endpoint de salud - nunca bloquear
    - "evt.Parsed.program in ['cron', 'systemd']"
EOF

Integración con la API

# Instalar la herramienta de gestión via API
# La API local de CrowdSec escucha en el puerto 8080 por defecto

# Obtener el token de la API local
sudo cscli api-key generate -n "mi-integracion"

# Consultar las decisiones via API REST
curl -H "X-Api-Key: TU_API_KEY" \
  "http://localhost:8080/v1/decisions?ip=203.0.113.50"

# Añadir una decisión via API
curl -X POST \
  -H "X-Api-Key: TU_API_KEY" \
  -H "Content-Type: application/json" \
  "http://localhost:8080/v1/decisions" \
  -d '[{
    "duration": "24h",
    "ip": "203.0.113.50",
    "reason": "Abuso detectado",
    "scope": "Ip",
    "type": "ban"
  }]'

# Integración con script de monitorización
cat > /usr/local/bin/crowdsec-status.sh << 'SCRIPT'
#!/bin/bash
echo "=== Estado de CrowdSec ==="
echo ""
echo "Alertas (últimas 24h):"
sudo cscli alerts list --since 24h | head -20

echo ""
echo "Decisiones activas:"
sudo cscli decisions list | wc -l

echo ""
echo "Top 5 IPs bloqueadas:"
sudo cscli decisions list -o json \
  | jq -r '.[].value' | sort | uniq -c | sort -rn | head 5

echo ""
echo "Bouncers conectados:"
sudo cscli bouncers list
SCRIPT

chmod +x /usr/local/bin/crowdsec-status.sh

Solución de Problemas

El bouncer no bloquea IPs:

# Verificar que el bouncer está conectado
sudo cscli bouncers list

# Si no aparece, regenerar el token
sudo cscli bouncers delete FirewallBouncer
sudo cscli bouncers add FirewallBouncer

# Actualizar el API key en la configuración del bouncer
sudo nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
# api_key: NUEVO_API_KEY

sudo systemctl restart crowdsec-firewall-bouncer

Demasiados falsos positivos:

# Ver qué escenario está disparando la alerta
sudo cscli alerts list | grep IP_DEL_FP

# Inspeccionar la alerta
sudo cscli alerts inspect ID_ALERTA

# Si es un FP, añadir a la lista blanca inmediatamente
sudo cscli whitelists add ip IP_DEL_FP "FP confirmado - servidor de confianza"

# Reportar el FP a CrowdSec (mejora la comunidad)
sudo cscli alerts report --fp ID_ALERTA

CrowdSec no procesa los logs:

# Verificar las colecciones instaladas
sudo cscli collections list | grep nginx  # o el servicio correspondiente

# Instalar la colección si falta
sudo cscli collections install crowdsecurity/nginx

# Verificar que los parsers leen el log correcto
sudo cscli parsers list | head 20

# Probar el parseo de un log
echo '192.168.1.100 - - [15/Jan/2024:10:30:45] "GET / HTTP/1.1" 200 1234' \
  | sudo cscli parsers check --file -

Conclusión

CrowdSec proporciona una defensa colaborativa que se vuelve más inteligente con cada instancia que se une a la comunidad. La combinación de bouncers de firewall para bloqueo a nivel de kernel con el bouncer de Nginx para respuestas más sofisticadas (captcha, redirección) permite adaptar la remediación al nivel de riesgo de cada amenaza. La consola centralizada es especialmente valiosa para entornos con múltiples servidores, donde proporciona una visión unificada de las amenazas que afectan a toda la infraestructura.