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.

Remarque: Cet article est co-écrit par Anand et Seth.

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. Cela a également été démontré dans notre guide Traefik 2 Docker.

Ce guide a été écrit à l'origine pour Traefik v1.7.16 mais a depuis été mis à jour vers Traefik v2.2 (à ce moment). Mais dans ce guide Traefik OAuth, je fournirai également des instructions pour Traefik 1 (cela peut être supprimé à un moment donné à l'avenir).

2 juin 2020: Instructions mises à jour pour Traefik v2.2, qui est maintenant la version par défaut et recommandée de Traefik. À l'avenir, nous ne mettrons pas à jour les fichiers associés à Traefik v1.7 dans notre GitHub Repo.

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 de docker (Traefik 2).

            - "traefik.http.middlewares.test-auth.basicauth.users = user1: $$ apr1 $$ H6uskkkW $$ IgXLP6ewTrSuBkTrqE8wj /, user2: $$ apr1 $$ d9hr9HBB $$ 4HxwgUir3HP4EsggP / QN

Dans notre guide précédent, nous avons expliqué comment utiliser Identifiants de connexion .htpasswd et les middlewares Traefik 2 pour ajouter une authentification de base à l'aide d'étiquettes (Traefik 2):

            - "trae[email protected]fichier" 

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

2 juin 2020: J'ai maintenant ajouté Authelia en tant que système d'authentification multifacteur privé et je l'utilise exclusivement à la place d'OAuth. Mais en laissant OAuth dans ma configuration et dans mon référentiel GitHub en tant que sauvegarde pour ceux qui préfèrent Google OAuth.

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 telles qu'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. » – Wikipédia

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 depuis le 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 sauver.

Créer un écran de consentement OAuth

Créer un écran de consentement OAuth

Après avoir frappé sauver, 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 sauver.

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.

Authentification OAuth Forward pour Traefik 2

Comme mentionné précédemment, Traefik 2 est désormais la version de proxy inverse recommandée. Alors vérifions-le d'abord. L'hypothèse est que vous avez déjà lu et suivi la plupart de mon guide Traefik 2 et que vous lisez cet article juste pour implémenter Google OAuth. Si vous utilisez Traefik v1, passez à la section suivante.

En utilisant des middlewares et des chaînes externes, nous pouvons simplifier notre configuration, éviter les erreurs et rendre notre configuration beaucoup plus facile à mettre à jour. Nous pouvons réutiliser nos en-têtes de sécurité pour améliorer la sécurité de la transmission des données.

Étape I: création du middleware et de la chaîne OAuth

Précisons maintenant un middleware pour OAuth. Ouvert middlewares.toml fichier et ajoutez les lignes suivantes ci-dessous ce qui est déjà présent:

  [http.middlewares.middlewares-oauth]
    [http.middlewares.middlewares-oauth.forwardAuth]
      
      address = "http: // oauth: 4181" # Assurez-vous que vous disposez du service OAuth dans docker-compose.yml
      trustForwardHeader = true
      authResponseHeaders = ["X-Forwarded-User"]

De plus, créons une nouvelle chaîne de middleware pour les services qui utiliseront Google OAuth. Ouvert middleware-chains.toml et ajoutez les lignes suivantes ci-dessous ce qui est déjà présent:

  [http.middlewares.chain-oauth]
    [http.middlewares.chain-oauth.chain]
      
      middlewares = [ "middlewares-rate-limit", "middlewares-secure-headers", "middlewares-oauth"]

Ensuite, laissez-nous configurer le conteneur OAuth Forwarder.

Étape II: ajouter un conteneur de transitaire OAuth

Ouvrez votre fichier docker-compose (docker-compose-t2.yml) qui a été créé sur la base de notre précédent didacticiel Traefik 2 et ajoutez ce qui suit.

    # Google OAuth - Authentification unique à l'aide d'OAuth 2.0 pour Traefik 2.2
  oauth:
    nom_conteneur: oauth
    image: thomseddon / traefik-forward-auth: dernier
    # image: thomseddon / traefik-forward-auth: 2.1-bras # Utilisez cette image avec Raspberry Pi
    redémarrage: à moins qu'il ne soit arrêté
    réseaux:
      - t2_proxy
    security_opt:
      - pas de nouveaux privilèges: vrai
    environnement:
      - CLIENT_ID = $ GOOGLE_CLIENT_ID
      - CLIENT_SECRET = $ GOOGLE_CLIENT_SECRET
      - SECRET = $ OAUTH_SECRET
      - COOKIE_DOMAIN = $ DOMAINNAME
      - INSECURE_COOKIE = false
      - AUTH_HOST = oauth. $ DOMAINNAME
      - URL_PATH = / _ oauth
      - WHITELIST = $ MY_EMAIL
      - LOG_LEVEL = avertir
      - LOG_FORMAT = texte
      - DURÉE DE VIE = 2592000 # 30 jours
      - DEFAULT_ACTION = auth
      - DEFAULT_PROVIDER = google
    Étiquettes:
      - "traefik.enable = true"
      ## Routeurs HTTP
      - "traefik.http.routers.oauth-rtr.entrypoints = https"
      - "traefik.http.routers.oauth-rtr.rule = Hôte (` oauth. $ DOMAINNAME`) ""
      ## Middlewares
      - "[email protected]"
      ## Services HTTP
      - "traefik.http.routers.oauth-rtr.service = oauth-svc"
      - "traefik.http.services.oauth-svc.loadbalancer.server.port = 4181"
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. Le réseau t2_proxy doit déjà être défini dans votre fichier docker-compose.

Notez que nous utilisons la chaîne de middleware OAuth (chaîne-oauth) ici pour l'authentification au lieu de l'authentification de base. Avant de démarrer le service OAuth, assurez-vous d'avoir ajouté les variables d'environnement suivantes à votre .env fichier:

  • Image: Utilisez l'image correcte pour l'architecture de votre système. Par exemple, Raspberry Pi a une balise d'image différente.
  • GOOGLE_CLIENT_ID et GOOGLE_CLIENT_SECRET: Obtenu en suivant notre guide Traefik Google OAuth 2.0.
  • OAUTH_SECRET: Ceci 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

  • MON EMAIL: Identifiant e-mail Google qui sera utilisé pour l'authentification.
  • URL_PATH: C'est le même chemin que le URI de redirection autorisé (https://oauth.example.com/ _oauth), comme expliqué dans notre guide Traefik Google OAuth 2.0.

Si vous souhaitez que plusieurs identifiants de messagerie puissent s'authentifier et accéder à vos services, utilisez différentes variables (par exemple, MY_EMAIL2, MY_EMAIL3, etc.) et répertoriez-les toutes séparées par des virgules pour LISTE BLANCHE:

            - WHITELIST = $ MY_EMAIL, $ MY_EMAIL2, $ MY_EMAIL3

Vous pouvez également modifier la durée (DURÉE DE VIE) pour laquelle l'authentification est valable de 30 jours spécifiés en secondes à une autre durée. Facultativement, le reste des variables d'environnement définies pour le oauth peut être configuré à votre guise (si vous savez ce que vous faites).

Remarque: Si vous devez vous déconnecter, déconnectez-vous de vos services Google dans tout autre onglet / fenêtre et votre OAuth pour les services sera invalidé.

Une fois cela fait, utilisez la commande docker-compose up listée ci-dessus ou le raccourci dcup2 si vous avez configuré bash_aliases. Vous devez maintenant être redirigé vers la page de connexion de Google OAuth avant d'accéder au service.

Connexion Google OAuth pour les services Docker

Connexion Google OAuth pour les services Docker

Étape II: Ajout de Google OAuth pour les services Docker

Prenons l'exemple de Traefik 2 Dashboard. À ce stade (guide précédent), il est configuré pour utiliser l'authentification de base. Modifions-le maintenant pour utiliser Google OAuth. C'est aussi simple que de changer chaîne-basique-auth à chaîne-oauth dans le fichier Docker-compose (illustré ci-dessous).

            - "[email protected]" 

Alors voilà, Docker Traefik 2 s'installe avec Google OAuth 2.

Une fois cela fait, utilisez la commande docker-compose up (ou le raccourci dcup2 si vous avez configuré bash_aliases comme décrit dans mon tutoriel Docker Traefik 2).

Étape III: Ajout d'OAuth à d'autres services (non Docker)

Le fournisseur de fichiers de Traefik nous permet d'ajouter des routeurs, des middlewares et des services dynamiques. Auparavant, nous utilisions uniquement notre règles pour ajouter des middlewares, mais nous pouvons facilement ajouter un hôte externe en ajoutant un nouveau fichier à ce répertoire. Traefik détectera et mettra à jour automatiquement ses configurations.

[http.routers]
  [http.routers.hassio-rtr]
      
      entryPoints = ["https"]
      rule = "Hôte (` hassio.example.com`) "
      service = "hassio-svc"
      middlewares = ["chain-oauth"]
      [http.routers.hassio-rtr.tls]
        
        certresolver = "dns-cloudflare"

[http.services]
  [http.services.hassio-svc]
    [http.services.hassio-svc.loadBalancer]
      
      passHostHeader = true
      [[http.services.hassio-svc.loadBalancer.servers]]url = "http: // HASSIO-IP: 8123" 

Comme vous pouvez le voir, il existe trois sections: routeurs, middlewares et services. Le frontend supervisé Home Assistant sera disponible à l'adresse hassio.example.com. Le service (backend) sera disponible sur HASSIO-IP: 8123, qui est l'adresse IP du système qui exécute HASSio (ou Home Assistant Supervised).

Puisque le répertoire des règles est dynamique, simplement en ajoutant ce fichier à ce répertoire, nous avons créé l'itinéraire. Si vous avez ajouté un hôte externe, vous devriez pouvoir vous connecter à votre service maintenant, sans redémarrer Traefik!

Authentification OAuth Forward pour Traefik 1

Traefik v1 est maintenant gelé. Vous pouvez trouver la dernière version de notre configuration dans notre GitHub Repo. Si vous n'utilisez pas Traefik 1, vous pouvez ignorer cette section.

Étape A: ajouter un conteneur OAuth

Ouvrez votre fichier docker-compose créé sur la base de notre précédent didacticiel Traefik (docker-compose-t1.yml) et ajoutez-y ce qui suit.

    # Google OAuth - Authentification unique à l'aide d'OAuth 2.0 pour Traefik v1.7
  oauth:
    image: thomseddon / traefik-forward-auth: dernier
    nom_conteneur: oauth
    redémarrer: toujours
    réseaux:
      - t1_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: avertir
      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: t1_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.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. Le réseau t1_proxy doit déjà être défini dans votre fichier docker-compose.

Les variables d'environnement utilisées sont exactement les mêmes que celles de Traefik 2. Par conséquent, pour les configurer ou les modifier, reportez-vous aux sections précédentes de ce guide.

Étape B: 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
  # Touchez (créer des fichiers vides) traefik.toml et acme / acme.json. Définissez les autorisations acme.json sur 600.
  traefik:
    image: traefik: maroilles
    nom_conteneur: traefik
    redémarrage: à moins qu'il ne soit arrêté
    réseaux:
      - défaut
      - t1_proxy
    ports:
      - "80:80"
      - "443: 443"
      # - "$ TRAEFIK_DASHBOARD_PORT: 8080"
    nom de domaine: $ DOMAINNAME
    DNS:
      - 1.1.1.1
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - $ USERDIR / docker / traefik1: / etc / traefik
      - $ USERDIR / docker / partagé: / partagé
    environnement:
      CF_API_EMAIL: $ CLOUDFLARE_EMAIL
      CF_API_KEY: $ CLOUDFLARE_API_KEY
      # DUCKDNS_TOKEN: $ DUCKDNS_TOKEN
    É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: t1_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.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.

Pour mettre d'autres services docker derrière OAuth, il vous suffit d'ajouter les trois étiquettes Traefik v1 suivantes au service:

            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 C: ajouter OAuth à d'autres services

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.

Tout ce que vous avez à faire est de créer des règles Traefik comme dans Traefik v2. 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.

Contourner OAuth / Authentification sélective

J'utilise l'application NZB360 sur Android pour gérer à distance SABnzbd, Sonarr, Radarr, etc. Lorsque ces applications sont derrière OAuth, je ne pouvais pas utiliser l'application NZB360 à distance. Il existe d'autres applications de ce type qui ne prennent pas en charge OAuth (par exemple, LunaSea).

C'était jusqu'à ce que je découvre le contournement OAuth basé sur des règles, comme décrit dans la page GitHub d'Auth Forwarder.

Vous pouvez contourner l'authentification basée sur des clés spécifiques dans les en-têtes, les expressions régulières, l'hôte, le chemin, la requête, etc.

Remarque: En utilisant une règle incorrectement spécifiée, vous pouvez facilement désactiver l'authentification lorsque vous n'en avez pas l'intention. Par conséquent, je recommande fortement des règles spécifiques et étroites pour contourner l'authentification.

Identification de la règle de contournement

Comment savoir quelles règles spécifiques utiliser?

Cela peut être assez délicat. Comme indiqué dans le lien ci-dessous, un moyen générique de contourner l'authentification serait d'utiliser le chemin. Par exemple, les demandes d'application NZB360 ont / api Sur le chemin. Vous pouvez désactiver l'authentification pour toutes ces demandes.

Ressource:: Vérifiez ce thread GitHub pour une authentification sélective des informations supplémentaires.

Mais cela peut assouplir la sécurité et je recommande de définir des règles spécifiques. Par exemple, si l'en-tête de demande contient la clé d'API SABnzbd, contournez l'authentification.

Ensuite, la question suivante, comment savais-je rechercher la clé d'API SABnzbd? Cela nécessite quelques essais et erreurs.

Tout d'abord, assurez-vous que SABNzbd est derrière OAuth. Définissez ensuite le niveau de journalisation du conteneur OAuth sur trace dans la variable environnementale:

            LOG_LEVEL: trace

Vérifiez ensuite les journaux Docker pour le conteneur OAuth (Basic Docker Commands). Cela crachera à peu près tout ce qui se passe dans ce conteneur, ce qui peut être écrasant. Vous pouvez réduire cela à votre application d'intérêt en canalisant le grep sabnzbd commander.

Maintenant, lorsque j'essaie d'ouvrir SABnzbd via l'application qui nous intéresse, dans mon cas NZB360, il crée une entrée de journal OAuth comme celle ci-dessous.

Entrée du journal OAuth pour l'accès SABnzbd via l'application NZB360

Entrée du journal OAuth pour l'accès SABnzbd via l'application NZB360

Spécification de la règle de contournement OAuth

Remarquez le uri dans la capture d'écran du journal ci-dessus contient la clé API SABnzbd. Vous pouvez donc définir l'utilisation du contournement en fonction de cela, comme suit:

        commande: --rule.sabnzbd.action = autoriser --rule.sabnzbd.rule = "HeadersRegexp (` X-Forwarded-Uri`, `$ SABNZBD_API_KEY`)" "
Journal OAuth pour l'accès Radarr via l'application NZB360

Journal OAuth pour l'accès Radarr via l'application NZB360

Pour Radarr, Sonarr, Lidarr, etc., vous pouvez utiliser la règle suivante (devrait fonctionner pour NZB360 ou des applications similaires):

        command: --rule.radarr.action = allow --rule.radarr.rule = "En-têtes (` X-Api-Key`, `$ RADARR_API_KEY`)"

Pour la composition complète du docker, consultez mon dépôt GitHub. Tous les codes ci-dessus supposent que vous avez suivi mes précédents guides Traefik et que les clés API sont correctement définies dans votre .env fichier. Sinon, les règles ci-dessus ne fonctionneront pas.

Redémarrez le conteneur OAuth et essayez d'accéder à SABnzbd maintenant via l'application et le navigateur. Le navigateur doit présenter la connexion OAuth et l'application doit vous emmener directement au service.

Il existe plusieurs autres façons de spécifier des règles. Consultez la page des redirecteurs OAuth vers GitHub pour toutes les options disponibles.

Méthodes alternatives de contournement

Bien que OAuth Forwarder autorise le contournement, je ne préfère / recommande pas cette méthode.

Traefik dispose de mécanismes intégrés de contournement conditionnel. Si cela vous intéresse, consultez la section de contournement de mon guide Traefik 2.

Je vous recommande également de consulter les exemples de composition de docker que j'ai pour des applications telles que SABnzbd, Radarr, Sonarr et Lidarr dans mon dépôt GitHub.

En-têtes OAuth et sécurité

Une chose à noter sur l'utilisation du service OAuth de Google avec vos en-têtes de sécurité. Si le service est derrière OAuth et que vous essayez de vérifier si vos en-têtes de sécurité sont appliqués, vous recevrez probablement une note inférieure. Cela m'a causé beaucoup d'inquiétude au début, jusqu'à ce que je réalise que les en-têtes que je voyais n'étaient pas réellement pour mon service, mais pour Google.

En-têtes de sécurité avec Google OAuth

En-têtes de sécurité avec Google OAuth

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.

Existe-t-il d'autres alternatives (plus privées) à Google OAuth?

Oui. Je pense à Authelia et Keycloak. À mon humble avis, Authelia était beaucoup plus simple à configurer. I et Seth (co-auteur de ce guide et du guide Traefik 2) ont tous deux commencé avec OAuth et sont maintenant complètement passés à Authelia.

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

Est-ce que ce post vous a aidé?

SmartHomeBeginner propose des didacticiels détaillés assez faciles à comprendre même pour les débutants. Si vous lisez ceci, pensez à nous acheter un café (ou deux) en signe d'appréciation.

Laisser un commentaire

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