Usando Traefik - 4
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_logDe 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.ymlDonde 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: syslogacquis.yml
Los ficheros log de traefik, tanto el access.log como el traefik.log.
filenames:
- /var/log/traefik/*
labels:
type: traefikPor 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.
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:
- traefikEn 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/linuxpara los posibles bugs que pueda tener Linuxcrowdsecurity/traefikpara los posibles bugs de traefikcrowdsecurity/sshdpara los posibles bugs de ssh
- 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:
networkstanto 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_logdocker-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: trueUna vez que tenemos esto, ya podemos activar la primera fase de crowdsec:
usuari@debian:~$docker compose up -d crowdsecDespues 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 crowdsecOtra 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 updatePor ultimo, es aplicar estas actualizaciones a la base de datos de crowdsec a traves de:
usuari@debian:~$docker exec crowdsec cscli hub upgradeLo 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:
- crowdsecAqui 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.
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-traefikQue, 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-traefikComo 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: truetraefik.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@fileLe 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-recreateSi 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 💩
usuari@debian:~$docker exec crowdsec cscli decisions add --ip nuestra_ip_de_accesoUna 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 listDonde 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_accesoSi volvemos a ejecutar la orden:
usuari@debian:~$docker exec crowdsec cscli decisions listNos 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 metricsCon esto:
### CONTROLAS LOS BANEOS QUE SE HAN PRODUCIDO EN TU SERVIDOR
usuari@debian:~$docker exec crowdsec cscli alerts listCon 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.