Tal como indique en este articulo, lo unico que me faltaba por añadir a traefik para tener mi VPS lo más seguro posible era crowdsec y por fin, ya lo tengo instalado.

Antes de lanzarte a la piscina directamente, te aconsejo que les eches un vistazo a este articulo de atareao donde habla de crowdsec y tambien a este video, que me ha servido como guia en todo el proceso.

Si sigues leyendo este articulo, es que ya has revisado los articulos y el video que te he aconsejado antes, asi que ya podemos empezar. Para empezar, partimos de la configuración inicial que tengo en traefik y que podeis ver en los diferentes articulos, podemos empezar con la instalación de crowdsec.

Lo primero y antes de nada, hice una pequeña modificación a la configuración de traefik para asi tener mejor identificado el volumen que esta utilizando. Ahora mismo, el docker-compose donde tengo traefik lo tengo de la siguiente manera:

 traefik:
   volumes:
     - traefik_log:/var/log/traefik

volumes:
  traefik_log:
    name: traefik_log

De esta manera, tal como comento, tengo mejor identificado el volumen de traefik.

Después de esto ya podemos pasar a la instalación de crowdsec. Tengo que informar antes de empezar, que la instalación se divide en varias fases y que hay que ir, con un poco de cuidado, porque sino…

La primera de ellas es la creación de los directorios y archivos que nos haran falta para el correcto funcionamiento de crowdsec y bouncer-traefik.

Lo primero es crear el directorio crowdsec. Yo lo tengo en el mismo directorio donde tengo la configuración de traefik quedando de la siguiente manera:

|-- config
|---- traefik
|---- crowdsec
|------ acquis
|-------- ssh.yaml
|------ acquis.yml
|------ mywhitelist.yml

Donde tendremos:

acquis/ssh.yaml

Que es el encargado de controlar las conexiones ssh a nuestro servidor y asi, hacemos que crowdsec tambien las controle (ya explicaremos como).

filenames:
   - /logs/auth.log
   - /logs/syslog
labels:
    type: syslog

acquis.yml

Los ficheros log de traefik, tanto el access.log como el traefik.log.

filenames:
  - /var/log/traefik/*
labels:
  type: traefik

Y por ultimo

mywhitelist.yml

name: crowdsecurity/whitelists
description: "Whitelist events from my ip addresses"
whitelist:
  reason: "my ip ranges"
  ip:
    - "XXX.XXX.XXX.XXX"

Que es el fichero donde indicaremos a crowdsec las IP que son de confianza. Yo he puesto, la ip desde la que siempre me conecto al VPS para que asi no la tenga encuenta, aunque más adelante haremos una prueba para ver el funcionamiento de crowdsec con respecto a esta IP.

⚠️ Antes de nada, informar que en el fichero de docker-compose.yml donde tengo traefik tambien tengo la configuración de crowdsec, porque me ha resultado más facil, si lo haces con diferentes ficheros yml hay que tener un par de cosas en cuenta que ya os informare llegado el momento.

Una vez que tenemos esto claro, empezamos añadiendo a nuestro fichero de docker-compose.yml lo necesario para crowdsec:

#
# CROWDSEC - SEGURETAT PER A TRAEFIK I EL SERVIDOR
#
 crowdsec:
   image: crowdsecurity/crowdsec:v1.6.2
   container_name: crowdsec
   restart: unless-stopped
   networks:
     - proxy
   init: true
   environment:
     GID: "${GID-1000}"
     COLLECTIONS: "crowdsecurity/linux crowdsecurity/traefik crowdsecurity/sshd"
   volumes:
     - ${HOME}/config/crowdsec/acquis.yml:/etc/crowdsec/acquis.yaml
     - ${HOME}/config/crowdsec/mywhitelists.yml:/etc/crowdsec/parsers/s02-enrich/mywhitelists.yaml
     - ${HOME}/config/crowdsec/acquis/:/etc/crowdsec/acquis.d/
     - crowdsec-db:/var/lib/crowdsec/data/
     - crowdsec-config:/etc/crowdsec/
     - traefik_log:/var/log/traefik/:ro
     - /var/log/auth.log:/logs/auth.log:ro
     - /var/log/syslog.log:/logs/syslog.log:ro
   depends_on:
     - traefik

En la configuración hay que tener en cuenta un par de cosas:

  • depedens_on: Aqui le indicamos a crowdsec que no puede iniciarse sino esta antes traefik en funcionamiento. Es como una medida de seguridad.
  • COLLECTIONS: "crowdsecurity/linux crowdsecurity/traefik crowdsecurity/sshd"
    • Yo lo entiendo, como las alertas o lo que tiene que tener en cuentra crowdsec para luego tomar las acciones necesarias. Hay muchas más opciones que puedes ir añadiendo. Las puedes encontrar aqui. En mi caso he puesto:
      • crowdsecurity/linux para los posibles bugs que pueda tener Linux
      • crowdsecurity/traefik para los posibles bugs de traefik
      • crowdsecurity/sshd para los posibles bugs de ssh
  • networks tanto traefik, crowdsec y bounces-traefik, que lo explicare más adelante, tienen que estar en la misma red para que se puedan comunicar entre ellos.
  • Tambien tenemos que tener en cuenta los volumenes que vamos a usar en crowdsec, que en este caso son los que pongo a continuación:
     volumes:
      crowdsec-db:
        name: crowdsec-db
      crowdsec-config:
        name: crowdsec-config
      traefik_log:
        name: traefik_log
    

    ⚠️ Si os fijais, he puesto el mismo nombre de volumen para los logs que tengo en traefik a crowdsec porque comparten el mismo fichero de docker-compose.yml, pero aqui hay que tener una cosa en cuenta, en caso de que lo tengas en ficheros / stacks diferentes tienes que añadir, en el caso de los logs de crowdsec que afectan a traefik, la opción external: true porque indicas que los logs estan en otro docker-compose, si se puede decir asi, quedando de la siguiente manera:

 volumes:
    crowdsec-db:
      name: crowdsec-db
    crowdsec-config:
      name: crowdsec-config
    traefik_log:
      name: traefik_log
      external: true

Una vez que tenemos esto, ya podemos activar la primera fase de crowdsec:

usuari@debian:~$docker compose up -d crowdsec

Despues de esto, podemos revisar los logs de crowdsec para ver si de momento vamos por buen camino y tambien podemos verificar si traefik aun esta vivo.

usuari@debian:~$docker logs -f crowdsec

⚠️ Si has llegado hasta aqui, el unico fallo que puedes tener es que los logs de traefik no esten accesibles a crowdsec, para eso fijate bien en como montas los volumenes.

Otra pruebas que puedes hacer es acceder a crowdsec y ver si tienes acceso directo a los ficheros de la siguiente manera:

usuari@debian:~$docker exec -it crowdsec sh
crowdsec:~ cd /var/log/

Si llegado a este punto, no ves el directorio de traefik es que el error lo tienes en los volumenes. Aqui te tocara investigar un poco 😀 pero en cambio si ves el log de crowdsec puedes seguir adelanta con el siguiente paso.

El siguiente paso, es actualizar el sistema de alertas o bugs que tiene que controlar crowdsec. Para hacer esto, se hace de la siguiente manera:

usuari@debian:~$docker exec crowdsec cscli hub update

Y por ultimo, es aplicar estas actualizaciones a la base de datos de crowdsec a traves de:

usuari@debian:~$docker exec crowdsec cscli hub upgrade

Lo que podemos hacer con las actualizaciones de las alertas, es ponerlo en el cron, para que cada dia, en mi caso, se actualize esta BBDD. Tu lo puedes poner como quieros, como dice el refran, para gustos, colores.

Después de esto, viene la parte más importate de todo, instalar, el contenedor de bouncer-traefik o en pocas palabras, el que comunicara traefik con crowdsec. A lo mejor lo que digo, no es del todo cierto, pero yo lo entiendo de esta manera.

Para hacer esto, solamente necesitamos lo siguiente (yo sigo en el mismo docker-compose.yml donde tengo traefik y crowdsec):

 bouncer-traefik:
   image: docker.io/fbonalair/traefik-crowdsec-bouncer:latest
   container_name: bouncer-traefik
   restart: unless-stopped
   networks:
     - proxy
   init: true
   environment:
     CROWDSEC_BOUNCER_API_KEY: XXXXXXXXXXXXXXX
     CROWDSEC_AGENT_HOST: crowdsec:8080
   depends_on:
     - crowdsec

Aqui a parte del depends_on, donde indicamos a bouncer-traefik que no se puede iniciar si antes no esta crowdsec, networks, lo mismo que con crowdsec y traefik, los 3 en la misma red.

⚠️ En este contenedor, lo más importante y con lo que tenemos que tener más cuidado es con CROWDSEC_BOUNCER_API_KEY. Es la API que nos da crowdsec para bouncer-traefik y solo aparece una vez, sino te apuntas este codigo, en pocas palabras, tendras que volver a realizar la instalación de traefik, crowdsec y bouncer-traefik. Te lo digo por experiencia. Seguramente hay alguna manera de evitar esto, pero yo no lo he encontrado. Y a demás, asi se aprende algo nuevo.

Para obtener el codigo de la API se hace a traves de la siguiente instrucción:

usuari@debian:~$docker exec crowdsec cscli bouncers add bouncer-traefik

Que, tal como he dicho antes, nos da el codigo una unica vez y no más. Si quieres lo que puedes hacer primero es guardarlo y luego lo añades donde toca, o sino, lo pones en el fichero variables.yml o sino en .env para utilizarlo aqui.

Después solamente nos queda activar el contenedor:

usuari@debian:~$docker compose up -d bouncer-traefik

Como siempre, pueder verificar los logs de traefik y crowdsec para ver si todo sigue funcionando correctamente o intentando acceder a los servicios. Si puedes, de momento todo va bien.

Ahora lo unico que nos queda es indicar a traefik que tiene instalado crowdsec y bouncer-traefik y que haga uso de ellos. Esto se consigue modificando los siguientes ficheros:

dynamic.yml

Le indicamos a traefik que tiene bouncer-traefik en funcionamiento y que puede hacer las consultas mediante la dirección http://bouncer-traefik:8080/api/v1/forwardAuth.

http:
  middlewares:
    crowdsec-bouncer:
      forwardauth:
        address: http://bouncer-traefik:8080/api/v1/forwardAuth
        trustForwardHeader: true

traefik.yml

En el fichero traefik.yml le indicamos en que consultas tiene que usar crowdsec y esto se hace de la siguiente manera:

api:
  dashboard: true

entryPoints:
  web:
    address: ":80"
    http:
      middlewares:
        - crowdsec-bouncer@file
  websecure:
    address: ":443"
    http:
      middlewares:
        - crowdsec-bouncer@file

Le estamos indicando que tanto en consultas http como en https haga las consultas a crowdsec.

Cuando ya tenemos traefik configurado, solamente nos quedara recrear el contenedor de traefik:

usuari@debian:~$docker compose up -d traefik --force-recreate

Y si volvemos a revisar los logs de traefik y todo sigue funcionando correctamente es que lo hemos conseguido. Otra prueba que podemos hacer es acceder a los servicios que tenemos en el servidor que si todo funciona bien, tendremos acceso, sino, la hemos cagado 💩

⚠️ Ahora pasamos a ver el funcionamiento de crowdsec en vivo, esto lo podemos hacer de la siguiente, pero os informo, queda a vuestra libre elección. Esta prueba, consiste en bloquear nuestra ip de acceso al servidor. Esto se hace de la siguiente manera:

usuari@debian:~$docker exec crowdsec cscli decisions add --ip nuestra_ip_de_acceso

Una vez que hemos baneado nuestra propia ip, para asegurarnos de ello, pasamos a verificar que es asi mediante:

usuari@debian:~$docker exec crowdsec cscli decisions list

Donde veremos que, ciertamente, hemos baneado nuestra ip. Y para ver como funciona, nos conectamos a los servicios que tenemos alojados en el VPS / servidor y nos tiene que aparecer el mensaje de forbidden. Pero tranquilo, no te asustes para revertir este baneo tenemos que hacer la instruccion contraria:

usuari@debian:~$docker exec crowdsec cscli decisions delete --ip nuestra_ip_de_acceso

Y si volvemos a ejecutar la orden:

usuari@debian:~$docker exec crowdsec cscli decisions list

Nos tiene que aparecer el mensaje de No active decisions. Ya puedes respirar 🥳.

Tambien, puedes ver un poco lo que esta haciendo crowdsec y traefik, para ello puedes usar las siguientes instrucciones:

## CONTROLAS LAS OPCIONES ACTIVADAS QUE TIENE CROWDSEC
usuari@debian:~$docker exec crowdsec cscli metrics

Y con esto:

## CONTROLAS LOS BANEOS QUE SE HAN PRODUCIDO EN TU SERVIDOR
usuari@debian:~$docker exec crowdsec cscli alerts list

Y con esto podemos dar por concluida la instalación de crowdsec y bouncer-traefik juntamente con traefik en nuestro servidor / VPS.

Espero que te sirva y que puedas aprender tanto como he aprendido yo.

Referencia