Docker Swarm - Gestion des secrets

Un secret est une information qui doit rester cachée aux utilisateurs et applications non autorisés. Les noms d’utilisateur, les mots de passe, les clés privées, les certificats et les noms et emplacements des ressources sont des exemples de secrets.

L’objectif des secrets est de stocker des informations sensibles, nécessaires aux services, dans un endroit sûr. En d’autres termes, vous devez éviter de stocker ces informations en clair dans les images docker et les fichiers docker compose.

Le moteur Docker fournit un ensemble de commandes pour gérer les secrets et les rendre disponibles à vos applications. Ces commandes doivent être exécutées sur les gestionnaires d’essaims Docker.

Les secrets Docker ont les propriétés suivantes :

  • Les secrets sont cryptés lorsqu’ils sont transmis et au repos dans l’essaim de dockers.

  • Les secrets ne sont accessibles qu’aux services et utilisateurs autorisés.

  • Les secrets ne sont disponibles que pour les services, mais pas pour les conteneurs ordinaires.

  • Les secrets sont accessibles lorsque la tâche est en cours d’exécution

Docker fournit des secrets aux services sous forme de fichiers montés dans le dossier /run/secrets en utilisant le système de fichiers tmpfs. Par exemple, le secret mypass est stocké dans le fichier /run/secrets/mypass à l’intérieur du conteneur en cours d’exécution.

Créer un secret

La commande de création d’un secret a le modèle suivant :

$ docker secret create [options] <nom du secret> [nom du fichier | -]

Un secret peut être créé de deux manières différentes. La première méthode utilise l’entrée standard pour créer un secret :

$ echo "secret one content" | docker secret create mysecret1 -

La commande echo imprime le texte fourni en paramètre sur la sortie standard, qui est ensuite dirigé vers l’entrée standard de la commande docker secret create. Le tiret (-) à la fin de la commande indique à la commande docker de lire à partir de l’entrée standard.

La deuxième méthode de création d’un secret consiste à utiliser un fichier qui stocke le secret.

$ echo "secret two content" > secret-file.txt
$ docker secret create mysecret2 ./secret-file.txt

Lister les secrets

La commande ls liste tous les secrets existants dans l’essaim docker.

$ docker secret ls

La commande affiche l’identifiant, le nom, les dates de création et de mise à jour des secrets.

Inspecter un secret

La commande inspect affiche des informations détaillées sur un secret au format JSON. Le contenu du secret n’est pas affiché.

$ docker secret ls
$ docker secret inspect mysecret1

Une sortie conviviale peut être affichée en utilisant l’option –pretty.

$ docker secret inspect --pretty mysecret1

Une information spécifique peut être affichée en utilisant l’option –format.

$ docker secret inspect --format '{{.UpdatedAt}}' mysecret

Supprimer un secret

La commande rm supprime un secret d’un essaim. La commande ne demande pas de confirmation avant de supprimer le secret.

$ docker secret rm myscret1

Un secret utilisé par un service en cours d’exécution ne peut pas être supprimé. Vous pouvez utiliser la rotation de secret pour supprimer un secret alors qu’un service est en cours d’exécution.

Utilisation des secrets dans les applications

Les secrets sont spécifiés lors de la création des services, soit en utilisant l’interface de ligne de commande, soit dans le fichier docker compose.

Exemple 1 : Utilisation de l’interface en ligne de commande

Créer un secret en utilisant l’interface en ligne de commande :

$ echo "the password secret" | docker secret create mypass -
$ docker secret ls
$ docker secret inspect mypass

Créez un service qui utilise le secret :

$ docker service create --name mynginx --secret mypass nginx:latest
$ docker service ls

Obtenir l’ID de la tâche (ID du conteneur) qui est nécessaire pour la commande docker exec.

$ docker ps

Afficher le contenu du secret stocké dans le dossier /run/secrets :

$ docker exec 7be95f99dbad cat /run/secrets/mypass

La commande ci-dessus devrait afficher le texte “the password secret”.

Supprimez le service et le secret :

$ docker service rm mynginx
$ docker secret rm mypass

Exemple 2 : Utilisation du fichier docker compose

Créez le fichier stack.yaml suivant :

services :
  db :
    image : postgres:latest
    environnement :
      POSTGRES_USER : webuser
      POSTGRES_PASSWORD_FILE : /run/secrets/db_password
      POSTGRES_DB : webdatabase
    secrets :
      - db_password

  adminer :
    image : adminer:latest
    ports :
     - 8080:8080

secrets :
  db_password :
    fichier : db_password.txt

Créer un fichier contenant le mot de passe de la base de données :

$ echo mypassword > db_password.txt

Déployez la pile en utilisant le fichier docker compose :

$ docker stack deploy --compose-file stack.yaml myapp

Pour tester la pile déployée, naviguez jusqu’à l’adresse http://localhost:8080 et connectez-vous à l’adminer en utilisant les paramètres suivants :

  • System : PostgeSQL

  • Serveur : db

  • Nom d’utilisateur : webuser

  • Mot de passe : mypassword

  • Base de données : webdatabase

Dans le cas où le secret db_password est créé à l’aide de la ligne de commande :

$ echo mypassword | docker secret create db_password -
$ docker secret ls

La section secrets du fichier de composition de docker doit être mise à jour pour indiquer au moteur de docker que le secret dp_password est créé en dehors du fichier de composition :

secrets :
  db_password :
    external : true

Redéployez l’application et naviguez jusqu’à l’adresse http://localhost:8080 pour tester votre pile.

Lorsque vous avez terminé, vous pouvez supprimer la pile et le secret :

$ docker stack rm myapp
$ docker secret rm db_password