Objectif
Sécuriser l’accès au dashboard de Traefik 2.3
Préambule
Suite à un premier article sur Traefik au sujet de la génération automatique des certificats SSL (lien vers l’article), j’ai souhaité rédiger un nouvel article sur la sécurisation de l’accès au tableau de bord.
Tutoriel
Accéder au tableau de bord
Par défaut, l’accès au tableau de bord de Traefik s’effectue par le port 8080 de la machine où il est installé.
Lorsque vous lancez un conteneur Docker avec la commande proposée par Traefik Labs, on ouvre le port 8080 de la machine hôte vers le port 8080 du conteneur :
docker run -d -p 8080:8080 -p 80:80 \
-v $PWD/traefik.toml:/etc/traefik/traefik.toml traefik:v2.3
Sur votre ordinateur, en local, vous pouvez accéder au tableau de bord par l’adresse http://127.0.0.1:8080 ou par http://localhost:8080.
Sécuriser le tableau de bord
Changer le port
Cette méthode n’est pas un élément de sécurité fort mais il est possible de modifier le port d’accès au tableau de bord. L’avantage de Docker est qu’il est possible de mapper un port différent de la machine hôte vers le conteneur.
Très simplement, nous pouvons, au lieu d’utiliser le port 8080, utiliser un autre port, par exemple 24786 en lançant la commande :
docker run -d -p 24786:8080 -p 80:80 \
-v $PWD/traefik.toml:/etc/traefik/traefik.toml traefik:v2.3
Spécifier une adresse IP
Si votre serveur dispose d’un minimum de 2 adresses IP, 1 publique et 1 privée, par exemple. Je vous invite à utiliser l’adresse IP privée pour accéder au tableau de bord. Cela est réalisable avec la commande suivante :
docker run -d -p 192.168.1.2:24786:8080 -p 80:80 \
-v $PWD/traefik.toml:/etc/traefik/traefik.toml traefik:v2.3
Dans ce cas, le tableau de bord sera accessible uniquement par l’IP de votre réseau privée.
Utiliser un middleware
Merci à @whiterabbit441 pour sa contribution car suite à la publication de mon article sur Twitter, @whiterabbit441 m’a fait remarquer qu’il serait préférable d’utiliser un middleware pour sécuriser l’accès au tableau de bord.
Le middleware va vous permettent de mettre en place une authentification simple, lien vers la documentation.
Pour sécuriser mon dashboard, j’ai modifié le port d’accès, assigné une adresse IP différente et mis en place l’authentification basique.
Fichier de configuration : docker-compose.yml
A la racine de notre projet (dossier traefik), nous allons créer un fichier docker-compose.yml
contenant :
version: '3'
services:
traefik:
image: "traefik:v2.3"
ports:
- ip-publique:80:80
- ip-publique:443:443
- ip-privee:8000:8000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./src/data:/etc/traefik
- ./src/providers:/providers
- ./src/passwd:/passwd
- ./srv/log:/var/log/traefik
networks:
- myglobalnetwork
networks:
myglobalnetwork:
external:
name: myglobalnetwork
De base, Traefik utilise le port 8080 pour nous permettre d’accéder au dashboard. Dans le fichier docker-compose.yml
, nous supprimons l’ouverture du port 8080:8080
par le port 8000:8000
.
Autre élément qui fait son apparition, le montage de 2 volumes persistants ./src/providers:/providers
et ./src/passwd:/passwd
. Le premier volume va nous permettre d’ajouter un nouveau provider de type fichier à Traefik, en plus du provider Docker et le second va stocker le fichier d’authentification.
Fichier de configuration : traefik.toml
Modifions le fichier traefik.toml
en ajoutant le provider de fichier, pour ce faire, ajouter le bloc suivant dans le bloc [providers]
:
[providers.file]
directory = "/providers/"
watch = true
Avec cette directive, nous indiquons à Traefik de continuellement vérifier le contenu du dossier /providers
.
Avant de terminer, ajoutons un nouveau point d’entrée :
[entryPoints.api]
address = ":8000"
Ce point d’entrée va nous permettre de configurer l’accès au tableau de bord pour le sécuriser.
Voici le fichier final :
[api]
insecure = true
dashboard = true
[providers]
[providers.docker]
exposedByDefault = false
network = "myglobalnetwork"
[providers.file]
directory = "/providers/"
watch = true
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.websecure]
address = ":443"
[entryPoints.api]
address = ":8000"
[log]
filePath = "/var/log/traefik/traefik.log"
level = "DEBUG"
[accessLog]
filePath = "/var/log/traefik/access.log"
[certificatesResolvers]
[certificatesResolvers.le-resolver]
[certificatesResolvers.le-resolver.acme]
email = "[email protected]"
storage = "/etc/traefik/acme.json"
[certificatesResolvers.le-resolver.acme.tlsChallenge]
Fichier de configuration : dashboard.toml
Dans le dossier ./src/providers
, nous allons créer le fichier dashboard.toml
qui contiendra les directives suivantes :
[http]
[http.routers]
[http.routers.secure-api-dashboard]
entryPoints = ["api"]
service = "[email protected]"
middlewares = ["secure-internal"]
rule = "Host(`mon-host-vers-le-dashboard`)"
[http.middlewares]
[http.middlewares.secure-internal.basicAuth]
usersFile = "/passwd/.htpasswd"
Dans le premier bloc, on définit un routeur nommé secure-api-dashboard
qui agira :
- Sur le point d’entrée
api
que nous avons défini dans le fichiertraefik.toml
- Sur le service
[email protected]
définit par Traefik au démarrage - Sur le middleware créé dans la seconde directive
secure-internal
Le routeur sera appelé lorsque la règle Host(
mon-host-vers-le-dashboard)
sera vraie.
Le deuxième bloc définit le middleware nommé secure-internal
qui définit basicAuth
pour restreindre l’accès au routeur par le biais d’une authentification basique.
Fichier d’authentification : .htpasswd
Pour créer le fichier, c’est assez simple, il faut lancer la commande htpasswd -cm ./src/passwd/.htpasswd votreUser
. Lorsque vous lancerez la commande, htpasswd
va vous demander de taper 2 fois le mot de passe pour votre utilisateur.
Build et lancement
Pour terminer, lancer la commande ci-dessous pour construire et lancer le conteneur Traefik :
docker-compose up -d
Résultat
Vous pouvez visualiser la page en lançant votre navigateur à l’adresse : http://mon-host-vers-le-dashboard/
Tutoriel publié le 28/10/2020.