Cuando publicas un servidor en internet, los intentos de acceso no tardan en llegar. Bots que prueban contraseñas por SSH, escáneres buscando rutas comunes en aplicaciones web, crawlers agresivos y tráfico automatizado pueden aparecer incluso antes de que tu proyecto esté terminado.
Un firewall básico ayuda a limitar puertos, pero no siempre alcanza. También necesitas detectar patrones de ataque y bloquear IPs que ya demostraron comportamiento malicioso. Para eso puedes usar CrowdSec, una herramienta open source que analiza logs, detecta ataques y aplica decisiones de bloqueo mediante componentes llamados bouncers.
¿Qué es CrowdSec?
CrowdSec es un motor de seguridad que analiza logs de servicios como SSH, Nginx, Apache, Traefik, WordPress, Docker y otros componentes comunes de infraestructura.
Su funcionamiento se divide en dos partes:
- El motor de detección lee logs y aplica escenarios de seguridad.
- El componente de remediación, o bouncer, ejecuta acciones como bloquear una IP en el firewall.
Esto es importante: CrowdSec por sí solo detecta, pero no bloquea tráfico hasta que instalas un bouncer.
En un servidor Ubuntu típico, CrowdSec puede ayudarte a detectar ataques de fuerza bruta por SSH, escaneos contra Nginx, intentos de abuso HTTP y patrones conocidos de comportamiento sospechoso.
¿Cuándo conviene usarlo?
CrowdSec es útil si administras:
- Un Cloud Server con SSH expuesto a internet.
- Una API detrás de Nginx.
- Un sitio web con tráfico público.
- Un proxy reverso para varias aplicaciones.
- Un servidor donde quieres sumar defensa activa sin montar una plataforma SIEM compleja.
No reemplaza buenas prácticas como usar claves SSH, actualizar paquetes, configurar un firewall o aplicar HTTPS. Funciona mejor como una capa adicional dentro de una estrategia de hardening.
Requisitos previos
Para seguir esta guía necesitas:
- Un Cloud Server con Ubuntu 22.04 o Ubuntu 24.04.
- Acceso por SSH con un usuario con permisos
sudo. - Nginx instalado si quieres proteger tráfico web.
- Puertos necesarios abiertos según tu caso:
22/TCPo tu puerto SSH personalizado.80/TCPpara HTTP.443/TCPpara HTTPS.
- Acceso a la consola para instalar paquetes y revisar servicios.
Antes de avanzar, asegúrate de tener una sesión SSH activa y funcional. Si vas a modificar reglas de firewall, conserva una segunda sesión abierta para evitar quedarte fuera del servidor.
Paso 1: Preparar el servidor
Actualiza el índice de paquetes y aplica actualizaciones disponibles:
sudo apt update
sudo apt upgrade -y
Instala herramientas básicas que pueden ser necesarias para agregar repositorios y descargar claves:
Verifica que el servidor tenga logs disponibles para SSH y Nginx:
sudo ls -lh /var/log/auth.log
sudo ls -lh /var/log/nginx/
Paso 2: Instalar CrowdSec
La documentación oficial recomienda usar el repositorio estable de CrowdSec para instalar versiones actualizadas.
Agrega el repositorio:
curl -s https://install.crowdsec.net | sudo shActualiza APT:
sudo apt updateAntes de instalar, revisa qué versión candidata ofrece el sistema:
apt-cache policy crowdsecCrowdSec advierte que debes evitar instalar versiones antiguas, especialmente si el candidato mostrado es 1.4.6 o inferior. Si ves una versión vieja, revisa la prioridad del repositorio antes de seguir.
Instala el motor de CrowdSec:
sudo apt install -y crowdsecComprueba que el servicio esté activo:
sudo systemctl status crowdsecTambién puedes verificar la versión instalada:
sudo cscli versionPaso 3: Activar colecciones para SSH y Nginx
CrowdSec usa colecciones para agrupar parsers y escenarios de detección. Para un servidor con SSH y Nginx, instala las colecciones correspondientes:
sudo cscli collections install crowdsecurity/sshdsudo cscli collections install crowdsecurity/nginxRecarga CrowdSec para aplicar los cambios:
sudo systemctl reload crowdsecLista las colecciones instaladas:
sudo cscli collections listDeberías ver entradas relacionadas con crowdsecurity/sshd y crowdsecurity/nginx.
Paso 4: Verificar adquisición de logs
CrowdSec intenta detectar servicios y logs automáticamente, pero conviene validarlo.
Revisa la configuración de adquisición:
sudo cat /etc/crowdsec/acquis.yamlsudo ls -lh /etc/crowdsec/acquis.d/Si Nginx no fue detectado, puedes crear un archivo específico:
sudo nano /etc/crowdsec/acquis.d/nginx.yamlAgrega esta configuración:
filenames: - /var/log/nginx/access.log - /var/log/nginx/error.loglabels: type: nginxSi SSH no fue detectado, puedes crear:
sudo nano /etc/crowdsec/acquis.d/sshd.yamlCon este contenido:
filenames: - /var/log/auth.loglabels: type: syslogDespués reinicia CrowdSec:
sudo systemctl restart crowdsecRevisa métricas:
sudo cscli metricsBusca líneas leídas y parseadas para SSH o Nginx. Si aparecen líneas leídas pero no parseadas, revisa la ruta del log y el tipo asignado en labels.
Paso 5: Instalar el bouncer de firewall
Hasta este punto, CrowdSec detecta eventos. Para bloquear IPs necesitas un componente de remediación.
Primero revisa si tu sistema usa iptables con backend nf_tables:
iptables -VSi la salida menciona nf_tables, instala el bouncer para nftables:
sudo apt install -y crowdsec-firewall-bouncer-nftablesSi tu sistema usa iptables clásico, instala:
sudo apt install -y crowdsec-firewall-bouncer-iptablesHabilita e inicia el servicio si no quedó activo automáticamente:
sudo systemctl enable --now crowdsec-firewall-bouncerVerifica el estado:
sudo systemctl status crowdsec-firewall-bouncerEste bouncer es especialmente útil para proteger servicios de infraestructura como SSH. Para aplicaciones web, CrowdSec también ofrece un bouncer específico para Nginx con capacidades orientadas a tráfico HTTP. En servidores productivos, conviene probar ese componente primero en staging porque modifica la integración con Nginx.
Paso 6: Probar que CrowdSec funciona
Puedes revisar alertas generadas con:
sudo cscli alerts listTambién puedes ver decisiones activas:
sudo cscli decisions listPara validar que el bouncer está conectado:
sudo cscli bouncers listY para revisar métricas generales:
sudo cscli metricsNo fuerces pruebas agresivas contra tu propio servidor sin cuidado. Si necesitas simular eventos, hazlo desde una IP controlada y asegúrate de poder remover una decisión de bloqueo.
Para eliminar una decisión manualmente, usa:
sudo cscli decisions delete --ip IP_A_DESBLOQUEARReemplaza IP_A_DESBLOQUEAR por la IP real.
Paso 7: Reforzar seguridad
CrowdSec suma una capa útil, pero no debe ser tu única defensa. Aplica estas medidas:
Usa claves SSH
Deshabilita el acceso por contraseña cuando ya tengas claves configuradas y verificadas:
sudo nano /etc/ssh/sshd_configAjusta o confirma:
PasswordAuthentication noPermitRootLogin noAntes de reiniciar SSH, abre otra terminal y verifica que puedes entrar con tu clave.
Luego recarga el servicio:
sudo systemctl reload sshLimita puertos expuestos
En el panel de firewall de tu Cloud Server o con una herramienta local como UFW, permite solo los puertos necesarios:
sudo ufw allow OpenSSHsudo ufw allow 'Nginx Full'sudo ufw enablesudo ufw statusSi usas el firewall del panel de DonWeb Cloud, evita duplicar reglas contradictorias con UFW. Elige un enfoque principal y documenta dónde se administran las reglas.
Mantén colecciones actualizadas
Actualiza el hub de CrowdSec periódicamente:
sudo cscli hub updatesudo cscli hub upgradesudo systemctl reload crowdsecTambién mantén el sistema operativo actualizado:
sudo apt updatesudo apt upgrade -yNo abras la API local de CrowdSec a internet
La API local de CrowdSec debe quedar accesible solo para los componentes que la necesitan. No expongas puertos internos de CrowdSec públicamente salvo que tengas una arquitectura distribuida y sepas cómo protegerla con autenticación y red privada.
Problemas frecuentes que debes tener en cuenta
CrowdSec detecta, pero no bloquea
Verifica que instalaste un bouncer:
sudo cscli bouncers listsudo systemctl status crowdsec-firewall-bouncerRecuerda que el motor de CrowdSec no bloquea por sí solo.
No aparecen métricas de Nginx
Revisa que los logs existan:
sudo ls -lh /var/log/nginx/Luego revisa la adquisición:
sudo cat /etc/crowdsec/acquis.d/nginx.yamlSi Nginx está en Docker, los logs pueden estar en otra ruta o salir por stdout. En ese caso debes adaptar la adquisición al método real de logging.
Me bloqueé a mí mismo
Desde otra sesión o consola de recuperación, elimina la decisión:
sudo cscli decisions listsudo cscli decisions delete --ip TU_IPDespués revisa qué escenario generó el bloqueo antes de seguir probando.
El paquete instalado parece viejo
Revisa la prioridad del repositorio:
apt-cache policy crowdsecLa documentación oficial recomienda verificar que no estés instalando una versión obsoleta desde repositorios de la distribución cuando el repositorio de CrowdSec debería tener prioridad.