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 😉