Aller au contenu
Sécurité medium

Installer Pomerium avec Docker Compose

14 min de lecture

logo pomerium

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.

À 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érequisVersion minimaleVérification
Docker20+docker --version
Docker Composev2+docker compose version
Navigateur webRécent
Compte emailQuelconquePour l’authentification

Le lab déploie 4 conteneurs sur un réseau Docker interne :

Architecture du lab Pomerium avec Docker Compose

Seul le port 443 de Pomerium est exposé sur l’hôte. Les applications upstream ne sont accessibles que via Pomerium.

  1. Créez le répertoire du lab

    Fenêtre de terminal
    mkdir -p ~/Projets/pomerium-lab && cd ~/Projets/pomerium-lab
  2. 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.app
    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://whoami.localhost.pomerium.io
    to: http://whoami:80
    allow_any_authenticated_user: true

    Remplacez votre-email@example.com par votre adresse email réelle. C’est l’email avec lequel vous vous authentifierez.

  3. Créez le fichier Docker Compose

    docker-compose.yaml
    services:
    pomerium:
    image: pomerium/pomerium:v0.32.4
    volumes:
    - ./config.yaml:/pomerium/config.yaml:ro
    ports:
    - 443:443
    verify:
    image: pomerium/verify:latest
    expose:
    - "8000"
    grafana:
    image: grafana/grafana:latest
    expose:
    - "3000"
    whoami:
    image: traefik/whoami:latest
    expose:
    - "80"

Avant de démarrer, détaillons les éléments clés du fichier config.yaml :

authenticate_service_url: https://authenticate.pomerium.app

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

Chaque route définit un point d’entrée (from) et une destination (to) :

ChampRôleExemple
fromURL publique que l’utilisateur tape dans son navigateurhttps://grafana.localhost.pomerium.io
toAdresse du service en amont, sur le réseau Dockerhttp://grafana:3000
policyRègles d’accès (qui peut entrer)Voir ci-dessous

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

Politique ouverte (routes Grafana et Whoami) — tout utilisateur authentifié peut accéder, quel que soit son email :

allow_any_authenticated_user: true
pass_identity_headers: true

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

  1. Téléchargez les images Docker

    Fenêtre de terminal
    docker compose pull

    Résultat attendu :

    ✔ Image grafana/grafana:latest Pulled
    ✔ Image pomerium/pomerium:v0.32.4 Pulled
    ✔ Image traefik/whoami:latest Pulled
  2. Démarrez les services

    Fenêtre de terminal
    docker compose up -d

    Ré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
  3. Vérifiez que tous les conteneurs tournent

    Fenêtre de terminal
    docker compose ps

    Les 4 conteneurs doivent avoir le statut Up :

    NAME IMAGE STATUS PORTS
    pomerium-lab-grafana-1 grafana/grafana:latest Up 3000/tcp
    pomerium-lab-pomerium-1 pomerium/pomerium:v0.32.4 Up 0.0.0.0:443->443/tcp
    pomerium-lab-verify-1 pomerium/verify:latest Up 8000/tcp
    pomerium-lab-whoami-1 traefik/whoami:latest Up 80/tcp
  4. Vérifiez les logs Pomerium

    Fenêtre de terminal
    docker compose logs pomerium | head -15

    Vous 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"}

Si Docker tourne directement sur votre machine, ouvrez simplement les URLs dans votre navigateur :

  • https://verify.localhost.pomerium.io
  • https://grafana.localhost.pomerium.io
  • https://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.

  1. Ouvrez le service Verify dans votre navigateur

    Rendez-vous sur : https://verify.localhost.pomerium.io

    Votre 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”
  2. 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.

  3. 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é.

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

  5. 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 email
    • X-Pomerium-Claim-Groups : vos groupes (si disponibles)

Vous pouvez aussi vérifier le comportement depuis le terminal :

Fenêtre de terminal
# Vérifie que Pomerium redirige vers l'authentification (302)
curl -ksI https://verify.localhost.pomerium.io | head -5

Résultat attendu :

HTTP/2 302
location: https://authenticate.pomerium.app/.pomerium/sign_in?...
x-pomerium-intercepted-response: true

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

Pomerium recharge la configuration automatiquement quand le fichier config.yaml est modifié (hot reload). Pas besoin de redémarrer les conteneurs.

Pour protéger une nouvelle application, ajoutez une route dans config.yaml. Par exemple, pour ajouter un service Portainer :

config.yaml
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: true

Ajoutez le service correspondant dans docker-compose.yaml et relancez :

Fenêtre de terminal
docker compose up -d

Pomerium détecte le changement et applique la nouvelle route sans redémarrage.

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.com
SymptômeCause probableSolution
ERR_CONNECTION_REFUSED sur le port 443Conteneur Pomerium non démarrédocker compose ps puis docker compose up -d
Certificat auto-signé bloquantNavigateur refuse le certificatTaper thisisunsafe dans la page (Chrome/Edge)
no healthy upstream dans les logsLe conteneur upstream n’est pas prêtdocker compose ps — vérifier que tous les conteneurs sont Up
Boucle de redirection infinieEmail 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 authentificationPolitique trop restrictiveVérifier l’email dans la policy ou utiliser allow_any_authenticated_user
ERR_CONNECTION_REFUSED en SSH RemotePort 443 non forwardéForwarder le port 443 dans l’onglet Ports de VS Code

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 :

Fenêtre de terminal
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 :

Fenêtre de terminal
# Voir l'email actuel dans la config
grep "is:" config.yaml
# Corriger avec l'email réel
sed -i 's/ancien-email@example.com/votre-vrai-email@gmail.com/' config.yaml

Puis rafraîchissez la page dans le navigateur — le 403 disparaît sans redémarrage.

Pour voir les logs en temps réel :

Fenêtre de terminal
docker compose logs -f pomerium

Pour arrêter et supprimer l’environnement de lab :

Fenêtre de terminal
# Arrêter les conteneurs
docker compose down
# Supprimer aussi les volumes (données Grafana, etc.)
docker compose down -v
  • Pomerium se déploie en une image Docker en mode all-in-one, avec un seul fichier de configuration
  • Le domaine *.localhost.pomerium.io pointe vers 127.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_SECRET et configurer votre propre IdP

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn