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é !