web-dev-qa-db-fra.com

comment gérez-vous les valeurs secrètes avec docker-compose v3.1?

La version 3.1 de la spécification docker-compose.yml introduit la prise en charge de secrets .

J'ai essayé ceci:

version: '3.1'

services:
  a: 
    image: tutum/hello-world
  secret: 
    password: the_password
  b:
    image: tutum/hello-world

$ docker-compose up renvoie:

Unsupported config option for services.secret: 'password'

Comment pouvons-nous utiliser la fonctionnalité de secrets dans la pratique?

45
Eric

Vous pouvez lire le section correspondante de la documentation officielle .

Pour utiliser les secrets, vous devez ajouter deux éléments dans votre fichier docker-compose.yml. Premièrement, un bloc secrets: de niveau supérieur qui définit tous les secrets. Ensuite, un autre bloc secrets: _ sous chaque service spécifie quels secrets le service doit recevoir.

Par exemple, créez les deux types de secrets que Docker comprendra: externe et fichier secrets.

1. Créez un secret 'externe' en utilisant docker secret create

Première chose: pour utiliser les secrets avec Docker, le nœud sur lequel vous vous trouvez doit faire partie d'un essaim.

$ docker swarm init

Ensuite, créez un secret "externe":

$ echo "This is an external secret" | docker secret create my_external_secret -

(Assurez-vous d'inclure le dernier tiret, -. C'est facile à manquer.)

2. Écrivez un autre secret dans un fichier

$ echo "This is a file secret." > my_file_secret.txt

3. Créez un fichier docker-compose.yml qui utilise les deux secrets

Maintenant que les deux types de secrets sont créés, voici le fichier docker-compose.yml qui les lira et les écrira dans le service web:

version: '3.1'

services:
  web:
    image: nginxdemos/hello
    secrets:                    # secrets block only for 'web' service
     - my_external_secret
     - my_file_secret

secrets:                        # top level secrets block
  my_external_secret:
    external: true
  my_file_secret:
    file: my_file_secret.txt

Docker peut lire les secrets à partir de sa propre base de données (par exemple, secrets créés avec docker secret create) ou à partir d'un fichier. Ce qui précède montre les deux exemples.

4. Déployez votre pile de test

Déployez la pile en utilisant:

$ docker stack deploy --compose-file=docker-compose.yml secret_test

Cela créera une instance du service web, nommée secret_test_web.

5. Vérifiez que le conteneur créé par le service a deux secrets

Utilisez docker exec -ti [container] /bin/sh pour vérifier que les secrets existent.

(Remarque: dans la commande docker exec ci-dessous, la partie m2jgac... sera différente sur votre ordinateur. Exécutez docker ps pour trouver le nom de votre conteneur.)

$ docker exec -ti secret_test_web.1.m2jgacogzsiaqhgq1z0yrwekd /bin/sh

# Now inside secret_test_web; secrets are contained in /run/secrets/
root@secret_test_web:~$ cd /run/secrets/

root@secret_test_web:/run/secrets$ ls
my_external_secret  my_file_secret

root@secret_test_web:/run/secrets$ cat my_external_secret
This is an external secret

root@secret_test_web:/run/secrets$ cat my_file_secret
This is a file secret.

Si tout va bien, les deux secrets que nous avons créés aux étapes 1 et 2 doivent se trouver dans le conteneur web créé lors du déploiement de notre pile.

74
Mike Hearn

Étant donné que vous avez un service myapp et un fichier de secrets secrets.yml:

Créez un fichier de composition:

version: '3.1'

services:
  myapp:
    build: .
    secrets:
      secrets_yaml

Fournissez un secret à l'aide de cette commande:

docker secret create secrets_yaml secrets.yml

Déployez votre service en utilisant cette commande:

docker deploy --compose-file docker-compose.yml myappstack

Votre application peut maintenant accéder au fichier secret à l'adresse /run/secrets/secrets_yaml. Vous pouvez coder en dur ce chemin dans votre application ou créer un lien symbolique.


La question différente

Cette réponse est probablement à la question "comment approvisionner vos secrets à votre groupe d'essaims de docker".

La question initiale "Comment gérez-vous les valeurs secrètes avec Docker Compose" implique que le fichier docker-compose contient des valeurs secrètes. Ce n'est pas.

La question est différente: "Où stockez-vous la source canonique du fichier secrets.yml"? C'est toi qui vois. Vous pouvez le stocker dans votre tête, imprimer sur une feuille de papier, utiliser un gestionnaire de mots de passe, utiliser une application/base de données secrète. Heck, vous pouvez même utiliser un référentiel git s'il est sécurisé en toute sécurité. Bien sûr, ne le stockez jamais dans le système que vous sécurisez avec celui-ci :)

Je recommanderais Coffre-fort . Pour stocker un secret:

# create a temporary secret file
cat secrets.yml | vault write secret/myappsecrets -

Pour récupérer un secret et le mettre dans votre nuée de dockers:

vault read -field=value secret/myappsecrets | docker secret create secrets_yaml -

Bien sûr, vous pouvez utiliser le cluster Docker lui-même comme source unique de vérité pour vos secrets, mais si votre cluster Docker se cassait, vous auriez perdu vos secrets. Assurez-vous donc d'avoir une sauvegarde ailleurs.


La question que personne n'a posée

La troisième question (que personne n’a posée) est de savoir comment fournir des secrets aux machines des développeurs. Cela peut s'avérer utile lorsqu'il existe un service externe impossible à simuler localement ou une base de données volumineuse impossible à copier.

Encore une fois, docker n'a rien à voir avec cela (pour l'instant). Il n'a pas de listes de contrôle d'accès qui spécifient quels développeurs ont accès à quels secrets. Il n'a pas non plus de mécanisme d'authentification.

La solution idéale semble être la suivante:

  • Un développeur ouvre une application Web.
  • S'authentifie en utilisant un mécanisme d'authentification unique.
  • Copie une longue liste de commandes docker secret create et les exécute dans le terminal.

Nous n'avons pas encore vu si une telle application apparaît.

9
Vanuan

Vous pouvez également spécifier secrets stocké localement dans un fichier à l'aide de la touche file: dans l'objet secrets. Alors vous n'êtes pas obligé de docker secret create les composer vous-même, Compose/docker stack deploy le fera pour vous.

version: '3.1'

secrets:
  password:
    file: ./password

services:
  password_consumer:
    image: Alpine
    secrets:
      - password

Référence: référence de la version 3 du fichier Compose: Secrets

4
nathanleclaire

Je suppose que le mot clé est secrets pas secret. C’est au moins ce que j’ai compris à la lecture du schéma .

0
fzgregor

S'agit-il de l'indentation exacte de votre fichier docker-compose.yml? Je pense secret secrets doit être imbriqué sous a (c'est-à-dire un des services) et non directement sous services section.

0
sxn