Catégories
Tut's Linux Docker

Traefik v2 : configuration TLS personnalisée

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


Article mis à jour et corrigé par ldez. (merci !). De nombreuses coquilles étaient présentes, notamment vis-à-vis de configuration inutiles, inexploitées ou encore des erreurs de syntaxe.

Avant-propos, vous ne pouvez pas utiliser les deux configurations (statique et dynamique) en même temps : c’est l’un ou l’autre.
Préparons notre fichier docker-compose.yml :

version: '3.6'
services:
  traefik:
    image: traefik:picodon
    restart: always
    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.toml:/etc/traefik/traefik.toml:ro
      - ./conf/traefik_dynamic.toml:/etc/traefik/traefik_dynamic.toml:ro
      - ./acme.json:/acme.json
    networks:
      - oueb

Explications :

  • on fige la version de Traefik avec la v2 nommée « cantal »
  • ouverture des ports 80 & 443
  • les volumes sont importants : un premier fichier de configuration « traefik.yml » pour les options de base et un fichier de configuration « traefik_dynamic.yml » pour les options dites « dynamiques ».
  • le fichier « acme.json » est à créer avant tout, via un « touch acme.json && chmod 600 acme.json« .

Contenu du fichier « conf/traefik.yml » :

---
global:
  sendAnonymousUsage: false
  checkNewVersion: false

api:
  #insecure: true
  dashboard: true
  #debug: true

log:
  filePath: "/etc/traefik/applog.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: acme.json
      keyType: EC256
      httpChallenge:

Ce qui est important dans ce fichier, c’est le bloc « providers ». Vous remarquerez le bloc « providers.file« , avec la définition d’un fichier « traefik_dynamic.toml« . La ligne « watch = true » permet à Traefik de regarder et d’activer les changements. N’oubliez pas non plus de modifier l’adresse e-mail pour correspondre à votre situation.


Le fichier de configuration secondaire (dynamique) est de même type que le « traefik.toml », la différence réside dans les conf’ qu’il contient et ses usages. Pour rappel, le fichier « traefik.toml » 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.toml » :

---
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.toml » précédemment créé.
Lorsque vos labels sont mis en place, n’oubliez pas de relancer vos conteneurs Docker et le tour est joué !

2 réponses sur « Traefik v2 : configuration TLS personnalisée »

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *