Aller au contenu
Lecture · 3 min

Reverse proxy & TLS

Traefik v3 en point d'entrée unique : TLS automatique, en-têtes de sécurité, durcissement Docker.

FiableMaintenableSécuriséHybride

Contexte / besoin

Une plateforme auto-hébergée fait tourner en conteneurs Docker des services de natures très différentes : sites clients publics, outils internes privés, API recevant des webhooks. Tous doivent être servis en HTTPS, chacun avec la bonne exposition, sans multiplier les points d’entrée ni la configuration au cas par cas.

Contraintes

Options envisagées

Décision & pourquoi

Traefik v3, configuration 100 % déclarative (fichiers statiques et labels Docker), versionnée en Git. Exposer un nouveau service se résume à quelques labels sur son conteneur :

# Exposer un service : quelques labels suffisent (domaine d'exemple)
services:
  app:
    image: ghcr.io/exemple/app:1.4.2
    networks: [proxy]                # réseau dédié au reverse proxy
    labels:
      traefik.enable: true
      traefik.http.routers.app.rule: Host(`app.exemple.fr`)
      traefik.http.routers.app.entrypoints: websecure   # HTTPS uniquement
      traefik.http.routers.app.middlewares: secure-headers@file

Côté TLS : un certificat wildcard Let’s Encrypt obtenu par challenge DNS-01 via l’API OVH. Deux avantages concrets. Aucun port HTTP à ouvrir pour valider le challenge. Et les sous-domaines ne sont pas énumérés un par un dans les journaux publics de transparence des certificats : un wildcard ne divulgue pas la carte des services.

Tradeoff assumé

Traefik devient la pièce centrale unique : s’il tombe, tout l’edge tombe. Sur une plateforme mono-serveur, ce point de défaillance est accepté. En échange, il n’y a qu’une seule surface à durcir, à superviser et à mettre à jour. La courbe d’apprentissage de Traefik (routers, services, middlewares) est réelle, mais on ne la paie qu’une fois.

Résultat

Tous les services, publics comme privés, passent par le même point d’entrée, avec HTTPS partout et des certificats renouvelés sans intervention depuis la mise en place.

Durcissement Docker autour du proxy

Le reverse proxy est le composant le plus exposé de la plateforme. C’est aussi celui qui a le plus de pouvoir, puisqu’il découvre les conteneurs via l’API Docker. D’où un durcissement spécifique :

  • Socket Docker jamais monté directement. Traefik parle à un socket-proxy en lecture seule, qui ne laisse passer que les endpoints d’API strictement nécessaires à la découverte des services. Une compromission du proxy ne donne pas le contrôle du démon Docker.
  • no-new-privileges sur les conteneurs : pas d’escalade de privilèges possible via des binaires setuid.
  • Réseaux internes séparés. Le réseau du reverse proxy ne contient que les services à exposer. Les bases de données et services de support vivent dans des réseaux internes sans route vers l’edge.
Chaîne de middlewares (redirection, HSTS, exposition)

Les middlewares Traefik sont déclarés une fois puis composés par service :

  • Redirection HTTPS globale : tout ce qui arrive en HTTP est redirigé, sans exception.
  • secure-headers : HSTS, X-Content-Type-Options: nosniff, protection contre l’embarquement en iframe, politique de referrer stricte.
  • tailscale-only : les services privés n’acceptent que le réseau zero-trust. Le détail est sur la page Réseau zero-trust.

L’exposition d’un service se déclare ainsi route par route, jamais de façon implicite.