Forum Linux.général Traefik et tls pour réseau local

Posté par  (site web personnel) . Licence CC By‑SA.
1
4
oct.
2021

Bonjour à tous,

Je propose de plus en plus de services à bases de Docker et Traefik sur notre réseau local. Mon prochain service est un gestionnaire de mots de passes et tous (à juste titre) réclame un certificat tls. Jusque là rien d'anomale.

J'ai juste une galère car pour mettre en place letsencrypt avec traefik il faut que les hôtes soient accessible depuis internet. Chose pas possible dans mon cas.

Est-ce qu'il y a un moyen de contourner le problème ?

Merci d'avance.

  • # utiliser une machine qui a acces à internet

    Posté par  . Évalué à 5.

    generer un certificat letsencrypt ne requiert pas que la machine utilisatrice finale soit exposée sur internet

    juste que le domaine soit connu d'internet et que la machine correspondante au domaine le soit aussi.

    évidemment si tu gères uniquement en interne, je te dirais que letsencrypt n'est pas LA solution, mais que par contre tu peux gérer des certificats internes à ton organisation, ton asso, ta société.

    • [^] # Re: utiliser une machine qui a acces à internet

      Posté par  (site web personnel) . Évalué à 2.

      juste que le domaine soit connu d'internet et que la machine correspondante au domaine le soit aussi.

      Comme c'est un domaine interne il n'est pas connu de l'extérieur et n'a pas vocation à l'être.

      évidemment si tu gères uniquement en interne, je te dirais que letsencrypt n'est pas LA solution, mais que par contre tu peux gérer des certificats internes à ton organisation, ton asso, ta société.

      Il faut que j'achète un certificat à un organisme ? Je n'y connais pas grand chose sur le sujet :(

      Born to Kill EndUser !

      • [^] # Re: utiliser une machine qui a acces à internet

        Posté par  . Évalué à 5.

        évidemment si tu gères uniquement en interne, je te dirais que letsencrypt n'est pas LA solution, mais que par contre tu peux gérer des certificats internes à ton organisation, ton asso, ta société.

        Il faut que j'achète un certificat à un organisme ? Je n'y connais pas grand chose sur le sujet :(

        si c'est purement interne, non, pas besoin d'acheter un certificat à un organisme, tu peux creer ta propre autorité.

        il te faudra alors installer d'abord cette autorité sur toutes les machines qui auront acces à tes services.

        puis avec cette autorité, tu signes des certificats que tu as génèrés pour chacun de tes services/domaines…
        et tu utilises ce certificat signé dans ton service de mot de passe, site web, email, etc

        l'intérêt d'acheter une signature à un organisme tiers, c'est justement pour :
        - ne pas avoir à passer sur toutes les machines qui vont se connecter à ton service pour installer ton autorité
        - rassurer le chaland car c'est un organisme tiers qui a signé

        NOTE : tu dois pouvoir générer une autorité intermédiaire, signée elle par un tiers officiel, puis signer tes certificats "internes" par cette autorité intermédiaire.

        tu résoudrais alors le double probleme
        - avoir une autorité externe qui a validé le certificat
        - gérer tous les certificats suivant et leur signature par toi meme.

        • [^] # Re: utiliser une machine qui a acces à internet

          Posté par  . Évalué à 2.

          Peut-être qu'il ne faut pas aller aussi loin que mettre en place une pki, un self-signed devrait suffire. Et si c'est pour faire du self-signed, autant demander à Traefik itself :P

          Cf. https://doc.traefik.io/traefik/https/tls/ «If no default certificate is provided, Traefik generates and uses a self-signed certificate.»

          N'ayant aucune expérience avec traefik, je ne suis pas en mesure de vous aider plus loin…

          • [^] # Re: utiliser une machine qui a acces à internet

            Posté par  . Évalué à 1.

            PS: Pour info, c'est quoi le gestionnaire de mdp utilisé ?

          • [^] # Re: utiliser une machine qui a acces à internet

            Posté par  . Évalué à 3.

            les certificats auto-signés, ca génère des erreurs dans les navigateurs à la premiere connexion, il faut alors ajouter une exception pour que le navigateur ne râle plus.

            en entreprise, c'est plutot moyen quand meme.

          • [^] # Re: utiliser une machine qui a acces à internet

            Posté par  (site web personnel) . Évalué à 2.

            Je suis le coup du DNS challenge moyennant une petite modification de mon côté sans impact pour mon DNS : https://www.grottedubarbu.fr/traefik-dns-challenge-ovh/

            Born to Kill EndUser !

            • [^] # Re: utiliser une machine qui a acces à internet

              Posté par  . Évalué à 2.

              Ah ben ça a l'air parfait ça :) Ça n'était pas clair que tu utilisais un domaine publique pour ton réseau interne (je connais des entreprises qui utilisent un ".local"…). Sinon je te l'aurais recommandé directement car j'utilise aussi le dns challenge pour mes services, c'est vraiment le top.

              PS: Merci pour les noms, la réimplemenation de bitwarden en rust est un truc que je dois tester aussi (je l'ai déjà vu mentionné ici). Je peux recommander le client CLI "rbw", aussi en rust, qui a l'énorme avantage d'être super rapide (le client officiel utilise nodejs, ça prend un peu de temps à démarrer…) et d'avoir un agent.

              • [^] # Re: utiliser une machine qui a acces à internet

                Posté par  (site web personnel) . Évalué à 2.

                En fait non j'ai un domaine public en .fr et un domaine local. Sur mon DNS local j'ai une zone pour ma zone local.

                Pour le cas traefik et let's encrypt j'ai créé une zone pour mon domaine public qui contient les NS d'OVH (le domaine est hébergé par OVH).

                Dans le fichier zone il y a quelques CNAME et ensuite un

                *.dompublic.fr. A IP_SERVER_DOCKER
                De cette manière les utilisateurs de mon réseau local accède à un service docker par l'url : service.dompublic.fr

                Ils sont redirigés vers traefik et le service correspond grâce au label Host('service.dompublic.fr'). Jusque là tout est ok, sauf que je n'arrive pas à faire en sorte que traefik créé le certificat lorsque je passe en https. Pourtant j'ai ajouté l'enregistrement TXT acme-challenge, j'ai créé les clés d'accès à l'API ovh pour que traefik communique directement (j'ai testé ces même codes en php est cela me créé bien les enregistrements dans le dns d'ovh).

                Dans les logs de traefik j'ai

                traefik    | time="2021-10-13T17:19:06+02:00" level=debug msg="legolog: [INFO] [password.dompublic.fr] acme: Waiting for DNS record propagation."
                traefik    | time="2021-10-13T17:19:16+02:00" level=debug msg="Delaying 5000000000 rather than validating DNS propagation now." providerName=le.acme
                traefik    | time="2021-10-13T17:19:21+02:00" level=debug msg="legolog: [INFO] [password.dompublic.fr] acme: Waiting for DNS record propagation."
                traefik    | time="2021-10-13T17:19:31+02:00" level=debug msg="legolog: [INFO] [password.dompublic.fr] acme: Cleaning DNS-01 challenge"
                traefik    | time="2021-10-13T17:19:35+02:00" level=debug msg="legolog: [INFO] Deactivating auth: https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/698992128"
                traefik    | time="2021-10-13T17:19:35+02:00" level=error msg="Unable to obtain ACME certificate for domains \"password.dompublic.fr\": unable to generate a certificate for the domains [password.dompublic.fr]: error: one or more domains had a problem:\n[password.dompublic.fr] time limit exceeded: last error: NS dns11.ovh.net. returned NXDOMAIN for _acme-challenge.password.dompublic.fr.\n" providerName=le.acme routerName=password@docker rule="Host(`password.dompublic.fr`)"
                

                Et bien sûr rien côté dns ovh.

                /etc/traefik/traefik2.yml

                global:
                  sendAnonymousUsage: false
                  checkNewVersion: false
                
                api:
                  insecure: true
                  dashboard: true
                  debug: true
                
                log:
                  #  filePath: "/var/log/traefik/applog.log"
                  #  format: json
                  level: DEBUG 
                
                providers:
                  docker:
                    endpoint: unix:///var/run/docker.sock
                    exposedByDefault: false
                    network: traefik
                
                entryPoints:
                  web:
                    address: ":80"
                  websecure:
                    address: ":443"
                
                certificatesResolvers:
                  le:
                    acme:
                      email: contact@dompublic.fr
                      caServer: https://acme-staging-v02.api.letsencrypt.org/directory
                # prod      caServer: https://acme-v02.api.letsencrypt.org/directory
                      storage: /letsencrypt/acme.json
                      dnsChallenge:
                       provider: ovh
                       delayBeforecheck: 5 
                       resolvers:
                         - 8.8.8.8
                         - 8.8.4.4
                

                docker-compose.yml de traefik

                version: '3.3'
                
                services:
                  traefik:
                    image: traefik:latest # The official Traefik docker image
                    container_name: traefik
                    restart: always
                    ports:
                      - "80:80"     # The HTTP port
                      - "8080:8080" # The Web UI (enabled by --api)
                      - "443:443"
                    volumes:
                      - /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events
                      - /etc/localtime:/etc/localtime:ro
                      - /etc/timezone:/etc/timezone:ro
                      - /etc/traefik/traefik2.yml:/etc/traefik/traefik.yml:ro
                      - /etc/traefik/letsencrypt/:/letsencrypt/
                    environment:
                      - "OVH_ENDPOINT=ovh-eu"
                      - "OVH_APPLICATION_KEY=xxx"
                      - "OVH_APPLICATION_SECRET=xxxx"
                      - "OVH_CONSUMER_KEY=x"
                      - "OVH_PROPAGATION_TIMEOUT=300"
                      - "OVH_POLLING_INTERVAL=10"
                
                    networks:
                      - traefik
                networks:
                  traefik:
                    external: true
                

                docker-compose.yml de vaultwarden

                version: '3.3'
                services:
                  password:
                    image: vaultwarden/server:latest
                    container_name: password
                    restart: always
                    labels:
                      - "traefik.enable=true"
                      - "traefik.http.routers.password.rule=Host(`password.dompublic.fr`)"
                      - "traefik.http.routers.password.entrypoints=websecure"
                      - "traefik.http.routers.password.tls.certresolver=le"
                    networks:
                      - traefik
                    volumes:
                      - /sql/vaultwarden/prod:/data/
                
                networks:
                  traefik:
                    external: true
                

                Si tu as une idée de la provenance du problème je suis preneur.

                Born to Kill EndUser !

                • [^] # Re: utiliser une machine qui a acces à internet

                  Posté par  . Évalué à 2.

                  1. J'ai regardé s'il y avait moyen d'ajouter du debug à lego/ovh, je n'ai rien vu. Idem pour la lib go-ovh, pas de bol que les logs ne soient pas hyper instructifs…

                  2. Vu qu'il y a exactement 10 minutes entre la fin du délais et la fin du check, ça ressemble à un time-out. Ça n'est pas clair si lego essaye de terminer la commande même si la vérification ne passe pas. À la vue de ton log, je dirais qu'il n'essaye même pas de terminer la commande. Essaye d'utiliser lego directement ( https://go-acme.github.io/lego/usage/cli/ ) , essaye aussi d'augmenter ton delais avant d'entamer la période de check. Qui sait? Pour être sûr, continue à lire ;)

                  3. Essaye de mesurer le temps de réplication DNS toi même. Fais un changement avec ton code php ou la web-if (pour etre sûr), ensuite tu check combien de temps ça met (dig @ns _acme-challenge.xxx.xx txt). Vérifie bien tous les différents NS, commence par essayer de trouver le master ovh, puis les réplicas ovh (=> teste tous les NS de la SOA), ensuite localement dans ton docker! Dis-toi bien que LE va utiliser les NS de ta zone (in fine), mais il ne va peut-être pas utilisé le "master" à jour. En d'autres mots, il se peut que la vérif locale fonctionne (tu as du bol, ton résolveur tombe sur le réplica à jour) mais que LE n'y arrive pas. Inversément, il se peut que ça ne fonctionne pas chez toi (genre un dns docker ou dans ton lan qui cache trop longtemps? -> pense aussi à réduire le ttl) alors que le record est bel et bien publié, ce qui fait que lego n'essaye pas de terminer la commande.
                    Idées: regarde s'il y a un réglage pour désactiver la vérification de lego, et base toi sûr le délais uniquement (pas top qd même), regarde si tu peux forcer le dns que lego utilise pour la vérification et utilise un dns public style google, voir ceux ovh directement.

                  4. Perso, j'utilise uacme avec de la glue custom (btw, je ne comprends pas pourquoi lego n'a juste pas un provider "shell" où tu peux scripter ce que tu veux… c'est tellement plus facile à débugger. Il faut croire que go is the new shell :'(). Aussi, vu que les secondaires de ma zone durent très très longtemps à se synchroniser, j'utilise des cname sur le _acme-challenge qui pointent dans une autre zone qui n'a qu'un seul NS que je controle directement avec ma glue. Tu peux essayer ça aussi, avec un cname qui pointe vers une zone contrôlé par un autre provider dns, genre un qui a l'air de mieux fonctionner avec traefik/lego. Éventuellement, regarde les différents github des providers legos, ça en dit surement quelque chose sur la qualité du truc (genre essaye de trouver un provider qui logge ce qu'il fait… genre pas ovh quoi :p ca coûtera tjrs moins cher qu'un certificat commercial) :D

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.