Saltar al contenido

CyberSkills – Tutoriales de Seguridad y Servidores

CrowdSec: Proteja su Red de Servidores Web – Instalación y Configuración

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?

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ísticaCrowdSecfail2ban
InteligenciaColaborativa y en tiempo realLocal y estática
DetecciónMachine Learning + ReglasSolo expresiones regulares
ActualizacionesAutomáticas desde la comunidadManuales
EscalabilidadMulti-servidor nativoLimitado a un servidor
APIRESTful completaNo disponible
DashboardsWeb UI incluidoSolo 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ónComando
Ver decisiones activassudo cscli decisions list
Ver alertas recientessudo cscli alerts list
Ver métricassudo cscli metrics
Actualizar hubsudo cscli hub update
Estado de bouncerssudo cscli bouncers list
Desbloquear IPsudo cscli decisions delete --ip IP
Ver logs en tiempo realsudo tail -f /var/log/crowdsec.log
Reiniciar serviciossudo 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.

Únete a la conversación

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *