CrowdSec: Proteja su Red de Servidores Web – Instalación y Configuración
CrowdSec es una solución de seguridad colaborativa de código abierto que protege servidores web contra ataques cibernéticos mediante inteligencia colectiva. A diferencia de las soluciones tradicionales como fail2ban, CrowdSec utiliza un enfoque comunitario donde los datos de ataques se comparten entre usuarios para crear una defensa más robusta y actualizada en tiempo real.
Información importante: Esta guía está optimizada para Ubuntu Server 24.04 con integración avanzada de nftables + fail2ban en puerto SSH 1422 para entornos de producción.
Índice de Contenidos
- ¿Qué es CrowdSec?
- Ventajas sobre Soluciones Tradicionales
- Requisitos del Sistema
- Instalación de CrowdSec
- Configuración Básica
- Integración con nftables
- Configuración Avanzada
- Monitoreo y Alertas
- Mantenimiento y Actualizaciones
- Solución de Problemas
¿Qué es CrowdSec?
CrowdSec es un sistema de detección y prevención de intrusiones (IDS/IPS) moderno que utiliza inteligencia colectiva para proteger infraestructuras web. Su arquitectura se basa en tres componentes principales:
- Agente de Detección: Analiza logs en tiempo real para detectar comportamientos maliciosos
- API Local: Gestiona las decisiones de bloqueo y comunicación entre componentes
- Bouncers: Ejecutan las acciones de bloqueo en firewalls, proxies o aplicaciones
Arquitectura de CrowdSec
La arquitectura de CrowdSec se diseñó para ser modular y escalable:
- Parsers: Analizan y estructuran los logs
- Scenarios: Definen patrones de comportamiento malicioso
- Collections: Agrupan parsers y scenarios relacionados
- Postoverflows: Procesan decisiones después de la detección
Ventajas sobre Soluciones Tradicionales
CrowdSec vs fail2ban
| Característica | CrowdSec | fail2ban |
|---|---|---|
| Inteligencia | Colaborativa y en tiempo real | Local y estática |
| Detección | Machine Learning + Reglas | Solo expresiones regulares |
| Actualizaciones | Automáticas desde la comunidad | Manuales |
| Escalabilidad | Multi-servidor nativo | Limitado a un servidor |
| API | RESTful completa | No disponible |
| Dashboards | Web UI incluido | Solo logs |
Beneficios Clave
- Inteligencia Colectiva: Aprende de ataques globales en tiempo real
- Falsos Positivos Reducidos: Algoritmos avanzados minimizan bloqueos incorrectos
- Escalabilidad: Diseñado para entornos multi-servidor
- Flexibilidad: Múltiples bouncers para diferentes tecnologías
- Transparencia: Código abierto y auditable
Requisitos del Sistema
Hardware Mínimo
- CPU: 1 core (2 cores recomendado)
- RAM: 512 MB (1 GB recomendado)
- Almacenamiento: 1 GB libre
- Red: Conexión a Internet para actualizaciones
Software Requerido
- Ubuntu Server 24.04 LTS
- nftables (para integración con firewall)
- Servicios web (Nginx, Apache, etc.)
- Acceso root o sudo
Instalación de CrowdSec
Paso 1: Preparación del Sistema
# Actualizar el sistema
sudo apt update && sudo apt upgrade -y
# Instalar dependencias
sudo apt install -y curl wget gnupg2 software-properties-common
Paso 2: Añadir Repositorio Oficial
# Añadir clave GPG de CrowdSec
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
# Verificar que el repositorio se añadió correctamente
apt-cache policy crowdsec
Paso 3: Instalación del Agente CrowdSec
# Instalar CrowdSec
sudo apt install -y crowdsec
# Verificar instalación
sudo systemctl status crowdsec
Paso 4: Instalación del Bouncer para nftables
# Instalar bouncer para nftables
sudo apt install -y crowdsec-firewall-bouncer-nftables
# Verificar instalación
sudo systemctl status crowdsec-firewall-bouncer
Éxito: CrowdSec se ha instalado correctamente. El servicio debería estar ejecutándose y listo para configuración.
Configuración Básica
Configuración del Agente Principal
# Editar configuración principal
sudo nano /etc/crowdsec/config.yaml
Configuración básica recomendada:
# Configuración básica de CrowdSec
common:
daemonize: true
pid_dir: /var/run/
log_media: file
log_level: info
log_dir: /var/log/
working_dir: /var/lib/crowdsec/data/
config_paths:
config_dir: /etc/crowdsec/
data_dir: /var/lib/crowdsec/data/
simulation_path: /etc/crowdsec/simulation.yaml
hub_dir: /etc/crowdsec/hub/
index_path: /etc/crowdsec/hub/.index.json
crowdsec_service:
acquisition_path: /etc/crowdsec/acquis.yaml
parser_routines: 1
cscli:
output: human
hub_branch: master
db_config:
log_level: info
type: sqlite
db_path: /var/lib/crowdsec/data/crowdsec.db
flush:
max_items: 5000
max_age: 7d
api:
client:
insecure_skip_verify: false
credentials_path: /etc/crowdsec/local_api_credentials.yaml
server:
log_level: info
listen_uri: 127.0.0.1:8080
profiles_path: /etc/crowdsec/profiles.yaml
trusted_ips:
- 127.0.0.1
- ::1
Configuración de Adquisición de Logs
# Configurar fuentes de logs
sudo nano /etc/crowdsec/acquis.yaml
# Configuración de adquisición de logs
filenames:
- /var/log/auth.log
- /var/log/syslog
labels:
type: syslog
---
filenames:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
labels:
type: nginx
---
filenames:
- /var/log/apache2/access.log
- /var/log/apache2/error.log
labels:
type: apache2
---
# SSH logs específicos para puerto 1422
filenames:
- /var/log/auth.log
labels:
type: syslog
service: ssh
Instalación de Collections
# Instalar collections básicas
sudo cscli collections install crowdsecurity/linux
sudo cscli collections install crowdsecurity/sshd
sudo cscli collections install crowdsecurity/nginx
sudo cscli collections install crowdsecurity/apache2
# Verificar collections instaladas
sudo cscli collections list
Integración con nftables
Configuración del Bouncer nftables
# Configurar bouncer nftables
sudo nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
# Configuración del bouncer nftables
mode: nftables
pid_dir: /var/run/
update_frequency: 10s
daemonize: true
log_mode: file
log_dir: /var/log/
log_level: info
api_url: http://localhost:8080
api_key: YOUR_API_KEY_HERE
nftables_config:
ipv4:
enabled: true
set-only: false
table: crowdsec
chain: crowdsec-chain
ipv6:
enabled: true
set-only: false
table: crowdsec6
chain: crowdsec6-chain
blacklists_ipv4: crowdsec-blacklists
blacklists_ipv6: crowdsec6-blacklists
Generar API Key para Bouncer
# Generar API key para el bouncer
sudo cscli bouncers add crowdsec-firewall-bouncer
# Copiar la API key generada y reemplazar en el archivo de configuración
sudo nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
Configuración de nftables Compatible
# Crear configuración nftables compatible con CrowdSec
sudo nano /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
# Tabla principal para IPv4
table inet filter {
# Conjunto para IPs bloqueadas por fail2ban
set fail2ban_ssh {
type ipv4_addr
flags dynamic
}
chain input {
type filter hook input priority 0; policy drop;
# Permitir loopback
iif lo accept
# Permitir conexiones establecidas y relacionadas
ct state established,related accept
# Bloquear IPs en la lista de fail2ban
ip saddr @fail2ban_ssh drop
# Permitir SSH en puerto personalizado con rate limiting
tcp dport 1422 ct state new limit rate 3/minute accept
# Permitir HTTP y HTTPS
tcp dport { 80, 443 } accept
# Permitir ping con rate limiting
icmp type echo-request limit rate 1/second accept
# Log y drop del resto
log prefix "nftables-drop: " drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
# Tabla específica para CrowdSec IPv4
table ip crowdsec {
set crowdsec-blacklists {
type ipv4_addr
flags dynamic
}
chain crowdsec-chain {
type filter hook input priority -10; policy accept;
ip saddr @crowdsec-blacklists drop
}
}
# Tabla específica para CrowdSec IPv6
table ip6 crowdsec6 {
set crowdsec6-blacklists {
type ipv6_addr
flags dynamic
}
chain crowdsec6-chain {
type filter hook input priority -10; policy accept;
ip6 saddr @crowdsec6-blacklists drop
}
}
Importante: Esta configuración mantiene la compatibilidad con fail2ban existente mientras añade las capacidades de CrowdSec.
Aplicar Configuración y Reiniciar Servicios
# Aplicar configuración nftables
sudo nft -f /etc/nftables.conf
# Reiniciar servicios
sudo systemctl restart crowdsec
sudo systemctl restart crowdsec-firewall-bouncer
# Verificar estado
sudo systemctl status crowdsec
sudo systemctl status crowdsec-firewall-bouncer
Configuración Avanzada
Configuración de Perfiles de Decisión
# Editar perfiles de decisión
sudo nano /etc/crowdsec/profiles.yaml
# Perfiles de decisión personalizados
name: default_ip_remediation
debug: true
filters:
- Alert.Remediation == true && Alert.GetScope() == "Ip"
decisions:
- type: ban
duration: 4h
on_success: break
---
name: aggressive_ssh_remediation
debug: true
filters:
- Alert.Remediation == true && Alert.GetScope() == "Ip" && Alert.GetScenario() contains "ssh"
decisions:
- type: ban
duration: 24h
on_success: break
---
name: web_attack_remediation
debug: true
filters:
- Alert.Remediation == true && Alert.GetScope() == "Ip" && (Alert.GetScenario() contains "http" || Alert.GetScenario() contains "nginx" || Alert.GetScenario() contains "apache")
decisions:
- type: ban
duration: 12h
on_success: break
Configuración de Scenarios Personalizados
# Crear scenario personalizado para SSH en puerto 1422
sudo mkdir -p /etc/crowdsec/scenarios/
sudo nano /etc/crowdsec/scenarios/ssh-1422-bruteforce.yaml
# Scenario personalizado para SSH puerto 1422
type: leaky
name: crowdsecurity/ssh-1422-bruteforce
description: "Detect SSH bruteforce on port 1422"
filter: "evt.Meta.log_type == 'ssh_failed_auth' && evt.Meta.ssh_port == '1422'"
leakspeed: "10s"
capacity: 5
groupby: "evt.Meta.source_ip"
distinct: "evt.Meta.source_ip"
debug: false
labels:
service: ssh
type: bruteforce
remediation: true
Configuración de Whitelist
# Crear whitelist para IPs confiables
sudo nano /etc/crowdsec/parsers/s02-enrich/whitelist.yaml
# Whitelist de IPs confiables
name: crowdsecurity/whitelists
description: "Whitelist for trusted IPs"
whitelist:
reason: "trusted IP ranges"
ip:
- "127.0.0.1"
- "::1"
- "192.168.1.0/24" # Red local
- "10.0.0.0/8" # Red privada
- "172.16.0.0/12" # Red privada
cidr:
- "192.168.0.0/16"
- "10.0.0.0/8"
Monitoreo y Alertas
Comandos de Monitoreo
# Ver métricas en tiempo real
sudo cscli metrics
# Ver decisiones activas
sudo cscli decisions list
# Ver alertas recientes
sudo cscli alerts list
# Ver estado de bouncers
sudo cscli bouncers list
# Ver estado de máquinas
sudo cscli machines list
Configuración de Notificaciones
# Instalar plugin de notificaciones
sudo cscli notifications install crowdsecurity/slack
sudo cscli notifications install crowdsecurity/email
# Configurar notificaciones
sudo nano /etc/crowdsec/notifications/slack.yaml
# Configuración de notificaciones Slack
type: slack
name: slack_default
log_level: info
format: |
{{range . -}}
:warning: **CrowdSec Alert**
**IP:** {{.Source.IP}}
**Scenario:** {{.Scenario}}
**Message:** {{.Message}}
**Country:** {{.Source.Cn}}
**AS:** {{.Source.AsName}}
{{end -}}
url: YOUR_SLACK_WEBHOOK_URL_HERE
Dashboard Web (Opcional)
# Instalar Metabase para dashboard
sudo cscli dashboard setup
# Configurar acceso al dashboard
sudo cscli dashboard start
# El dashboard estará disponible en http://localhost:3000
Mantenimiento y Actualizaciones
Actualizaciones Automáticas
# Actualizar CrowdSec y collections
sudo cscli hub update
sudo cscli hub upgrade
# Actualizar el sistema
sudo apt update && sudo apt upgrade crowdsec crowdsec-firewall-bouncer-nftables
Limpieza de Base de Datos
# Limpiar decisiones expiradas
sudo cscli decisions delete --all
# Limpiar alertas antiguas (más de 30 días)
sudo cscli alerts delete --all --older-than 30d
# Optimizar base de datos
sudo sqlite3 /var/lib/crowdsec/data/crowdsec.db "VACUUM;"
Backup y Restauración
# Crear backup de configuración
sudo tar -czf /root/crowdsec-backup-$(date +%Y%m%d).tar.gz
/etc/crowdsec/
/var/lib/crowdsec/data/crowdsec.db
# Script de backup automatizado
sudo nano /root/crowdsec-backup.sh
#!/bin/bash
# Script de backup automatizado para CrowdSec
BACKUP_DIR="/root/backups/crowdsec"
DATE=$(date +%Y%m%d_%H%M%S)
# Crear directorio de backup
mkdir -p $BACKUP_DIR
# Backup de configuración
tar -czf $BACKUP_DIR/crowdsec-config-$DATE.tar.gz /etc/crowdsec/
# Backup de base de datos
cp /var/lib/crowdsec/data/crowdsec.db $BACKUP_DIR/crowdsec-db-$DATE.db
# Limpiar backups antiguos (más de 30 días)
find $BACKUP_DIR -name "crowdsec-*" -mtime +30 -delete
echo "Backup completado: $BACKUP_DIR/crowdsec-*-$DATE.*"
# Hacer ejecutable y programar
sudo chmod +x /root/crowdsec-backup.sh
# Añadir a crontab para backup diario
echo "0 2 * * * /root/crowdsec-backup.sh" | sudo crontab -
Solución de Problemas
Problemas Comunes
- CrowdSec no detecta logs: Verificar permisos y rutas en acquis.yaml
- Bouncer no bloquea IPs: Verificar API key y configuración nftables
- Falsos positivos: Ajustar scenarios o añadir a whitelist
- Alto uso de CPU: Reducir parser_routines o optimizar scenarios
Comandos de Diagnóstico
# Verificar estado de servicios
sudo systemctl status crowdsec
sudo systemctl status crowdsec-firewall-bouncer
# Verificar logs de CrowdSec
sudo tail -f /var/log/crowdsec.log
# Verificar logs del bouncer
sudo tail -f /var/log/crowdsec-firewall-bouncer.log
# Verificar configuración
sudo cscli config show
# Test de conectividad API
sudo cscli lapi status
# Verificar parsers activos
sudo cscli parsers list
# Verificar scenarios activos
sudo cscli scenarios list
Comandos de Emergencia
# Desbloquear IP específica
sudo cscli decisions delete --ip 192.168.1.100
# Desbloquear todas las IPs
sudo cscli decisions delete --all
# Reiniciar CrowdSec en modo debug
sudo systemctl stop crowdsec
sudo crowdsec -c /etc/crowdsec/config.yaml -debug
# Modo simulación (no bloquea)
sudo cscli simulation enable crowdsecurity/ssh-bruteforce
Comandos de Referencia Rápida
| Acción | Comando |
|---|---|
| Ver decisiones activas | sudo cscli decisions list |
| Ver alertas recientes | sudo cscli alerts list |
| Ver métricas | sudo cscli metrics |
| Actualizar hub | sudo cscli hub update |
| Estado de bouncers | sudo cscli bouncers list |
| Desbloquear IP | sudo cscli decisions delete --ip IP |
| Ver logs en tiempo real | sudo tail -f /var/log/crowdsec.log |
| Reiniciar servicios | sudo systemctl restart crowdsec |
Mejores Prácticas
- Monitoreo Regular: Revisar métricas y alertas diariamente
- Actualizaciones: Mantener CrowdSec y collections actualizados
- Backup: Realizar backups regulares de configuración
- Whitelist: Mantener actualizada la lista de IPs confiables
- Logs: Rotar y archivar logs regularmente
- Testing: Probar configuraciones en entorno de desarrollo
- Documentación: Documentar cambios y configuraciones personalizadas
Conclusión: CrowdSec proporciona una capa adicional de seguridad robusta para servidores web, complementando perfectamente las soluciones tradicionales como fail2ban. Su enfoque colaborativo y capacidades de machine learning lo convierten en una herramienta esencial para la protección moderna de infraestructuras web. La integración con nftables y la configuración en puerto SSH 1422 aseguran una protección completa y compatible con entornos de producción.
