Générer automatiquement des certificats Let's Encrypt avec Traefik Proxy
Objectif
Dans cet article, nous allons voir comment installer, sous Docker, Traefik Proxy 2.8 et comment le paramétrer pour générer des certificats Let's Encrypt avec la note A+.
Préambule
J'ai connu Traefik grâce à la chaîne Xavki, avant de m'essayer à Traefik, j'utilisais Nginx pour faire du Reverse Proxy sur mes conteneurs Docker. Traefik simplifie grandement la mise en place d'un Reverse Proxy, si vous souhaitez en savoir plus, Xavki a mis en ligne, récemment, une playlist assez complète au sujet de Traefik. Découvrir la playlist...
Tutoriel
Arborescence
J'utilise Traefik avec Docker et plus précisément avec Docker Compose. Commençons par créer un dossier dans lequel nous allons travailler :
mkdir traefik && cd traefik
Dans ce dossier, nous allons créer les dossiers data
, providers
et logs
pour la persistance des données de Traefik :
mkdir -p src/data src/providers src/log
Conteneur Traefik
Fichier de configuration : docker-compose.yml
À la racine de notre projet (dossier traefik), nous allons créer un fichier docker-compose.yml
contenant :
version: '3'
services:
traefik:
image: "traefik:v2.8"
ports:
- 80:80
- 443:443
- 8080:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./src/data:/etc/traefik
- ./src/providers:/providers
- ./src/log:/var/log/traefik
Fichier de configuration : traefik.toml
Pour paramétrer Traefik, il y a plusieurs possibilités qui sont référencées dans la documentation : Lien vers la documentation
Pour ma part, j'utilise le fichier traefik.toml
. Ce fichier doit être créé dans le dossier data
de notre projet.
Voici ce qu'il doit contenir :
[api]
insecure = false
dashboard = false
[providers]
[providers.docker]
exposedByDefault = false
[providers.file]
directory = "/providers/"
watch = true
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.websecure]
address = ":443"
[log]
filePath = "/var/log/traefik/traefik.log"
level = "DEBUG"
[accessLog]
filePath = "/var/log/traefik/access.log"
[certificatesResolvers]
[certificatesResolvers.le-resolver]
[certificatesResolvers.le-resolver.acme]
email = "votre-adresse@email"
storage = "/etc/traefik/acme.json"
[certificatesResolvers.le-resolver.acme.tlsChallenge]
Voici quelques précisions sur le fichier de configuration :
- On désactive l'API et le mode non sécurisé, ceci est recommandé dans un environnement de production, lien vers la documentation
- On utilise les
provider
Docker et File, lien vers la documentation - On définit 2
entrypoints
, un premier nomméweb
qui écoute le port 80 et un second nomméwebsecure
qui écoute le port 443. - On active les logs en mode
debug
avec le chemin vers le fichier, lien vers la documentation - On active les logs d'accès avec le chemin vers le fichier, lien vers la documentation
- Le dernier bloc, que j'ai nommé
le-resolver
, concerne la génération des certificats pour Let's Encrypt Resolver, lien vers la documentation
Les fichiers de logs sont situés dans le volume persistant que nous avons renseignés dans le docker-compose.yml
.
N'oubliez pas de remplacer votre-adresse@email
par votre adresse email.
Fichier de configuration : tls.toml
Nous allons donc ajouter un fichier de configuration qui nous permettra d'augmenter la sécurité de notre certificat.
Au sein du dossier providers
, nous allons créer le fichier tls.toml
contenant :
[http]
[http.middlewares]
[http.middlewares.security.headers]
frameDeny = true
sslRedirect = true
browserXssFilter = true
contentTypeNosniff = true
#HSTS
stsIncludeSubdomains = true
stsPreload = true
stsSeconds = 31536000
[tls.options]
[tls.options.mytlsoption]
minVersion = "VersionTLS12"
cipherSuites = [
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
]
curvePreferences = [
"CurveP521",
"CurveP384"
]
sniStrict = true
Je remercie Teddy, car j'ai pu améliorer la sécurité de mon conteneur. Je vous encourage vivement à lire son article.
Build et lancement
Pour terminer cette partie, lancer la commande ci-dessous pour construire et lancer le conteneur Traefik :
docker-compose up -d
Résultat
Une fois lancé, vous pouvez exécuter la commande docker logs <nom-du-conteneur-docker>
, dans mon cas la commande est docker logs traefik_traefik_1
, afin de vérifier que le fichier de configuration est bien chargé.
Conteneur Nginx
Pour générer un certificat, nous allons utiliser un conteneur Nginx. Pour ce faire, nous allons ajouter au fichier docker-compose.yml
le bloc ci-dessous :
nginx:
image: "nginx:1.23"
expose:
- 80
labels:
- "traefik.enable=true"
- "traefik.http.routers.to-nginx.entrypoints=web,websecure"
- "traefik.http.routers.to-nginx.rule=Host(`votre-nom-de-domaine-public.com`)"
- "traefik.http.routers.to-nginx.tls=true"
- "traefik.http.routers.to-nginx.tls.certresolver=le-resolver"
- "traefik.http.routers.to-nginx.tls.options=mytlsoption@file"
- "traefik.http.routers.to-nginx.middlewares=security@file"
Le bloc labels
permet d'indiquer à Traefik, car il écoute le socket Docker, les paramètres à utiliser pour le conteneur, expliqué ci-dessous :
- La 1ère ligne "active" Traefik sur ce conteneur, car nous avions indiqué, dans le fichier
traefik.toml
, la valeurexposedByDefault
àfalse
. Lorsque la valeur est àtrue
, Traefik est activé sur tous les conteneurs. - La 2ème ligne indique les points d'entrées à utiliser par le routeur, dans notre cas ce sera
web
etwebsecure
, soit les ports80
et443
. - Les 2 lignes suivantes activent le TLS, en utilisant le resolver
le-resolver
que nous avons créé dans le fichiertraefik.toml
. - Les 2 dernières lignes activent les paramètres que nous avons définis dans le fichier
tls.toml
Build et lancement
Pour terminer cette partie, lancer la commande ci-dessous pour construire et lancer le conteneur Nginx :
docker-compose up -d
Résultat
Vous pouvez visualiser la page en lançant votre navigateur à l'adresse : http://votre-nom-de-domaine-public.com
. Vous devriez avoir une page HTML en HTTPS avec un certificat.
Vous pouvez tester la configuration TLS en lançant votre navigateur à l'adresse : https://www.ssllabs.com/ssltest/, puis en renseignant l'adresse de votre site internet.
Vous devriez avoir la note A+ qui s'affiche.