Crowdsec
- Forzar instalación de CrowdSec 1.6.x en Ubuntu (saltando la versión antigua)
- Lectura de logs de Caddy con CrowdSec
- Recibir alertas de Crowdsec en Telegram
- Reducir el tamaño de los logs de Caddy con log_skip para Crowdsec
Forzar instalación de CrowdSec 1.6.x en Ubuntu (saltando la versión antigua)
Introducción
CrowdSec ofrece un script de instalación automática para sistemas Linux, pero por defecto instala una versión antigua (1.4.6 en el momento de escribir esto). Este apunte documenta cómo forzar la instalación de la última versión estable (1.6.11) usando el propio repositorio oficial y una pinning policy para evitar que APT use los paquetes de Ubuntu. El script oficial de instalación funciona correctamente, pero al no modificar las prioridades de APT, termina instalando una versión antigua desde los repos de Ubuntu.
Requisitos previos
- Ubuntu 22.04 o 24.04
- Acceso root o
sudo - Tener instalado
curlyaptconfigurado correctamente
Instalación paso a paso
1. Ejecutar el script oficial
Esto añade el repositorio de packagecloud.io a tu sistema:
curl -s https://install.crowdsec.net | sudo sh
2. Comprobar las versiones disponibles
apt list -a crowdsec
apt-cache policy crowdsec
Esto mostrará todas las versiones accesibles y su prioridad.
3. Eliminar versiones anteriores (si existieran)
sudo systemctl stop crowdsec
sudo apt purge crowdsec crowdsec-firewall-bouncer-iptables -y
sudo apt clean && sudo apt update
4. Forzar APT a usar la versión del repo de CrowdSec
Crear archivo de preferencias:
sudo nano /etc/apt/preferences.d/crowdsec
Y añadir:
Package: crowdsec
Pin: origin "packagecloud.io"
Pin-Priority: 1001
Esto le dice a APT que si hay una versión de packagecloud.io, la instale aunque haya otra con más prioridad.
5. Instalar CrowdSec
sudo apt update
sudo apt install crowdsec
6. Verificar que se ha instalado la versión correcta
apt-cache policy crowdsec
El Candidate debe ser la versión 1.6.x
Errores comunes o decisiones importantes
- El script oficial no falla, pero sin el pinning instala una versión antigüa.
- Hay que purgar el paquete si se ha instalado previamente desde los repos de Ubuntu.
Pin-Priority: 1001es lo que fuerza el cambio.- Recuerda que Pin-Priority: 1001 solo tiene sentido si el origen coincide exactamente con el origin que marca apt-cache policy.
Resumen breve
- El script de CrowdSec instala el repo, pero no cambia prioridades.
- APT usará por defecto la versión antigua de Ubuntu.
- El pinning manual permite forzar la instalación de la versión más reciente.
Notas personales
- No hace falta modificar sources.list: todo se resuelve con pinning.
Referencias
- Instalación oficial de CrowdSec
- Lectura de logs de Caddy con CrowdSec
- Reducir el tamaño de los logs de Caddy con log_skip para Crowdsec
Lectura de logs de Caddy con CrowdSec
Este apunte documenta la integración de logs generados por Caddy en formato JSON para que CrowdSec pueda analizarlos y actuar en consecuencia.
Características
- Detecta patrones maliciosos en los accesos a nuestros dominios.
- Permite decisiones automáticas (baneo temporal, alerta, etc.).
- Compatible con la consola web de CrowdSec.
Requisitos previos
- CrowdSec ya debe estar instalado y enrolado en la consola.
- Tener Caddy instalado y configurado.
- Tener instalado crowdsec-firewall-bouncer.
Protección activa con IPTables
Para que CrowdSec no solo detecte, sino también bloquee activamente intentos de escaneo o accesos maliciosos, es necesario instalar un bouncer de firewall.
En sistemas basados en IPTables:
sudo apt install crowdsec-firewall-bouncer-iptables
Una vez instalado, comenzará a aplicar baneos automáticamente en función de las decisiones que tome CrowdSec. Esto incluye escaneos de puertos, rutas forzadas, comportamientos anómalos, etc.
Configuración de CrowdSec
Actualizar e instalar el parser necesario:
sudo cscli parsers upgrade --all
sudo cscli parsers install crowdsecurity/caddy-logs
sudo systemctl reload crowdsec
Configuración de Caddy
Opcion global en el Caddyfile
Define un log global en formato JSON:
{
log {
output file /var/log/caddy/crowdsec.json {
roll_size 512mb
roll_keep 10
roll_keep_for 240h
}
format json
level INFO
}
}
Directiva reutilizable para logs por sitio
(log_json_global) {
log {
output file /var/log/caddy/crowdsec-global.json
format json
level INFO
}
}
Luego, en cada sitio:
midominio.com {
import log_json_global
...
}
Configurar acquis.yaml en CrowdSec
Indicar el archivo de logs que se va a parsear:
---
filenames:
- /var/log/caddy/crowdsec.json
labels:
type: caddy
Si usas otro nombre o ruta, adáptalo aquí.
Aplicar cambios:
sudo systemctl restart crowdsec
sudo systemctl restart caddy
Verificación
Pasados unos minutos, confirmar que CrowdSec está leyendo el log:
sudo cscli metrics
Deberías ver líneas relacionadas con /var/log/caddy/crowdsec.json. Si no aparecen, revisa permisos o formato del log.
Errores comunes o decisiones importantes
- En versiones antiguas de CrowdSec (como la 1.4.6), este parser no funcionaba bien.
- La versión 1.6.11 ya lo interpreta sin problemas.
- Puede tardar bastante en detectar comportamientos anómalos (a veces horas).
Resumen breve
- Instalar parser
crowdsecurity/caddy-logs. - Configurar logs en JSON desde Caddy.
- Añadir el log a
acquis.yaml. - Verificar con
cscli metricsque se está leyendo. - Revisar la consola de CrowdSec para ver decisiones aplicadas.
Notas personales
- En mi caso, tardó un par de horas en empezar a detectar cosas tras configurar todo, detectó actividad maliciosa desde IPs de Censys y aplicó baneo temporal.
- Esta configuración es especialmente útil si usas Caddy como proxy público y quieres respuestas automáticas ante escaneos o comportamientos raros.
- Dependiendo del dominio y el tráfico que reciba, puede generarse mucho ruido en los logs y hacer crecer el archivo rápidamente. Para eso se puede usar la directiva
log_skipde Caddy para evitar registrar rutas que no aporten nada (como/favicon.ico,/robots.txt, assets estáticos, etc). Se realizará otro artículo para explicar bien cómo usarlog_skipde forma eficiente, y cuando esté listo se enlazará desde aquí. - La opción global del
Caddyfilepara el log, la directiva reutilizable para logs por sitio y también la directiva para evitar ruido mediantelog_skipestán disponibles en mi Gitea: Caddyfile en Gitea. Como se ha comentado, también se creará un artículo sobre esto y se enlazará en esta mismo artículo ( ya disponible ).
Enlaces de interés
- Forzar instalación de CrowdSec 1.6.x en Ubuntu saltando la versión antigua
- Reducir el tamaño de los logs de Caddy con log_skip para Crowdsec
- Información sobre caddy-logs
- Firewall Bouncer oficial de CrowdSec (iptables)
Recibir alertas de Crowdsec en Telegram
Este apunte documenta cómo enviar notificaciones automáticas por Telegram cuando CrowdSec bloquea una IP, usando el plugin http de notificaciones.
Es altamente recomendable tener previamente configurada la integración de logs de Caddy con CrowdSec:
Lectura de logs de Caddy con CrowdSec
Requisitos previos
- Tener CrowdSec instalado y funcionando correctamente.
- Haber registrado la instancia en la consola de CrowdSec (opcional, pero recomendable).
- Tener ya bloqueos activos o simulables para hacer pruebas.
- Se asume que tenemos un bot de Telegram ya creado y listo.
Activar permisos para el plugin HTTP
Edita el archivo /etc/crowdsec/config.yaml de CrowdSec. Aquí es donde CrowdSec define los usuarios y permisos bajo los que se ejecutan los distintos plugins, incluyendo el de notificaciones. Si los permisos son demasiado restrictivos (como es el caso por defecto), algunos plugins no podrán escribir en disco ni acceder a los sockets necesarios para operar correctamente. Este es un fallo habitual que puede bloquear la funcionalidad de alertas, especialmente en entornos donde se espera que el plugin HTTP se comunique con servicios externos como Telegram.
plugin_config:
user: root
group: root
Por defecto viene como nobody, pero eso genera errores de permisos al validar la config del plugin HTTP.
Configurar el plugin HTTP para Telegram
Edita o crea el archivo /etc/crowdsec/notifications/http.yaml. Si quieres usar una plantilla con formato limpio para Telegram, puedes partir de la siguiente:
Este archivo incluye el formato del mensaje y los datos necesarios para enviarlo (token, chat_id, etc.).
Activar la notificación en profiles.yaml
Edita /etc/crowdsec/profiles.yaml y asegúrate de habilitar la notificación en ambos perfiles (default_ip_remediation y default_range_remediation).
Busca y modifica esta sección:
notifications:
- http_default
Asegúrate de que coincida con el nombre definido en el http.yaml. Si has cambiado el nombre por otro, usa ese.
Validar y probar que todo funciona
- Verifica la configuración:
sudo crowdsec -t
- Prueba manualmente la notificación:
sudo cscli notifications test http_default
- Si todo está correcto, deberías recibir el mensaje en tu bot, canal o grupo de Telegram.
Comprobarlo con un ataque real
Puedes simular un ataque desde otro dispositivo (por ejemplo con Termux + VPN y dirb) para generar un baneo real. En cuanto se active el baneo, deberías recibir la alerta en Telegram con un formato como este:
🚨 CrowdSec Alert
🌐 IP: 66.232.126.83
🏳️ País: US
🏢 ISP: AS29802 - HVC-AS
🧠 Motivo: crowdsecurity/http-probing
🕰️ Duración: 4h
📅 Hora: 2025-07-25T20:03:05Z
📍 Host: TuEquipo
🗞 Máquina: TuMaquina
🔗 CrowdSec CTI (https://app.crowdsec.net/cti/66.232.126.83)
Errores comunes o decisiones importantes
- Permisos insuficientes: si dejas
nobody, el plugin HTTP no podrá ejecutarse. - Nombre del perfil mal escrito: el nombre
http_defaultdebe coincidir enhttp.yamlyprofiles.yaml. - Validar siempre con
crowdsec -tantes de probar con ataques reales.
Resumen breve
- Cambiar
nobodyporrootenconfig.yaml. - Configurar
/etc/crowdsec/notifications/http.yamlpara Telegram. - Activar
http_defaulten ambos perfiles deprofiles.yaml. - Validar con
sudo crowdsec -ty testear concscli notifications test. - Probar con un ataque real para verificar que todo llega correctamente.
Enlaces de interés
-
Forzar instalación de CrowdSec 1.6.x en Ubuntu saltando la versión antigua
-
Reducir el tamaño de los logs de Caddy con log_skip para CrowdSec
Reducir el tamaño de los logs de Caddy con log_skip para Crowdsec
Este apunte sirve para analizar el log de Caddy y reducir su tamaño omitiendo rutas que generan mucho ruido pero no aportan valor en el análisis de seguridad con CrowdSec.
Características
- Analiza el log de Caddy en formato JSON.
- Identifica las rutas con mayor frecuencia de acceso.
- Permite decidir qué rutas ignorar en el log usando
log_skip.
Requisitos previos
- Tener configurado Caddy para generar logs en formato JSON.
- Haber integrado CrowdSec con Caddy (ver artículo anterior).
- Acceso al archivo
/var/log/caddy/crowdsec.jsono equivalente.
Identificar rutas ruidosas
Se puede usar el siguiente script en Python para encontrar las URIs más repetidas:
import json
from collections import Counter
archivo = "/var/log/caddy/crowdsec.json"
uris = []
with open(archivo) as f:
for linea in f:
try:
entrada = json.loads(linea)
uri = entrada["request"]["uri"].split("?")[0]
uris.append(uri)
except Exception:
continue
# Mostrar los 20 URI más frecuentes
for uri, count in Counter(uris).most_common(20):
print(f"{count:>5} - {uri}")
Esto permite saber qué endpoints consumen más espacio en el log. Algunos ejemplos comunes (anonimizados) podrían ser:
7180 - /
2731 - /api/sync
1126 - /remote.php/dav/files/usuario/
554 - /login
392 - /manifest.json
200 - /favicon.ico
Aplicar log_skip en Caddy
Una vez identificadas las rutas que solo generan ruido, se puede usar la directiva log_skip en el Caddyfile. Esta directiva se encarga de evitar que esas rutas se escriban en el log, aunque se sigan sirviendo normalmente.
Para usarla:
- Visita el repositorio donde se encuentra definida:
Directiva
log_skipen Gitea - Impórtala en los sitios donde se desee reducir el ruido.
- Reinicia Caddy:
sudo systemctl restart caddy
Orden de los imports: clave para que funcione
Primero se debe importar el snippet que configura el logger (log_json_global), y luego el que contiene los filtros con log_skip (log_ignore_ruido_common).
Si lo haces al revés, puede que
log_skipno tenga ningún logger al que aplicarse. Eso significa que o no se ignora nada, o se ignora en el logger por defecto (stdout). Y eso lleva a confusión o a falsos positivos al revisar los logs.
En resumen:
| Orden | ¿Qué hace? |
|---|---|
import log_json_global |
Declara el logger personalizado con formato, ruta, etc. |
import log_ignore_ruido_common |
Añade excepciones (rutas ignoradas) a ese logger ya activo. |
Mantener ese orden asegura que el log_skip actúa sobre el logger correcto.
Verificación del efecto
Puedes comprobar el tamaño de los logs con:
ls -lh /var/log/caddy/
En pruebas reales, el uso de esta directiva ha reducido de 70 MB en dos horas a 30 MB en casi 10 horas. La diferencia es muy considerable, sobre todo si se trata de evitar escrituras innecesarias en disco.
Resumen breve
- Usa un script para encontrar las rutas más frecuentes.
- Define una directiva
log_skipcon esas rutas. - Aplícala a tus sitios en Caddy usando
import. - Borrar o rotar los logs actuales para comprobar bien la reducción.
- Reinicia Caddy y verifica el efecto.