🛡️ Le défi : Sécuriser l’ouverture au Web #
À l’origine, mon Home Lab fonctionnait en vase clos. Mais l’ajout de services gourmands en partage (comme Jellyfin pour le streaming ou Immich pour les photos) a imposé une exposition sur Internet.
Le problème ? Multiplier les comptes utilisateurs et les mots de passe sur chaque application est un cauchemar en termes de sécurité et d’expérience utilisateur. J’ai donc cherché une solution de Single Sign-On (SSO) capable de :
- Centraliser tous mes utilisateurs.
- Ajouter du 2FA (Double Authentification) sur des services qui ne le supportent pas nativement.
- S’intégrer avec des protocoles modernes (OIDC, SAML) et anciens (LDAP).
Mon choix s’est porté sur Authentik, une solution open-source extrêmement flexible.
🏗️ L’Architecture du système #
Le déploiement repose sur une stack Docker robuste, orchestrée pour garantir performance et sécurité :
- Cœur Authentik : Le serveur principal et son worker pour les tâches asynchrones.
- Persistance : PostgreSQL pour les données et Redis pour le cache des sessions.
- Edge Network : Caddy en Reverse Proxy et Cloudflare Tunnel pour l’exposition sécurisée sans ouverture de ports sur ma box.
Aperçu de la stack Docker Compose #
services:
postgresql:
image: postgres:16-alpine
# ... configuration persistance
redis:
image: redis:alpine
server:
image: ghcr.io/goauthentik/server:latest
# ... configuration ports & env
worker:
image: ghcr.io/goauthentik/server:latest
# ... configuration worker
caddy:
image: caddy:latest
# ... configuration ports & volumes
cloudflared:
image: cloudflare/cloudflared:latest
# ... configuration pour le tunnel avec le token🔧 Implémentation technique #

1. Gestion Multi-Fournisseurs #
L’un des points forts de ce projet a été l’adaptation aux besoins de chaque application :
- Avant-postes LDAP : Pour Jellyfin, qui utilise ce protocole plus ancien pour authentifier les utilisateurs par un plugin.
- OpenID Connect (OIDC) : Pour Immich, permettant une connexion fluide avec redirection vers le site d’authentification pour la partie web et mobile à prendre en compte.
2. Personnalisation des Flux (Flows) #
J’ai conçu des flux d’authentification sur mesure :
- Suppression des comptes par défaut au profit d’un administrateur unique.
- Mise en place d’étapes de vérification strictes : Mot de passe -> 2FA (TOTP).
Par exemple avec Immich, j’ai défini un flux d’authentification et un flux de déconnexion.

On retrouve ces configurations dans l’interface d’administration sous forme de graphiques de flux très intuitifs.
Notamment avec les étapes qu’on peut personnaliser.

🔒 Sécurité avancée : Le combo Caddy & Cloudflare #
La sécurité ne s’arrête pas à l’authentification. J’ai blindé la couche transport :
- Caddy : Configuré avec des headers de sécurité stricts (HSTS, X-Frame-Options) et support du TLS 1.3.
Exemple de configuration Caddyfile pour Authentik :
(auth_security) {
header {
X-Frame-Options "DENY"
X-Content-Type-Options "nosniff"
# HSTS à 1 an (standard recommandé)
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# CSP : Blindage contre les scripts malveillants
Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors 'none';"
# Protection de la provenance
Referrer-Policy "no-referrer"
# Pas de cache sur la page de login
Cache-Control "no-store, no-cache, must-revalidate"
}
}
# 2. Configuration du domaine exposé
https://authentik.mondomaine.com {
# Inclusion du bloc de sécurité
import auth_security
# Gestion des certificats SSL
tls /data/certs/cert.pem /data/certs/key.pem {
protocols tls1.3
}
# Proxy vers le serveur Authentik
reverse_proxy authentik-server:9000 {
header_up Host {host}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Proto https
}
}- Cloudflare Tunnel : Permet de bénéficier de la protection Anti-DDoS de Cloudflare. Le trafic est encapsulé, isolant totalement mon réseau local des scans de ports malveillants.
💾 Maintenance et Sauvegarde #
Une solution d’identité est critique : si elle tombe, l’accès à tous les services est coupé.
- Backups : Automatisation d’un dump PostgreSQL quotidien vers un stockage froid.
- Mises à jour : Utilisation de Watchtower pour suivre les versions de sécurité d’Authentik (voir mon article sur l’automatisation avec Watchtower).
📝 Bilan et perspectives #
Aujourd’hui, l’accès à mes services est fluide : une seule identité, un seul mot de passe, et une sécurité renforcée.
Des questions sur la configuration de Caddy ou d’Authentik ? N’hésitez pas à me contacter via la page À propos !