Usando Traefik - 4

· 9 min · @Self-Hosting · #VPS #Docker

Tal como indiqué en este artículo, lo único 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 artículo de atareao donde habla de crowdsec y también a este video, que me ha servido como guía en todo el proceso.

Si sigues leyendo este artículo, es que ya has revisado los artículos y el video que te he aconsejado antes, así que ya podemos empezar. Para empezar, partimos de la configuración inicial que tengo en traefik y que podéis ver en los diferentes artículos, 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 así tener mejor identificado el volumen que está 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 si no…

La primera de ellas es la creación de los directorios y archivos que nos harán 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 así, hacemos que crowdsec también 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

Por último

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 así no la tenga encuenta, aunque más adelante haremos una prueba para ver el funcionamiento de crowdsec con respecto a esta IP.

nota: Antes de nada, informar que en el fichero de docker-compose.yml donde tengo traefik también tengo la configuración de crowdsec, porque me ha resultado más fácil, si lo haces con diferentes ficheros yml hay que tener un par de cosas en cuenta que ya os informaré 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: Aquí le indicamos a crowdsec que no puede iniciarse si no está 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 aquí. 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 explicaré más adelante, tienen que estar en la misma red para que se puedan comunicar entre ellos.

  • También tenemos que tener en cuenta los volúmenes 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

nota: Si os fijáis, 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 aquí 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 están en otro docker-compose, si se puede decir así, 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

Después de esto, podemos revisar los logs de crowdsec para ver si de momento vamos por buen camino y también podemos verificar si traefik aún está vivo.

usuari@debian:~$docker logs -f crowdsec

nota: Si has llegado hasta aquí, el único fallo que puedes tener es que los logs de traefik no estén accesibles a crowdsec, para eso fíjate bien en como montas los volúmenes.

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 volúmenes. Aquí te tocará 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

Por último, es aplicar estas actualizaciones a la base de datos de crowdsec a través 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 día, en mi caso, se actualice esta BBDD. Tú lo puedes poner como quieros, como dice el refrán, 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 comunicará 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

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

nota: 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, si no te apuntas este código, en pocas palabras, tendrás 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 además, así se aprende algo nuevo.

Para obtener el código de la API se hace a través de la siguiente instrucción:

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

Que, tal como he dicho antes, nos da el código una única vez y no más. Si quieres lo que puedes hacer primero es guardarlo y luego lo añades donde toca, o si no, lo pones en el fichero variables.yml o si no en .env para utilizarlo aquí.

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 único 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 quedará recrear el contenedor de traefik:

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

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, si no, la hemos cagado 💩

nota: 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 así 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 instrucción contraria:

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

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 🥳.

También, puedes ver un poco lo que está 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

Con esto:

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

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