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 fichier traefik.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.

Dernière modification: 28 octobre 2020

Auteur