Logo de Béjean Développement

Sécuriser l'accès au dashboard de Traefik Proxy

Objectif

Sécuriser l'accès au dashboard de Traefik Proxy

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

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

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

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, assigné une adresse IP différente et mis en place l'authentification basique.

Pour la suite de l'article, je vais reprendre les fichiers que j'ai utilisés dans mon premier article sur Traefik, je vous invite à faire de même pour gagner du temps.

Fichier de configuration : docker-compose.yml

De base, Traefik utilise le port 8080 pour nous permettre d'accéder au dashboard. Dans le fichier docker-compose.yml, nous allons remplacer l'ouverture du port 8080:8080 par le port 8000:8000. Cette opération s'effectue en modifiant le fichier docker-compose.yml :

version: '3'
services:
  traefik:
    image: "traefik:v2.8"
    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/log:/var/log/traefik
      - ./src/passwd:/passwd

J'en ai profité pour ajouter un volume nommé passwd, ce volume nous permettra de stocker nos fichiers d'authentification BasicAuth.

Fichier de configuration : traefik.toml

Modifions le fichier traefik.toml en activant le dashboard et en ajoutant un point d'entrée sur le port 8080. Pour ce faire, remplacer la valeur false de dashboard par true dans le bloc [api] :

[api]
  insecure = false
  dashboard = true

Et terminons en ajoutant un nouveau point d'entrée, dans le bloc [entryPoints] :

  [entryPoints.api]
    address = ":8000"

Voici le fichier final :

[api]
  insecure = false
  dashboard = true

[providers]
  [providers.docker]
    exposedByDefault = false
  [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 = "api@internal"
      middlewares = ["secure-internal"]
      rule = "PathPrefix(`/api`) || PathPrefix(`/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 fichier traefik.toml
  • Sur le service api@internal définit par Traefik au démarrage
  • Sur le middleware créé dans la seconde directive secure-internal

Le routeur sera appelé lorsque l'une des règles PathPrefix 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 le dashboard en lançant votre navigateur à l'adresse : http://votre-ip-privee/. Un nom d'utilisateur ainsi qu'un mot de passe vous sera demandé pour accéder aux dashboards.

Dans le cas où votre conteneur Traefik est déjà lançé, n'hésitez pas à le stopper, puis de le relancer.