Un peu de fromage dans votre proxy

 

Eh oui c'est la saison des fromages ... il y a une saison pour les fromages ? Pourquoi il parle de fromages sur un blog technique d'admins ?

Pour les retardataires, je vais parler ici de Traefik, qui est un proxy, voir LE proxy pour les architectures Docker, Swarm, Kubernetes etc ... C'est un excellent produit, qui plus est "cocorico", à été créé par un français Emile Vauge

Ces dernières années Traefik c'est imposé dans les architectures dockerisées, il y a aussi maintenant une version pro supportée par containo.us.

Pour finir sur le fromage, c'est que les versions de Traefik portent des noms de fromage, la dernière en date que je vais mettre en place ici, la version 2 à pour nom "Montdor". La boucle est bouclée, j'ai parlé de fromage et de proxy. Allons y pour la partie technique.

Comme je l'ai précisé plus haut , Traefik est depuis quelques mois passé en version 2 et cette version apporte pas mal de modifications sur la configuration. On va parler maintenant de "routers", de "services" et de "middlewares". Je reporterais les lecteurs vers les pages de la documentation officielle pour comprendre chaque partie. Le but ici est de mettre en place une configuration sécurisée fonctionnelle.

Un petit de skills sur Docker et Traefik versions précédentes est nécessaire pour suivre cet article.

 

Fichiers de configuration

Je vais définir deux fichiers de configuration : traefik.yml (qui remplace traefik.toml) et config.yml (pour les middlewares). Dans mon projet ces fichiers se trouvent dans le répertoire conf.

conf/traefik.yml

api:
  dashboard: true
  debug: true

entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
  file:
    filename: /config.yml

log:
  level: "ERROR"
  filePath: "log/error.log"
  format: "json"

accessLog:
  filePath: "log/access.log"
  format: "json"

certificatesResolvers:
  http:
    acme:
      email: sysadmin@aukfood.net
      storage: acme.json
      httpChallenge:
        entryPoint: http

 

On a défini plusieurs blocs :

  • api : activation de l'api Traefik
  • entrypoints : comment dire, les points d'entrée, ici http, https il est possible d'en mettre d'autres pour les metriques par exemple ou pour tcp ...
  • providers : deux providers, docker et fichier
  • log et accesslog : la gestion des logs, ça peut toujours servir
  • certificatesResolvers : la gestion des certificats, ici seulement une gestion acme pour les certificats let's encrypt

 

conf/config.yml

http:
  middlewares:
    https-redirect:
      redirectScheme:
        scheme: https

    default-headers:
      headers:
        frameDeny: true
        sslRedirect: true
        browserXssFilter: true
        contentTypeNosniff: true
        forceSTSHeader: true
        stsIncludeSubdomains: true
        stsPreload: true

    secured:
      chain:
        middlewares:
        - default-headers

 

Ce fichier de config référence la configuration des middlewares, RTFM c'est très bien expliqué sur la doc officielle.

 

docker-compose.yml

Il est temps de mettre en place le fichier docker-compose.yml pour mettre en place le conteneur.

version: '3.5'

services:
  traefik:
    image: traefik:v2.0
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - traefik-proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./conf/traefik.yml:/traefik.yml:ro
      - ./data/acme.json:/acme.json
      - ./conf/config.yml:/config.yml:ro
      - ./log:/log
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=http"
      - "traefik.http.routers.traefik.rule=Host(`traefik.demo.aukfood.org`)"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=login:pass"
      - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
      - "traefik.http.routers.traefik-secure.entrypoints=https"
      - "traefik.http.routers.traefik-secure.rule=Host(`traefik.demo.aukfood.org`)"
      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
      - "traefik.http.routers.traefik-secure.tls=true"
      - "traefik.http.routers.traefik-secure.tls.certresolver=http"
      - "traefik.http.routers.traefik-secure.service=api@internal"

networks:
  traefik-proxy:
    name: traefik-proxy

 

Une grosse partie de la configuration est assez classique avec :

  • définition de l'image, on prends la dernière
  • on nomme le conteneur (c'est toujours plus propre)
  • définition des contraintes de redémarrage
  • définition des ports 80 et 443, le dashboard sera géré comme un service
  • définition des volumes pour l'écoute du socket docker, les fichiers de conf et la gestion des logs

 

La suite permet de définir les points de configuration pour Traefik à travers l'ensemble des labels.

  • traefik.enable=true : pas trop besoins de commenter je penses
  • traefik.http.routers.traefik.entrypoints=http : un premier point d'entrée en http
  • traefik.http.routers.traefik.rule=Host(traefik.demo.aukfood.org) : définition de l'url pour ce point d'entrée
  • traefik.http.middlewares.traefik-auth.basicauth.users=login:pass : user et mot de passe pour l'authentification pour le backoffice
  • traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https : on défini ici l'utilisation du middleware redirectscheme
  • traefik.http.routers.traefik.middlewares=traefik-https-redirect : permet de faire la redirection https pour ce router
  • traefik.http.routers.traefik-secure.entrypoints=https : le point d'entrée en https
  • traefik.http.routers.traefik-secure.rule=Host(traefik.demo.aukfood.org) : l'url pour ce second point d'entrée
  • traefik.http.routers.traefik-secure.middlewares=traefik-auth : passage par l'authentification définie ci-dessus
  • traefik.http.routers.traefik-secure.tls=true : activation du tls pour ce routeur
  • traefik.http.routers.traefik-secure.tls.certresolver=http : permet de créer et gérer le certificat avec Let's Encrypt
  • traefik.http.routers.traefik-secure.service=api@internal : défini le service pour accéder à l'api et au dashboard

 

Pour générer le mot de passe pour l'authentification :

echo $(htpasswd -nb login pass) | sed -e s/\\$/\\$\\$/g

 

NB pour le fichier acme, je l'ai créé à la main avant de démarrer Traefik :

touch data/acme.json
chmod 600 data/acme.json

 

Tout est en place, reste plus qu'à démarrer tout ça :

Le dashboard

Très grosse évolution dans cette version sur le le dashboard qui permet de visualiser chaque parties de la configuration.

L'interface d'accueil

Les routeurs

Détail d'un routeur

 

Conclusion

L'objectif dans le week-end était de prendre en main l'installation et la configuration de cette nouvelle version de Traefik, objectif atteint. Un article va suivre avec la mise en place d'une application dockérisée derrière ce proxy ... en attendant vous reprendriez bien un petit morceau de fromage 😉