Usando Traefik - 4
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.ymldonde tengo traefik también tengo la configuración de crowdsec, porque me ha resultado más fácil, si lo haces con diferentes ficherosymlhay 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/linuxpara los posibles bugs que pueda tener Linuxcrowdsecurity/traefikpara los posibles bugs de traefikcrowdsecurity/sshdpara los posibles bugs de ssh
-
-
networkstanto 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ónexternal: trueporque 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.