Google OAuth avec Traefik – SSO sécurisé pour les services Docker

Vous en avez assez de tous vos services docker ayant leur propre système d'authentification? Pour ceux qui ne le font pas, détestez-vous l'authentification de base de Traefik? Ensuite, lisez la suite pour configurer Google OAuth avec Traefik. Profitez de la commodité de la connexion unique sécurisée pour vos services Docker.

J'étais tellement excité de découvrir que l'image de thomseddon, Traefik Forward Auth, pouvait sécuriser mes services Docker. Cette image fournit une authentification aval légère à l'aide de Traefik Google OAuth2.

Pourquoi utiliser Google OAuth pour les services Docker?

Google OAuth2 vous permet d'utiliser votre compte Google pour vous connecter à vos services. En utilisant Google OAuth avec Traefik vous permettra d'ajouter des comptes à la liste blanche, de mettre en œuvre le 2FA de Google et de fournir une connexion unique (SSO) à vos services. Cela offre non seulement la commodité de ne pas se connecter fréquemment, mais améliore également la sécurité.

Pour cette raison, notre configuration de maison intelligente, qui utilise plusieurs services de docker, a récemment activé Google OAuth SSO pour de nombreux services.

Si vous exécutez déjà un serveur multimédia Docker derrière un proxy inverse Traefik, il s'agit de la prochaine étape logique. Ajouter Google OAuth avec Traefik pour vos services Docker sera une étape facile.

Notez que ce guide concerne Traefik v1.7.16. Traefik 2 est déjà sorti mais Traefik 1 fonctionne toujours très bien. Un guide Traefik 2 est en cours d'élaboration.

16 décembre 2019: Nous avons publié un premier projet de configuration de Docker Media Server avec Traefik 2.1. De nombreuses applications fonctionnent, mais à ce stade, il y a encore des choses qui doivent être optimisées / corrigées. Veuillez consulter notre référentiel Docker-Traefik pour les fichiers pertinents. Un guide séparé pour Traefik 2 sera publié dans les prochains jours.

17 septembre 2019: Traefik 2.0 est sorti hier. Ce guide a été modifié pour continuer à fonctionner avec Traefik v1.7.16, qui fonctionne toujours très bien. À ce stade, nous vous recommandons de vous en tenir à Traefik v1.7.16 utilisé dans ce guide. Traefik 2.0 est très différent et un guide séparé pourrait être publié à l'avenir. Si votre traefik ne fonctionne plus, changez l'image de dernier à v1.7.16 dans le docker-composer de traefik et recréez le conteneur.

Comment vérifier si mes identifiants de connexion sont déjà compromis?

En gardant à l'esprit la sécurité et la confidentialité, notre objectif pour ce guide Docker Google OAuth est de limiter l'accès uniquement aux utilisateurs autorisés. Par conséquent, nous devons commencer par examiner la qualité de nos informations d'identification et si ces informations d'identification sont déjà sujettes à des attaques.

Les pirates utiliseront les noms d'utilisateur et les mots de passe des violations de données dans leurs attaques, je vous recommande donc fortement d'aller sur Have I Been Pwned et de vérifier à la fois vos e-mails et vos mots de passe. Ai-je été pwned a construit une base de données d'informations qui ont été compromises lors d'une violation de données, et ce site comparera vos informations d'identification à celles de la base de données.

Maintenant, vous demandez peut-être – Comment puis-je savoir que je peux faire confiance à ce site Web avec des informations aussi sensibles?

L'astuce pour comparer ces valeurs en toute sécurité est que les données sont stockées sous la forme d'un hachage SHA-1 et d'un abréviation de votre les données sont vérifiées par rapport à cette liste. Pour en savoir plus, consultez cette vidéo pour une excellente explication et une explication de la façon dont tout cela fonctionne.

Protection des services Docker avec l'authentification de base de Traefik

L'ajout de l'authentification de base fournie par Traefik est le moyen le plus simple de protéger vos services Docker.

Dans notre guide précédent, nous avons expliqué comment utiliser Identifiants de connexion .htpasswd en ajoutant l'étiquette:

- "traefik.frontend.auth.basic.users = $ {HTTP_USERNAME}: $ {HTTP_PASSWORD}"

Pour un seul service, cela peut être utile, mais j'ai trouvé que cela devenait rapidement gênant et fastidieux une fois que je devais me connecter à plusieurs services et pour chaque session de navigateur.

Guides recommandés:

Après la mise en œuvre Authentification directe Traefik, Je n'ai plus besoin de me connecter qu'une seule fois et en implémentant Google OAuth avec Traefik Je peux ajouter une authentification à 2 facteurs (2FA), ce qui rend cette méthode beaucoup plus sûre et pratique que l'utilisation de l'authentification de base.

Configurer Google OAuth SSO pour Docker

Qu'est-ce que OAuth?

OAuth est un standard ouvert pour la délégation d'accès, couramment utilisé comme moyen pour les utilisateurs d'Internet d'accorder aux sites Web ou aux applications l'accès à leurs informations sur d'autres sites Web mais sans leur donner les mots de passe. Ce mécanisme est utilisé par des sociétés comme Amazon, Google, Facebook, Microsoft et Twitter pour permettre aux utilisateurs de partager des informations sur leurs comptes avec des applications ou des sites Web tiers. »- Wikipedia

Avant de configurer Google OAuth pour Docker à l'aide de Traefik, comment tout cela s'assemble.

Comment fonctionne Google OAuth avec Traefik?

Google OAuth avec Traefik agit comme un contrôleur d'accès pour vos services, autorisant ou refusant l'accès après avoir recherché un cookie autorisé dans votre navigateur. Pour résumer, le processus ressemble à ceci:

  1. Une demande est faite pour notre Hôte (par exemple: https://traefik.example.com)
  2. La demande est acheminée par notre fournisseur DNS vers notre IP WAN, où les ports 80 et 443 sont transmis au conteneur Traefik.
  3. Traefik voit la demande entrante et reconnaît que Autorisation avant est défini dans le Étiquettes pour ça Hôte, la demande est donc transmise au Traefik Forward Auth récipient.
  4. Le conteneur vérifie ensuite si le navigateur possède déjà un cookie autorisé. S'il n'y a pas de cookie, la demande est envoyée à Serveur d'autorisation OAuth2 de Google.
  5. Une fois connecté à Google, la demande est envoyée au rediriger l'URI identifié pour le Application Web (https://oauth.example.com/_oauth).
  6. Un cookie autorisé est ensuite enregistré dans le navigateur et l'utilisateur est envoyé au service backend.

La prochaine fois que ce navigateur tentera d'accéder à un service protégé par OAuth, le cookie sera reconnu et l'utilisateur sera amené à leur service, sans être invité à se connecter!

Traefik Forward Auth avec Google OAuth – Flux de processus

Ce processus se déroule très rapidement et une fois que votre navigateur reçoit le cookie, vous oublierez que vous avez même activé Google OAuth avec Traefik!

Remarque: L'image Traefik Forward Auth utilise OpenID Relier (OIDC), qui est une couche d'authentification au-dessus du protocole OAuth 2.0. Cette image prend actuellement en charge Google en tant que fournisseur OIDC, mais il semble que le support OIDC pour d'autres fournisseurs arrive bientôt.

Avec les bases prises en charge, passons à la configuration de Google OAuth Authentification directe Traefik pour nos services Docker.

Comment configurer OAuth?

La configuration de Google OAuth pour Docker à l'aide de Traefik comprend 3 étapes: 1) créer des enregistrements DNS, 2) configurer le service Google OAuth2 et 2) modifier les fichiers de composition Docker et ajouter les étiquettes Traefik pour activer l'authentification directe.

Donc, nous devons d'abord configurer le service Google OAuth. Configurons maintenant toutes les conditions préalables:

Étape 1: créer des enregistrements DNS

Commencez par créer un nouvel enregistrement DNS CNAME pour notre service OAuth (Google redirigera vers cette adresse après l'authentification). Pour plus de clarté, tout au long de ce guide, nous utiliserons le nom de domaine "Example.com".

Définissez l'enregistrement DNS comme oauth.example.com. Les images ci-dessous une capture d'écran de Cloudflare. Selon votre fournisseur DNS, les choses peuvent vous sembler différentes, mais elles ont essentiellement le même contenu.

Créer des enregistrements DNS pour Google OAuth2

Créer des enregistrements DNS pour Google OAuth2

Notez que les enregistrements DNS peuvent prendre plusieurs nôtres pour se propager et devenir actifs.

Étape 2: configurer le service Google OAuth2

Une fois les enregistrements DNS créés, passons à la configuration de Google OAuth.

Étape 2a: créer un projet Google

Nous devons créer un Projet Google qui contiendra notre Web App, Écran de consentement, et Identifiants. Ce processus est très similaire à ce qui est décrit dans notre guide sur la configuration de Google Assistant pour Home Assistant.

Accédez à Google Cloud Developers Console et assurez-vous que vous êtes connecté au bon compte Google que vous souhaitez utiliser (ce sera normalement votre propre adresse e-mail).

Remarque: Déconnectez-vous des autres comptes Google actifs pour vous assurer que le bon compte est utilisé à chaque étape.

Si vous y êtes invité, vous devrez accepter les Conditions d'utilisation de Google Cloud Platform afin d'utiliser leur API:

Conditions d'utilisation de Google

Conditions d'utilisation de Google

L'utilisation du service OAuth de Google est gratuite, nous pouvons donc Rejeter l'essai gratuit pour l'instant. Cliquer sur Sélectionnez un projet et Nouveau projet.

Créer un nouveau projet pour OAuth

Créer un nouveau projet pour OAuth

Entrez un nom unique pour identifier le projet, tel que «Authentification Traefik». Cliquez sur Créer.

Détails du nouveau projet Google OAuth

Détails du nouveau projet Google OAuth

Étape 2b: créer des informations d'identification OAuth

Maintenant que notre projet a été créé, nous devons créer un identité du client et secret client afin de s'authentifier auprès de Google. Choisissez notre Authentification Traefik projet, et dans le menu Navigation, sélectionnez API et services> Identifiants. Cliquer sur Créer des informations d'identification> ID client OAuth.

Accédez à Créer un ID client OAuth

Accédez à Créer un ID client OAuth

Étape 2c: configurer l'écran de consentement

Une fois que vous avez cliqué ID client OAuth, vous verrez la note pour configurer l'écran de consentement comme indiqué ci-dessous. Un écran de configuration de consentement est requis avant de continuer.

Configurer l'écran de consentement pour Google OAuth2

Configurer l'écran de consentement pour Google OAuth2

Si vous n'êtes pas automatiquement invité, sélectionnez Écran de consentement OAuth à partir du panneau de gauche.

Choisissez un nom pour votre application, tel que "Traefik Auth ”, puis sous le Domaines autorisés entrez votre domaine, par exemple, "Example.com". Assurez-vous d'appuyer sur Entrer pour l'ajouter, puis cliquez sur sauvegarder.

Créer un écran de consentement OAuth

Créer un écran de consentement OAuth

Après avoir frappé sauvegarder, vous reviendrez à la création d'un ID client OAuth.

Étape 2d: créer l'ID client OAuth

Sélectionnez maintenant le Application Web tapez et entrez un nom pour votre application Web, tel que «Traefik». De plus, vous devrez saisir votre URI de redirection autorisée comme https://oauth.example.com/_oauth. Assurez-vous d'appuyer sur Entrer pour l'ajouter, puis cliquez sur sauvegarder.

Remarque: Vous êtes seulement autorisé à ajouter rediriger les URI directement à votre Domaines autorisés. Revenez à l'écran de consentement OAuth si vous devez les modifier.

Création d'un ID client OAuth

Création d'un ID client OAuth

Les informations d'identification pour notre SSO pour Docker ont été créées! Copiez et enregistrez le identité du client et secret client; nous devons les utiliser à l'étape suivante.

Informations d'identification du client Google OAuth

Informations d'identification du client Google OAuth

Étape 3: configuration de l'authentification directe Traefik

Maintenant que les informations d'identification OAuth ont été configurées, la dernière chose à faire est de configurer le conteneur OAuth. Connectez-vous à votre ordinateur local ou utilisez l'un des nombreux super clients SSH pour vous connecter à distance.

Guides recommandés:

Assurez-vous d'arrêter Traefik (si nécessaire) et modifiez votre fichier Docker-compose pour ajouter les étiquettes Traefik et le conteneur OAuth.

Étape 3a: ajouter le conteneur Traefik OAuth

Ouvrez votre fichier docker-compose qui a été créé sur la base de notre précédent tutoriel Traefik et ajoutez-y ce qui suit.

## OAuth - Authentification directe
  oauth:
    image: thomseddon / traefik-forward-auth
    nom_conteneur: oauth
    nom d'hôte: oauth
    redémarrer: toujours
    réseaux:
      - défaut
      - traefik_proxy
    environnement:
      PROVIDERS_GOOGLE_CLIENT_ID: $ {GOOGLE_CLIENT_ID}
      PROVIDERS_GOOGLE_CLIENT_SECRET: $ {GOOGLE_CLIENT_SECRET}
      SECRET: $ {OAUTH_SECRET}
      COOKIE_DOMAIN: $ {DOMAINNAME}
      INSECURE_COOKIE: "faux"
      AUTH_HOST: oauth. $ {DOMAINNAME}
      URL_PATH: / _oauth
      LISTE BLANCHE: $ {MY_EMAIL}
      LOG_LEVEL: info
      DURÉE DE VIE: 2592000 # 30 jours
    Étiquettes:
      traefik.enable: "true"
      traefik.backend: oauth
      traefik.port: 4181
      traefik.frontend.rule: Hôte: oauth. $ {DOMAINNAME}
      traefik.frontend.headers.SSLHost: oauth. $ {DOMAINNAME}
      traefik.docker.network: traefik_proxy
      traefik.frontend.passHostHeader: "true"
      traefik.frontend.headers.SSLForceHost: "vrai"
      traefik.frontend.headers.customResponseHeaders: X-Robots-Tag: noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex
      traefik.frontend.headers.SSLRedirect: "true"
      traefik.frontend.headers.browserXSSFilter: "true"
      traefik.frontend.headers.contentTypeNosniff: "vrai"
      traefik.frontend.headers.forceSTSHeader: "true"
      traefik.frontend.headers.STSSecondes: 315360000
      traefik.frontend.headers.STSIncludeSubdomains: "true"
      traefik.frontend.headers.STSPreload: "true"
      traefik.frontend.headers.frameDeny: "vrai"
      traefik.frontend.auth.forward.address: "http: // oauth: 4181"
      traefik.frontend.auth.forward.authResponseHeaders: X-Forwarded-User
      traefik.frontend.auth.forward.trustForwardHeader: "true"

Remarque: le réseaux le bloc doit déjà être défini comme décrit dans notre guide précédent, sinon vous rencontrerez des erreurs. Les réseaux traefik_proxy et défaut doit déjà être défini dans votre fichier docker-compose.

Remplacer / configurer:

  • Entrer le $ GOOGLE_CLIENT_ID et $ GOOGLE_CLIENT_SECRET nous avons reçu à l'étape précédente.
  • le $ OAUTH_SECRET est utilisé pour signer le cookie et doit être aléatoire. Générez un secret aléatoire avec:
    openssl rand -hex 16
    

    Alternativement, vous pouvez utiliser un service en ligne comme celui-ci, pour générer votre secret aléatoire.

    Secret OAuth aléatoire

  • LISTE BLANCHE toutes les adresses e-mail Google, séparées par des virgules, auxquelles vous souhaitez autoriser l'accès. Mise en garde: Si aucune adresse e-mail ne figure sur la liste blanche, toute personne possédant un compte Google peut y accéder!

Notez que le URL_PATH est le même chemin que le URI de redirection autorisé (https://oauth.example.com/ _oauth).

Étape b 3b: Ajout de Google OAuth pour les services Docker

Très bien, testons-le! Avec le conteneur OAuth ajouté à notre pile, nous pouvons maintenant ajouter les étiquettes Traefik aux autres services pour activer l'authentification directe Traefik pour eux. À titre d'exemple, remplaçons l'authentification de base pour le tableau de bord Traefik, définie dans notre guide Traefik précédent, par Google OAuth2.

Pour ce faire, ajoutez les 3 étiquettes traefik suivantes aux services:

            traefik.frontend.auth.forward.address: "http: // oauth: 4181"
      traefik.frontend.auth.forward.authResponseHeaders: X-Forwarded-User
      traefik.frontend.auth.forward.trustForwardHeader: "true"

L'ensemble du docker-compose pour Traefik devrait ressembler à ceci (authentification de base désactivée en commentant avec un #):

## Traefik - Proxy inverse
  traefik:
    image: traefik: v1.7.16
    nom_conteneur: traefik
    nom d'hôte: traefik
    redémarrage: à moins qu'il ne soit arrêté
    réseaux:
      - défaut
      - traefik_proxy
    ports:
      - "80:80"
      - "443: 443"
      - "8145: 8080"
    nom de domaine: $ {DOMAINNAME}
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - $ {USERDIR} / docker / traefik: / etc / traefik
      - $ {USERDIR} / docker / shared: / shared
    environnement:
      CF_API_EMAIL: $ {CLOUDFLARE_EMAIL}
      CF_API_KEY: $ {CLOUDFLARE_API_KEY}
    Étiquettes:
      traefik.enable: "true"
      traefik.backend: traefik
      traefik.protocol: http
      traefik.port: 8080
      traefik.frontend.rule: Hôte: traefik. $ {DOMAINNAME}
      traefik.frontend.headers.SSLHost: traefik. $ {DOMAINNAME}
      traefik.docker.network: traefik_proxy
      traefik.frontend.passHostHeader: "true"
      traefik.frontend.headers.SSLForceHost: "vrai"
      traefik.frontend.headers.SSLRedirect: "true"
      traefik.frontend.headers.browserXSSFilter: "true"
      traefik.frontend.headers.contentTypeNosniff: "vrai"
      traefik.frontend.headers.forceSTSHeader: "true"
      traefik.frontend.headers.STSSecondes: 315360000
      traefik.frontend.headers.STSIncludeSubdomains: "true"
      traefik.frontend.headers.STSPreload: "true"
      traefik.frontend.headers.customResponseHeaders: X-Robots-Tag: noindex, nofollow, nosnippet, noarchive, notranslate, noimageindex
      traefik.frontend.headers.frameDeny: "vrai"
      traefik.frontend.headers.customFrameOptionsValue: 'allow-from https: $ {DOMAINNAME}'
# traefik.frontend.auth.basic.users: '$ {HTTP_USERNAME}: $ {HTTP_PASSWORD}'
      traefik.frontend.auth.forward.address: "http: // oauth: 4181"
      traefik.frontend.auth.forward.authResponseHeaders: X-Forwarded-User
      traefik.frontend.auth.forward.trustForwardHeader: "true"

Enregistrez les fichiers de composition et mettez à jour votre pile à l'aide du docker-compose up -d comme décrit dans notre guide Docker précédent.

Essayez maintenant d'accéder au tableau de bord de Traefik sur un navigateur Web. Vous devez être dirigé vers la page de connexion de Google:

Écran de connexion à Google OAuth

Écran de connexion à Google OAuth

Après vous être connecté à l'aide de votre e-mail sur liste blanche, vous devez être redirigé vers votre tableau de bord Traefik. C'est aussi simple que ça!

En d'autres termes, Google a donné un cookie autorisé pour notre $ DOMAINNAME à notre navigateur Web. Ce navigateur Web restera autorisé pour tout autre service utilisant le même $ DOMAINNAME pendant le $ LIFETIME du cookie, ou jusqu'à ce que nous nous déconnections du compte.

Étape 3d: Ajout d'OAuth à d'autres services

Comme décrit précédemment, vous devez simplement ajouter les trois étiquettes suivantes afin d'ajouter la protection OAuth à d'autres services:

            traefik.frontend.auth.forward.address: "http: // oauth: 4181"
      traefik.frontend.auth.forward.authResponseHeaders: X-Forwarded-User
      traefik.frontend.auth.forward.trustForwardHeader: "true"

le auth.forward.address label indique à Traefik où envoyer la demande. Ici, nous profitons de la mise en réseau interne de Docker, en envoyant la demande à notre conteneur nommé oauth au port 4181.

Étape 4: Mettre des applications non Docker derrière OAuth

OAuth fonctionne très bien pour toutes les applications de docker. Que faire si vous avez des applications non-docker qui s'exécutent sur votre hôte docker ou tout autre système de votre réseau (par exemple, PiHole, Webmin, Synology DSM, etc.)?

Vous pouvez également mettre des applications non-docker derrière Google OAuth2. Il vous suffit de créer des règles Traefik. Vous pouvez voir mon exemple sur GitHub.

Donc, si vous avez configuré Traefik pour utiliser le dossier de règles (dans traefik.toml), créez un nouveau fichier (par exemple. appname.toml) et ajoutez-y ce qui suit. Assurez-vous de remplacer ce qui doit être remplacé.

# Remplacez APPNAME, LAN-IP, PORT, example.com
[backends]
  [backends.backend-APPNAME]
    [backends.backend-APPNAME.servers]
      [backends.backend-APPNAME.servers.server-APPNAME-ext]
        
        url = "http: // LAN-IP: PORT"
        poids = 0
[frontends]
  [frontends.frontend-APPNAME]
    
    backend = "backend-APPNAME"
    passHostHeader = true
    [frontends.frontend-APPNAME.routes]
          [frontends.frontend-APPNAME.routes.route-APPNAME-ext]
        
        rule = "Hôte: APPNAME.example.com"
    [frontends.frontend-APPNAME.headers]
      SSLRedirect = true
      SSLHost = "APPNAME.example.com"
      SSLForceHost = true
      STSSecondes = 315360000
      STSIncludeSubdomains = true
      STSPreload = true
      forceSTSHeader = true
      frameDeny = true
      contentTypeNosniff = true
      browserXSSFilter = true
      customFrameOptionsValue = "autoriser depuis https: example.com"
    [frontends.frontend-APPNAME.auth]
      headerField = "X-WebAuth-User"
      [frontends.frontend-APPNAME.auth.forward]
        address = "http: // oauth: 4181"
        trustForwardHeader = true
        authResponseHeaders = ["X-Forwarded-User"]

Désormais, chaque fois que vous accédez à ces applications, vous devez vous présenter avec la connexion Google.

Limitations de la configuration de Docker Google OAuth

Si tout était si bien, alors pourquoi ne pas ajouter Google OAuth2 à tous les services de docker? J'ai constaté que certains services ne peuvent pas rediriger l'utilisateur vers l'écran de connexion (comme la plupart des applications mobiles).

Par exemple, je ne pouvais pas activer l'authentification directe Traefik à l'aide de Google OAuth pour des services comme sonarr, radarr, etc. Ce n'était pas parce que ces services sont incompatibles. C'est parce que j'utilisais l'application NZB360 pour gérer ces applications à partir de mon smartphone. Traefik Google OAuth a interféré avec cette application pouvant se connecter aux services. Dans cette situation, vous ne pouvez pas utiliser OAuth ou commencer à utiliser un navigateur au lieu de l'application pour smartphone.

Mais ce problème n'est pas unique à Google OAuth uniquement. Vous rencontrerez le même problème si vous activez l'authentification de base de Traefi pour des services similaires (par exemple, Radarr, Sonarr, etc.). Juste quelque chose à savoir.

FAQ

Quelle est la différence entre OIDC et OAuth?

OIDC ou OpenID Connect (OIDC) est un protocole d'authentification. Il s'agit d'un ensemble de spécifications basées sur OAuth 2.0, qui ajoute des fonctionnalités supplémentaires. En substance, OIDC est le protocole authentique tandis que OAuth est l'ensemble de spécifications pour l'accès et le partage des ressources.

Dernières pensées

La mise en œuvre de Google OAuth avec l'authentification directe Traefik a été l'un des moyens les plus simples et les plus sécurisés pour moi de protéger mes services de docker. En ajoutant des comptes à la liste blanche et en mettant en œuvre le 2FA de Google, je suis convaincu que je serai le seul à pouvoir accéder à ces services.

J'ai écrit cet article en pensant à Traefik v1. Traefik v2 est déjà sorti mais Traefik v1 fonctionne toujours très bien et il n'y a aucun problème connu à la suite de cela.

Cela dit, nous publierons un tutoriel mis à jour pour Traefik v2. Alors restez à l'écoute!

J'espère que vous avez aimé découvrir Google OAuth avec Traefik pour les services Docker! Si vous avez des questions, n'hésitez pas à laisser un commentaire ci-dessous.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.