L’objectif de cette documentation est de fournir les fichiers de configuration nécessaire pour faire fonctionner Traefik avec une configuration TLS personnalisée.


Configuration du fichier docker-compose

Avant-propos, vous ne pouvez pas utiliser les deux types de configurations (statique et dynamique) en même temps, c’est l’un ou l’autre. Ici, je privilégie la configuration dynamique.

Préparons notre fichier docker-compose.yml, simple :

---
version: '3.7'
services:
  traefik:
    image: traefik:2.5
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./conf/traefik.yml:/etc/traefik/traefik.yml:ro
      - ./conf/traefikdynamic:/etc/traefik/dynamic:ro
      - ./acme.json:/etc/traefik/acme.json
    networks:
      - bridge

Explications :

  • on fige la version de Traefik avec la v2.5
  • ouverture des ports 80 & 443
  • les volumes sont importants : un premier fichier de configuration « traefik.yml » pour les options de base et le dossier entier pour les options dites « dynamiques ». Le dossier entier est monté, les fichiers à l’intérieur le seront donc aussi.
  • le fichier « acme.json » est à créer avant tout, via un « touch acme.json && chmod 0600 acme.json« .
  • le réseau mis en place est le réseau par défaut créé par Docker lors de son installation

Configuration de Traefik

Pour rappel, tous les fichiers de configuration que je vous propose sont créés dans un dossier « conf« . Libre à vous de placer les fichiers où vous le souhaitez, tant que vous modifiez correctement les chemins dans les configurations.

Contenu du fichier traefik.yml :

---
global:
  sendAnonymousUsage: false
  checkNewVersion: false

api:
  dashboard: true

log:
  format: json
  level: INFO

providers:
  docker:
    endpoint: unix:///var/run/docker.sock
    exposedByDefault: false
    watch: true
    swarmMode: false

  file:
    directory: /etc/traefik/dynamic
    watch: true

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"

certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]
#      caServer: https://acme-staging-v02.api.letsencrypt.org/directory
      caServer: https://acme-v02.api.letsencrypt.org/directory
      storage: "/etc/traefik/acme.json"
      keyType: EC256
      httpChallenge:
        entryPoint: web

Ce qui est important dans ce fichier, c’est le bloc « providers » avec la définition d’un dossier « dynamic« . Ce dossier est a créé en local auparavant sur votre machine pour y intégrer ensuite le fichier traefik_dynamic.yml.

La ligne « watch = true » permet à Traefik de regarder et d’activer les changements fournis dans le(s) fichier(s) de configuration.


Le fichier de configuration secondaire (dynamique) est de même type que le « traefik.yml », la différence réside dans les conf’ qu’il contient et ses usages. Pour rappel, le fichier « traefik.yml » contient la configuration pour le démarrage de Traefik, tandis que le fichier de configuration dynamique contient les options pour les middlewares, les routers et autres loadbalancers. Retrouvez ci-dessous mon fichier de configuration « traefik_dynamic.yml« , dans le dossier « conf/traefikdynamic » :

---
tls:
  options:
    default:
      minVersion: VersionTLS12
      sniStrict: true
      cipherSuites:
        - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
        - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
        - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
        - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
        - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
        - TLS_AES_128_GCM_SHA256
        - TLS_AES_256_GCM_SHA384
        - TLS_CHACHA20_POLY1305_SHA256
      curvePreferences:
        - CurveP521
        - CurveP384

http:
  middlewares:
    security:
      headers:
        accessControlAllowMethods:
          - GET
          - OPTIONS
          - PUT
        #accessControlAllowOriginList = "*"
        accessControlMaxAge: 100
        addVaryHeader: true
        browserXssFilter: true
        contentTypeNosniff: true
        forceSTSHeader: true
        frameDeny: true
        sslRedirect: true
        sslForceHost: true
        stsPreload: true
        #ContentSecurityPolicy = "default-src 'self' 'unsafe-inline'"
        customFrameOptionsValue: SAMEORIGIN
        referrerPolicy: same-origin
        featurePolicy: vibrate 'self'
        stsSeconds: 315360000

Quelques explications à fournir :

  • le bloc TLS instaure toutes les options nécessaires pour avoir une configuration optimale – pour faire simple, la version minimale est le TLS 1.2 avec des algorithmes de chiffrement qui vont bien.
  • le bloc « HTTP » comporte 3 sous-blocs :
    – un premier middleware pour compresser certains flux sauf en cas de streaming
    – un second middleware pour toutes les sécurités relative au HTTPS (les « headers »).

Les fichiers de configuration sont prêts, ne reste plus qu’à configurer les services dans votre docker-compose.yml ! Voilà ce qu’il faut saisir pour chaque service dans les labels :

    labels:
      traefik.enable: "true"
      traefik.http.routers.service-https.entrypoints: "websecure"
      traefik.http.routers.service-https.middlewares: "[email protected], [email protected]"
      traefik.http.routers.service-https.tls: "true"
      traefik.http.routers.service-https.tls.certresolver: "letsencrypt"

Tout ces labels sont à saisir pour chaque service derrière Traefik. Les middleware [email protected], [email protected] et [email protected] viennent piocher directement les paramètres dans le fichier traefik_dynamic.yml précédemment créé.

Lorsque vos labels sont mis en place, n’oubliez pas de relancer vos conteneurs Docker (docker-compose up -d) et le tour est joué !

Vous pouvez retrouver un exemple complet de configuration dynamique sur le GitHub ici : https://github.com/Mettmett/docker-compose/tree/master/traefik-dynamic

Auteur

Bercé par l'informatique depuis mon plus jeune âge, je transforme ma passion en expertise.

2 commentaires

    • Julien

      coquille avec l’utilisation d’un article de mise en forme syntaxique. C’est maintenant corrigé, merci pour le coup d’œil !

Écrire un commentaire