Traefik permet d'ajouter une authentification dite "basique" pour vos services web grâce à un couple identifiant/mot de passe. En effet, certaines applications n'ont pas de mécanisme d'authentification interne (par exemple Prometheus), l'exposition de ces services web sans authentification peut être critique.

Version Date Commentaires
1 05/2022 Création de l'article
1.1 05/2023 Mise à jour de la syntaxe, ajout du contexte d'exécution, mise à jour des numéros de version, ajout d'un bloc exemple d'utilisation du middleware

Objectif : Utiliser l'authentification (HTTP Basic auth) avec Traefik

Environnement : Debian 11.7, Docker 23.x, docker compose (plugin) 2.17.x, Traefik 2.10.

Contexte d'exécution :

jho@vmi866042:/srv/docker/dc$ tree
.
├── conf
│   ├── acme.json
│   ├── traefik.yml
│   ├── traefikdynamic
│   │   ├── general.yml
│   │   ├── routersservices.yml
├── docker-compose.yml
└── logs
    ├── traefikAccess.log
    ├── traefik.log
Résultat de la commande "tree" dans le dossier /srv/docker/dc
  • dossier où se trouvent tous les fichiers et dossiers pour cet exemple : /opt/docker/
  • emplacement du fichier de configuration principal de Traefik : /opt/docker/conf/traefik.yml
  • dossier où se trouvent les configurations de Traefik (fichiers dynamiques) : /opt/docker/conf/traefikdynamic
  • emplacement du fichier comportant tous les certificats générés par let's encrypt (ou autre) : /opt/docker/traefik/conf/acme.json
  • dossier où se trouvent les journaux d'événements (logs) : /opt/docker/logs/

J'utiliserai une configuration dite "dynamique" (rappel sur les configurations sur le site).

Nous allons utiliser un "middleware", une configuration intermédiaire, permettant d'effectuer une opération à la volée avant de rediriger vers le service ciblé. Il en existe de plusieurs types dont les listes sont les suivantes :

traefik middlewares architecture
Schéma récapitulatif de l'utilisation des middleware dans Traefik

Une authentification basique est un identifiant et un mot de passe. Seul le mot de passe doit être chiffré en bcrypt. Ajoutons dans un premier temps le middleware, puis configurons le tableau de bord Traefik avec ce middleware, dans le fichier de configuration dynamique (fichier  /srv/docker/dc/conf/traefikdynamic/dynamic.yml) :

http:
  middlewares:
    authentification:
      basicAuth:
        users: # admin / admin
        - admin:$2y$10$KbBxnjLyBfFi355gJKhgJuXzGUaWbSRvNnvB2R9WDKpLFG1NEdcdi

  routers:
    rt-traefik:
      entryPoints:
      - websecure
      middlewares:
      - authentification
      service: api@internal
      rule: Host (`traefik.rezo.net`)
Fichier /srv/docker/dc/conf/traefikdynamic/dynamic.yml

Le chiffrement des mots de passe d'authentification pour Traefik se fait via MD5, SHA1 ou BCrypt. Ici, ce sera du BCrypt, en utilisant le site web "bcrypt.fr" pour générer les hash. L'utilisation de la commande htpasswd est aussi envisageable (en installation le paquet apache2-utils) = htpasswd -nbB admin Le-Motdepa$$e.

L'utilisateur créé (admin) a pour mot de passe "admin". Puisqu'il s'agit d'une configuration dynamique, vous n'avez pas besoin de redémarrer Traefik. Retenez qu'il s'agit d'une sécurité assez simpliste et ne remplacera pas une suite de mécanismes de sécurité.

Vous pouvez réutiliser ce middleware pour toutes les ressources derrière Traefik, pour chaque définition de routeurs que vous voulez. Écrivez le nom du middleware dans les définitions de vos routeurs à protéger, comme dans l'exemple ci-dessous :

---
http:
  services:
    sc-prometheus:
      loadBalancer:
        servers:
        - url: "http://prometheus:9090"

  routers:
    rt-prometheus:
      entryPoints:
      - websecure
      middlewares:
      - authentification
      service: sc-prometheus
      rule: Host (`prometheus.prive.hommet.local`)
Partager l'article