technique:docker:good_practices:tls

Générer les certificats pour un service non-web

Il existe des services auxquels on accès pas par le protocole HTTPS, mais qui ont tout de même besoin de communiquer de manière sécurisée (avec TLS).

Note:

Dans la plupart des cas, un certificat auto-signé ne suffit pas. Par exemple, notre serveur mail utilise TLS pour sécuriser ses échanges SMTP, et doit fournir un certificat valide (i.e. fourni par une autorité de certification racine).

C’est aussi le cas pour LDAP : on utilise le protocole LDAPS, qui requiert un certificat pour authentifier et chiffrer les communications.

Note:

Aujourd’hui, la manière la plus facile de générer un certificat est d’utiliser Let's Encrypt. On ne détaille pas le fonctionnement, mais l’idée est de prouver qu’on est bien en contrôle du nom de domaine que l’on prétend avoir. Pour ce faire, Let’s Encrypt propose des challenges, comme mettre en ligne un fichier avec un contenu précis, ou modifier un enregistrement DNS.

Question:

Pourquoi ne pas utiliser un outil comme certbot ?

Ce serait possible, mais pourquoi ne pas utiliser Traefik directement ? En effet, Traefik gère déjà automatiquement la création et le renouvellement des certificats avec Let’s Encrypt. Par contre, il est plutôt orienté web, et fait difficilement proxy avec des services non-web.

Question:

Comment utiliser les certificats générés par Traefik directement dans les services non-web ?

TLSCertsMonitor est un outil développé par Picasoft avec un but simple : extraire les certificats générés par Traefik, et les mettre à disposition dans des fichiers qui pourront être utilisés par le service concerné. L’outil se charge aussi de mettre à jour les certificats en cas de changement, et de redémarrer le service si nécessaire.

Lien:

La documentation technique est répartie à deux endroits :

Prenons tout de même un exemple complet pour faciliter la lecture de la documentation.

snippet.yaml
services:
  non-web:
    labels:
      traefik.http.routers.<container-name>.rule: Host(`non-web.picasoft.net`)
      traefik.enable: true
      tls-certs-monitor.enable: true
      tls-certs-monitor.action: kill:SIGUSR1
      tls-certs-monitor.owner: 103

On active Traefik sur ce service, uniquement pour le forcer à générer les certificats pour non-web.picasoft.net. En revanche, Traefik ne routera rien lui-même (on ne lui a pas indiqué d’entrypoint, ni de port…) Par ailleurs, on suppose que ce service est bindé sur un port de l’hôte.

Ensuite, on active la prise en charge de ce service par TLSCertsMonitor, et on lui dit quoi faire. À chaque renouvellement de certificat par Traefik, l’outil va extraire le certificat, la clé, etc, et les écrire dans le fichier /DATA/docker/certs/non-web.picasoft.net, avec le propriétaire d’UID 103 (le même UID que celui qui fait tourner le service ; inutile si root).

Note:

/DATA/docker/certs est choisi une bonne fois pour toutes dans notre configuration de TLSCertsMonitor, et un sous-dossier est créé automatiquement en fonction de l’URL.

Ensuite, dès qu’un nouveau certificat sera détecté, un signal USR1 sera envoyé au conteneur.

Note:

Le choix du signal dépend du service : ici, on a choisi USR1 parce que le service en question recharge sa configuration TLS quand il reçoit un signal USR1.

Ne pas hésiter à se référer à la documentation complète pour voir plus d’options.

  • technique/docker/good_practices/tls.txt
  • de qduchemi