
Ce guide vous permet de déployer Pomerium en 10 minutes avec Docker Compose et de protéger vos premières applications web derrière un accès authentifié. Vous repartirez avec un environnement fonctionnel, trois applications protégées et la compréhension du flux de bout en bout. Prérequis : Docker et Docker Compose installés.
Objectif du lab
Section intitulée « Objectif du lab »À la fin de ce guide, vous aurez :
- Un conteneur Pomerium en mode all-in-one (proxy + authenticate + authorize + databroker)
- Trois applications protégées :
- Verify : service Pomerium qui affiche les informations de votre session
- Grafana : dashboard d’observabilité
- Whoami : service simple qui affiche les headers de la requête
- Un flux d’authentification fonctionnel via le service d’authentification hébergé de Pomerium
L’ensemble tourne en local sur votre machine. Aucun serveur distant n’est nécessaire.
Prérequis
Section intitulée « Prérequis »| Prérequis | Version minimale | Vérification |
|---|---|---|
| Docker | 20+ | docker --version |
| Docker Compose | v2+ | docker compose version |
| Navigateur web | Récent | — |
| Compte email | Quelconque | Pour l’authentification |
Architecture du lab
Section intitulée « Architecture du lab »Le lab déploie 4 conteneurs sur un réseau Docker interne :
Seul le port 443 de Pomerium est exposé sur l’hôte. Les applications upstream ne sont accessibles que via Pomerium.
Préparer le projet
Section intitulée « Préparer le projet »-
Créez le répertoire du lab
Fenêtre de terminal mkdir -p ~/Projets/pomerium-lab && cd ~/Projets/pomerium-lab -
Créez le fichier de configuration Pomerium
Créez un fichier
config.yamlà la racine du projet :config.yaml authenticate_service_url: https://authenticate.pomerium.approutes:- from: https://verify.localhost.pomerium.ioto: http://verify:8000policy:- allow:or:- email:is: votre-email@example.compass_identity_headers: true- from: https://grafana.localhost.pomerium.ioto: http://grafana:3000allow_any_authenticated_user: true- from: https://whoami.localhost.pomerium.ioto: http://whoami:80allow_any_authenticated_user: trueRemplacez
votre-email@example.compar votre adresse email réelle. C’est l’email avec lequel vous vous authentifierez. -
Créez le fichier Docker Compose
docker-compose.yaml services:pomerium:image: pomerium/pomerium:v0.32.4volumes:- ./config.yaml:/pomerium/config.yaml:roports:- 443:443verify:image: pomerium/verify:latestexpose:- "8000"grafana:image: grafana/grafana:latestexpose:- "3000"whoami:image: traefik/whoami:latestexpose:- "80"
Comprendre la configuration
Section intitulée « Comprendre la configuration »Avant de démarrer, détaillons les éléments clés du fichier config.yaml :
Le service d’authentification hébergé
Section intitulée « Le service d’authentification hébergé »authenticate_service_url: https://authenticate.pomerium.appCette ligne indique que Pomerium utilise son service d’authentification hébergé. Pomerium fournit un IdP (fournisseur d’identité) intégré pour les tests et les démarrages rapides. Vous n’avez pas besoin de configurer Keycloak ou Authentik pour ce premier lab.
En production, vous remplacerez cette URL par votre propre IdP. C’est l’objet d’un guide ultérieur dans la série.
Les routes
Section intitulée « Les routes »Chaque route définit un point d’entrée (from) et une destination
(to) :
| Champ | Rôle | Exemple |
|---|---|---|
from | URL publique que l’utilisateur tape dans son navigateur | https://grafana.localhost.pomerium.io |
to | Adresse du service en amont, sur le réseau Docker | http://grafana:3000 |
policy | Règles d’accès (qui peut entrer) | Voir ci-dessous |
Les politiques d’accès
Section intitulée « Les politiques d’accès »Le fichier utilise deux types de politiques :
Politique par email (route Verify) — seul l’utilisateur avec l’email spécifié peut accéder :
policy: - allow: or: - email: is: votre-email@example.comPolitique ouverte (routes Grafana et Whoami) — tout utilisateur authentifié peut accéder, quel que soit son email :
allow_any_authenticated_user: trueLes headers d’identité
Section intitulée « Les headers d’identité »pass_identity_headers: trueCette option demande à Pomerium de transmettre les informations d’identité (email, nom, groupes) à l’application upstream via des headers HTTP. Le service Verify utilise ces headers pour afficher les détails de votre session.
Déployer l’environnement
Section intitulée « Déployer l’environnement »-
Téléchargez les images Docker
Fenêtre de terminal docker compose pullRésultat attendu :
✔ Image grafana/grafana:latest Pulled✔ Image pomerium/pomerium:v0.32.4 Pulled✔ Image traefik/whoami:latest Pulled -
Démarrez les services
Fenêtre de terminal docker compose up -dRésultat attendu :
✔ Network pomerium-lab_default Created✔ Container pomerium-lab-grafana-1 Created✔ Container pomerium-lab-whoami-1 Created✔ Container pomerium-lab-pomerium-1 Created✔ Container pomerium-lab-verify-1 Created -
Vérifiez que tous les conteneurs tournent
Fenêtre de terminal docker compose psLes 4 conteneurs doivent avoir le statut
Up:NAME IMAGE STATUS PORTSpomerium-lab-grafana-1 grafana/grafana:latest Up 3000/tcppomerium-lab-pomerium-1 pomerium/pomerium:v0.32.4 Up 0.0.0.0:443->443/tcppomerium-lab-verify-1 pomerium/verify:latest Up 8000/tcppomerium-lab-whoami-1 traefik/whoami:latest Up 80/tcp -
Vérifiez les logs Pomerium
Fenêtre de terminal docker compose logs pomerium | head -15Vous devez voir les messages suivants confirmant le bon démarrage :
pomerium-1 | {"level":"info","message":"config: updated config"}pomerium-1 | {"level":"info","version":"0.32.4","message":"cmd/pomerium"}pomerium-1 | {"level":"info","message":"server started"}pomerium-1 | {"level":"info","message":"enabled authenticate service"}pomerium-1 | {"level":"info","message":"enabled authorize service"}pomerium-1 | {"level":"info","message":"enabled databroker service"}pomerium-1 | {"level":"info","message":"enabled proxy service"}
Accéder au lab
Section intitulée « Accéder au lab »Si Docker tourne directement sur votre machine, ouvrez simplement les URLs dans votre navigateur :
https://verify.localhost.pomerium.iohttps://grafana.localhost.pomerium.iohttps://whoami.localhost.pomerium.io
Le DNS *.localhost.pomerium.io est un DNS public qui pointe vers
127.0.0.1. Votre navigateur résout l’adresse automatiquement.
Si vous travaillez en SSH Remote (Docker tourne sur un serveur distant) :
- Ouvrez le panneau Ports dans VS Code (onglet à côté du Terminal)
- Cliquez Forward a Port et entrez 443
- VS Code crée un tunnel SSH :
localhost:443sur votre machine locale → port 443 du serveur distant
Le DNS *.localhost.pomerium.io pointe vers 127.0.0.1, donc votre
navigateur local envoie la requête au tunnel SSH, qui la transmet à Pomerium
sur le serveur. Le header Host est préservé — Pomerium reçoit bien
verify.localhost.pomerium.io et sait quelle route servir.
Ouvrez ensuite les URLs dans votre navigateur local (pas le Simple Browser de VS Code) :
https://verify.localhost.pomerium.iohttps://grafana.localhost.pomerium.iohttps://whoami.localhost.pomerium.io
Tester le flux d’authentification
Section intitulée « Tester le flux d’authentification »-
Ouvrez le service Verify dans votre navigateur
Rendez-vous sur :
https://verify.localhost.pomerium.ioVotre navigateur affichera un avertissement de certificat auto-signé. C’est normal en lab — Pomerium génère un certificat auto-signé quand aucun n’est fourni.
Pour contourner l’avertissement :
- Chrome / Edge : cliquez n’importe où dans la page et tapez
thisisunsafe(sans espaces, sans champ de saisie visible) puis Entrée - Firefox : cliquez “Avancé” → “Accepter le risque et poursuivre”
- Chrome / Edge : cliquez n’importe où dans la page et tapez
-
Authentifiez-vous
Pomerium vous redirige vers
authenticate.pomerium.app. Cette page propose plusieurs fournisseurs d’identité : Google, GitHub, etc.Choisissez un fournisseur (par exemple GitHub), autorisez l’accès, et Pomerium récupère votre email depuis le provider.
-
Vérifiez l’accès au service Verify
Après authentification, le service Verify affiche les informations de votre session : email, groupes, claims JWT. Cela confirme que Pomerium transmet correctement les headers d’identité.
-
Testez la route Grafana
Ouvrez
https://grafana.localhost.pomerium.io. Si vous êtes déjà authentifié, Pomerium vous laisse passer directement (la session est partagée). Vous arrivez sur la page de login Grafana. -
Testez la route Whoami
Ouvrez
https://whoami.localhost.pomerium.io. Le service Whoami affiche tous les headers HTTP de la requête. Repérez les headers ajoutés par Pomerium :X-Pomerium-Jwt-Assertion: le JWT contenant votre identitéX-Pomerium-Claim-Email: votre adresse emailX-Pomerium-Claim-Groups: vos groupes (si disponibles)
Vérifier avec curl
Section intitulée « Vérifier avec curl »Vous pouvez aussi vérifier le comportement depuis le terminal :
# Vérifie que Pomerium redirige vers l'authentification (302)curl -ksI https://verify.localhost.pomerium.io | head -5Résultat attendu :
HTTP/2 302location: https://authenticate.pomerium.app/.pomerium/sign_in?...x-pomerium-intercepted-response: trueLe code 302 confirme que Pomerium intercepte la requête et redirige vers le service d’authentification. Un accès non authentifié ne passe jamais directement à l’upstream.
Modifier la configuration
Section intitulée « Modifier la configuration »Pomerium recharge la configuration automatiquement quand le fichier
config.yaml est modifié (hot reload). Pas besoin de redémarrer les
conteneurs.
Ajouter une nouvelle application
Section intitulée « Ajouter une nouvelle application »Pour protéger une nouvelle application, ajoutez une route dans config.yaml.
Par exemple, pour ajouter un service Portainer :
routes: - from: https://verify.localhost.pomerium.io to: http://verify:8000 policy: - allow: or: - email: is: votre-email@example.com pass_identity_headers: true
- from: https://grafana.localhost.pomerium.io to: http://grafana:3000 allow_any_authenticated_user: true
- from: https://portainer.localhost.pomerium.io to: http://portainer:9000 allow_any_authenticated_user: trueAjoutez le service correspondant dans docker-compose.yaml et relancez :
docker compose up -dPomerium détecte le changement et applique la nouvelle route sans redémarrage.
Restreindre l’accès par email
Section intitulée « Restreindre l’accès par email »Pour limiter l’accès Grafana à un seul utilisateur, remplacez
allow_any_authenticated_user par une politique explicite :
- from: https://grafana.localhost.pomerium.io to: http://grafana:3000 policy: - allow: or: - email: is: alice@example.comDépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
ERR_CONNECTION_REFUSED sur le port 443 | Conteneur Pomerium non démarré | docker compose ps puis docker compose up -d |
| Certificat auto-signé bloquant | Navigateur refuse le certificat | Taper thisisunsafe dans la page (Chrome/Edge) |
no healthy upstream dans les logs | Le conteneur upstream n’est pas prêt | docker compose ps — vérifier que tous les conteneurs sont Up |
| Boucle de redirection infinie | Email dans config.yaml différent de celui utilisé | Vérifier que l’email correspond exactement |
config: updated config non affiché | Fichier config.yaml mal monté | Vérifier le volume dans docker-compose.yaml |
| Erreur 403 après authentification | Politique trop restrictive | Vérifier l’email dans la policy ou utiliser allow_any_authenticated_user |
ERR_CONNECTION_REFUSED en SSH Remote | Port 443 non forwardé | Forwarder le port 443 dans l’onglet Ports de VS Code |
Diagnostiquer une erreur 403
Section intitulée « Diagnostiquer une erreur 403 »L’erreur 403 est le problème le plus fréquent lors de la première utilisation. Elle signifie que vous êtes authentifié mais pas autorisé. Pomerium identifie votre email via le provider (Google, GitHub…) et le compare à la politique de la route.
Pour identifier le problème, consultez les logs :
docker compose logs pomerium | grep -i "email\|403\|unauthorized"Cherchez la ligne authorize check qui contient votre email réel et la raison
du refus :
{"email":"alice@gmail.com","allow":false,"allow-why-false":["email-unauthorized"]}Si l’email dans les logs ne correspond pas à celui dans config.yaml, corrigez
le fichier. Pomerium recharge la configuration automatiquement :
# Voir l'email actuel dans la configgrep "is:" config.yaml
# Corriger avec l'email réelsed -i 's/ancien-email@example.com/votre-vrai-email@gmail.com/' config.yamlPuis rafraîchissez la page dans le navigateur — le 403 disparaît sans redémarrage.
Pour voir les logs en temps réel :
docker compose logs -f pomeriumNettoyage
Section intitulée « Nettoyage »Pour arrêter et supprimer l’environnement de lab :
# Arrêter les conteneursdocker compose down
# Supprimer aussi les volumes (données Grafana, etc.)docker compose down -vÀ retenir
Section intitulée « À retenir »- Pomerium se déploie en une image Docker en mode all-in-one, avec un seul fichier de configuration
- Le domaine
*.localhost.pomerium.iopointe vers127.0.0.1— pas besoin de DNS local - Chaque route associe une URL publique (
from) à un service interne (to) avec une politique d’accès - Le service d’authentification hébergé (
authenticate.pomerium.app) permet de démarrer sans configurer d’IdP - Les headers
X-Pomerium-*transmettent l’identité à l’application upstream - La configuration se recharge à chaud — pas de redémarrage nécessaire
- En production, il faudra fixer le
COOKIE_SECRETet configurer votre propre IdP