
Traefik est la porte d'entrée de vos services : c'est aussi votre première ligne de défense. Ses middlewares ajoutent authentification, rate limiting, filtrage IP et headers de sécurité sans toucher aux applications. Ce guide s'adresse à ceux qui exposent Traefik en production et veulent un durcissement méthodique, de l'authentification jusqu'au socket Docker.
Tous les exemples ci-dessous ont été testés sur Traefik v3.7.6, la version qui corrige les CVE de la série v3.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Protéger un service avec BasicAuth puis ForwardAuth (SSO).
- Limiter le débit avec rateLimit et filtrer les accès avec ipAllowList.
- Ajouter les headers de sécurité recommandés (HSTS, CSP, anti-clickjacking).
- Renforcer les options TLS et sécuriser le dashboard.
- Cloisonner l'accès au socket Docker et appliquer une checklist de durcissement.
Prérequis
Section intitulée « Prérequis »- Une installation Traefik fonctionnelle (voir installation).
- Les bases des middlewares Traefik.
- Le HTTPS activé en production (voir TLS et ACME) : plusieurs protections ci-dessous n'ont de sens qu'en TLS.
La sécurité en couches
Section intitulée « La sécurité en couches »Un reverse proxy exposé subit des scans permanents, des tentatives de brute force et des abus de débit. Aucune protection unique ne suffit : on empile des couches.
| Couche | Middleware / réglage | Contre quoi |
|---|---|---|
| Authentification | basicAuth, forwardAuth | Accès non autorisé |
| Débit | rateLimit | Brute force, déni de service applicatif |
| Origine | ipAllowList | Exposition d'interfaces d'admin |
| Réponse | headers | Clickjacking, XSS, MIME sniffing |
| Transport | options TLS | Interception, protocoles faibles |
Authentification
Section intitulée « Authentification »BasicAuth
Section intitulée « BasicAuth »BasicAuth protège un service par identifiant et mot de passe. C'est simple, adapté à un outil interne ou un environnement de test. Générez d'abord un couple utilisateur/hash avec htpasswd (chiffrement bcrypt) :
htpasswd -nbB admin 'MonMotDePasse'# admin:$2y$05$....Déclarez ensuite le middleware selon votre provider :
# labels sur le conteneur à protégerlabels: - "traefik.http.routers.app.middlewares=auth" - "traefik.http.middlewares.auth.basicauth.users=admin:$$2y$$05$$...."En labels Docker, doublez chaque $ du hash ($$) pour éviter l'interpolation.
http: middlewares: auth: basicAuth: users: - "admin:$2y$05$...."apiVersion: traefik.io/v1alpha1kind: Middlewaremetadata: name: authspec: basicAuth: secret: app-auth # Secret contenant le fichier usersLe hash vit dans un Secret Kubernetes, jamais en clair dans le manifeste.
ForwardAuth : déléguer à un SSO
Section intitulée « ForwardAuth : déléguer à un SSO »ForwardAuth délègue la décision d'authentification à un service externe : Traefik lui transmet la requête, et n'autorise l'accès que si ce service répond 2xx. C'est le mécanisme des portails SSO (Authelia, OAuth2 Proxy) et des fournisseurs d'identité comme Keycloak.
http: middlewares: sso: forwardAuth: address: "http://authelia:9091/api/verify?rd=https://auth.example.com" trustForwardHeader: true authResponseHeaders: - "Remote-User" - "Remote-Groups"Le champ authResponseHeaders recopie des en-têtes renvoyés par le service d'auth (identité, groupes) vers votre application. Le service d'authentification décide, votre application consomme le résultat.
| Méthode | SSO | MFA | Cas d'usage |
|---|---|---|---|
| BasicAuth | Non | Non | Dev, outils internes |
| ForwardAuth | Oui | Oui | Production, SSO centralisé |
Pour choisir et déployer un fournisseur d'identité, voir le hub Gestion des identités.
Rate limiting
Section intitulée « Rate limiting »Le middleware rateLimit limite le nombre de requêtes par source et absorbe les pics avec un burst. Il freine le brute force et les abus applicatifs.
http: middlewares: limite: rateLimit: average: 100 # requêtes/seconde en régime établi burst: 50 # tolérance de picPar défaut, Traefik regroupe les requêtes par IP source. En lab, un average: 2 / burst: 1 renvoie bien un HTTP 429 dès la troisième requête rapide. Vous pouvez regrouper par en-tête (clé d'API) ou par cookie via sourceCriterion, utile derrière un load balancer où l'IP réelle arrive dans X-Forwarded-For.
Filtrage par IP
Section intitulée « Filtrage par IP »ipAllowList restreint l'accès à des plages d'adresses connues. C'est indispensable pour une interface d'administration ou un backoffice.
http: middlewares: interne: ipAllowList: sourceRange: - "10.0.0.0/8" - "192.168.1.0/24"Une requête hors plage reçoit un HTTP 403. Derrière un reverse proxy ou un load balancer amont, configurez ipStrategy pour que Traefik lise la vraie IP cliente dans X-Forwarded-For plutôt que celle du proxy.
Headers de sécurité
Section intitulée « Headers de sécurité »Le middleware headers ajoute les en-têtes qui protègent le navigateur du client : anti-clickjacking, anti-MIME-sniffing, politique de contenu.
http: middlewares: secure: headers: stsSeconds: 31536000 stsIncludeSubdomains: true frameDeny: true contentTypeNosniff: true referrerPolicy: "strict-origin-when-cross-origin" customResponseHeaders: Content-Security-Policy: "default-src 'self'"| Header | Valeur recommandée | Protection |
|---|---|---|
Strict-Transport-Security | max-age=31536000; includeSubDomains | Force le HTTPS |
X-Content-Type-Options | nosniff | MIME sniffing |
X-Frame-Options | DENY | Clickjacking |
Content-Security-Policy | selon l'application | XSS, injection |
Referrer-Policy | strict-origin-when-cross-origin | Fuite du referer |
Le partage de ressources cross-origin se configure aussi via headers, avec accessControlAllowOriginList, accessControlAllowMethods et accessControlAllowHeaders. Restreignez toujours les origines autorisées à vos domaines : un * ouvre l'API à tout le web.
Renforcer les options TLS
Section intitulée « Renforcer les options TLS »Au-delà des certificats, imposez un niveau de transport minimal. Définissez une TLSOption avec une version minimale TLS 1.2 et des cipher suites modernes.
tls: options: moderne: minVersion: "VersionTLS12" sniStrict: truesniStrict: true rejette les connexions sans SNI correspondant à un certificat connu. Pour la génération et le renouvellement des certificats, voir Traefik SSL/TLS et ACME.
Sécuriser le dashboard
Section intitulée « Sécuriser le dashboard »Le dashboard Traefik révèle toute votre topologie de routage. Ne l'exposez jamais en mode --api.insecure=true en production. Placez-le derrière une route protégée : HTTPS, plus BasicAuth ou ForwardAuth, plus un filtrage IP.
# labels : dashboard sur un domaine dédié, protégélabels: - "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)" - "traefik.http.routers.dashboard.service=api@internal" - "traefik.http.routers.dashboard.middlewares=auth,interne" - "traefik.http.routers.dashboard.tls=true"Le service interne api@internal n'est ainsi accessible qu'authentifié, depuis une plage IP autorisée, en TLS.
Sécuriser le socket Docker
Section intitulée « Sécuriser le socket Docker »Monter /var/run/docker.sock dans Traefik lui donne un accès complet au démon Docker : c'est un risque d'évasion majeur si Traefik est compromis. Deux parades.
- Docker Socket Proxy : interposez un proxy en lecture seule (comme
tecnativa/docker-socket-proxy) qui n'expose que les endpoints nécessaires à Traefik (containers,networks), et pointez le provider Traefik vers ce proxy plutôt que vers le socket brut. - Montage en lecture seule au minimum (
:ro), et surtout jamais le socket dans un conteneur exposé publiquement sans cette précaution.
Checklist de durcissement production
Section intitulée « Checklist de durcissement production »-
HTTPS partout avec redirection
httpvershttps(redirectScheme), validée en lab : une requête HTTP renvoie un 302 vershttps://. -
Dashboard fermé : jamais
insecure, toujours derrière auth + IP + TLS. -
Socket Docker cloisonné via un socket proxy en lecture seule.
-
Headers de sécurité appliqués globalement sur les entrypoints publics.
-
Rate limiting et filtrage IP sur les routes sensibles (admin, API).
-
Mises à jour : suivez les advisories Traefik et montez de version rapidement (v3.7.6 corrige trois CVE).
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
| Auth toujours en échec | Hash mal échappé (labels Docker) | Doubler les $ en $$ |
| Route démontée après upgrade | BasicAuth sans utilisateurs (v3.7) | Renseigner au moins un utilisateur |
| HSTS absent | Test en HTTP | HSTS ne s'émet qu'en HTTPS |
| Rate limit trop agressif | average/burst trop bas | Ajuster selon le trafic réel |
| IP bloquée à tort | IP du proxy lue au lieu du client | Configurer ipStrategy / X-Forwarded-For |
À retenir
Section intitulée « À retenir »- Traefik sécurise vos services par empilement de middlewares, sans toucher aux applications.
- BasicAuth convient aux outils internes ; ForwardAuth délègue à un SSO pour la production.
- rateLimit freine le brute force, ipAllowList verrouille l'origine (renvoie 403).
- Les headers protègent le navigateur ; HSTS n'est émis qu'en HTTPS.
- Ne jamais exposer le dashboard en
insecureni monter le socket Docker brut. - v3.7.6 corrige trois CVE et durcit BasicAuth/StripPrefix : restez à jour.