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


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


Resumen breve


Notas personales


Referencias

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


Requisitos previos


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


Resumen breve


Notas personales


Enlaces de interés

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


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:

http.yaml de ejemplo en Gitea

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

  1. Verifica la configuración:
sudo crowdsec -t
  1. Prueba manualmente la notificación:
sudo cscli notifications test http_default
  1. 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


Resumen breve


Enlaces de interés

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


Requisitos previos


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:

  1. Visita el repositorio donde se encuentra definida: Directiva log_skip en Gitea
  2. Impórtala en los sitios donde se desee reducir el ruido.
  3. 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_skip no 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


Enlaces de interés