Aller au contenu
medium

Sécuriser Traefik : authentification, rate limiting et bonnes pratiques

10 min de lecture

Logo traefik

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.

  • 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.

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.

CoucheMiddleware / réglageContre quoi
AuthentificationbasicAuth, forwardAuthAccès non autorisé
DébitrateLimitBrute force, déni de service applicatif
OrigineipAllowListExposition d'interfaces d'admin
RéponseheadersClickjacking, XSS, MIME sniffing
Transportoptions TLSInterception, protocoles faibles

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) :

Fenêtre de terminal
htpasswd -nbB admin 'MonMotDePasse'
# admin:$2y$05$....

Déclarez ensuite le middleware selon votre provider :

# labels sur le conteneur à protéger
labels:
- "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.

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éthodeSSOMFACas d'usage
BasicAuthNonNonDev, outils internes
ForwardAuthOuiOuiProduction, SSO centralisé

Pour choisir et déployer un fournisseur d'identité, voir le hub Gestion des identités.

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 pic

Par 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.

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.

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'"
HeaderValeur recommandéeProtection
Strict-Transport-Securitymax-age=31536000; includeSubDomainsForce le HTTPS
X-Content-Type-OptionsnosniffMIME sniffing
X-Frame-OptionsDENYClickjacking
Content-Security-Policyselon l'applicationXSS, injection
Referrer-Policystrict-origin-when-cross-originFuite 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.

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: true

sniStrict: 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.

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.

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.
  1. HTTPS partout avec redirection http vers https (redirectScheme), validée en lab : une requête HTTP renvoie un 302 vers https://.

  2. Dashboard fermé : jamais insecure, toujours derrière auth + IP + TLS.

  3. Socket Docker cloisonné via un socket proxy en lecture seule.

  4. Headers de sécurité appliqués globalement sur les entrypoints publics.

  5. Rate limiting et filtrage IP sur les routes sensibles (admin, API).

  6. Mises à jour : suivez les advisories Traefik et montez de version rapidement (v3.7.6 corrige trois CVE).

SymptômeCause probableSolution
Auth toujours en échecHash mal échappé (labels Docker)Doubler les $ en $$
Route démontée après upgradeBasicAuth sans utilisateurs (v3.7)Renseigner au moins un utilisateur
HSTS absentTest en HTTPHSTS ne s'émet qu'en HTTPS
Rate limit trop agressifaverage/burst trop basAjuster selon le trafic réel
IP bloquée à tortIP du proxy lue au lieu du clientConfigurer ipStrategy / X-Forwarded-For
  • 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 insecure ni monter le socket Docker brut.
  • v3.7.6 corrige trois CVE et durcit BasicAuth/StripPrefix : restez à jour.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn