comment gérer les valeurs secrètes avec docker-composez v3.1?

la Version 3.1 du docker-composer.la spécification 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é secrets dans la pratique?

27
demandé sur Vanuan 2017-02-09 17:42:47

5 réponses

Vous pouvez lire les section correspondante de la documentation officielle.

utilisation De secrets, vous devez ajouter deux choses dans votre docker-compose.yml fichier. Tout d'abord, un premier niveau secrets: bloc qui définit tous les secrets. Ensuite, un autre secrets: bloc sous chaque service qui spécifie les secrets que le service devrait recevoir.

à titre d'exemple, créez les deux types de secrets que Docker comprendra: externe secrets et le fichier secrets.

1. Créer un secret "externe" en utilisant docker secret create

Première chose: secrets d'utilisation avec menu fixe, le nœud doit être partie d'un essaim.

$ docker swarm init

Ensuite, créer un "alias" secret:

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

(assurez-vous d'inclure le dernier tiret, -. Il est facile de rater.)

2. Écrire un autre secret dans un fichier

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

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

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

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 des secrets soit à partir de sa propre base de données (par exemple des secrets fabriqué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éployer la pile en utilisant:

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

cela créera une instance de web service, nommé secret_test_web.

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

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

(Note: en dessous de docker exec la commande, le m2jgac... la portion sera différente sur votre machine. 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 devraient être à l'intérieur du web conteneur qui a été créé lorsque nous déployé notre stack.

44
répondu Mike Hearn 2017-03-17 23:58:33

etant Donné que vous avez un service myapp et un fichier Secret secrets.yml:

Créer un fichier composer:

version: '3.1'

services:
  myapp:
    build: .
    secrets:
      secrets_yaml

Disposition 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

Maintenant, votre application peut accéder au dossier secret /run/secrets/secrets_yaml. Vous pouvez soit hardcode ce chemin dans votre application ou créer un lien symbolique.


Les différents question

cette réponse est probablement à la question "Comment Fournissez-vous vos secrets à votre amas d'essaims docker".

la question originale "comment gérer les valeurs secrètes avec docker composer" implique que le fichier docker-composer contient des valeurs secrètes. Il ne le fait pas.

il y a une autre question: "Où stockez-vous la source canonique du secrets.yml le fichier". C'est à vous de voir. Vous pouvez les stocker dans votre tête, imprimer sur une feuille de papier, utilisez un gestionnaire de mots de passe, utilisez une application/base de données dédiée aux secrets. Vous pouvez même utiliser un dépôt git s'il est sécurisé. Bien sûr, ne le stockez jamais dans le système que vous sécurisez avec:)

je recommanderais chambre forte. 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 essaim docker:

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

bien sûr, vous pouvez utiliser Docker cluster lui-même comme une seule source de vérité pour vous secrets, mais si votre amas de dockers casse, vous avez perdu vos secrets. Donc, assurez-vous d'avoir une sauvegarde ailleurs.


La question posée personne

la troisième question (que personne n'a posée) est de savoir comment fournir des secrets aux machines des développeurs. Elle peut être nécessaire lorsqu'il y a un service externe qui est impossible à simuler localement ou une grande base de données qui est impossible à copier.

encore une fois, docker n'a rien à voir avec ça (encore.) Il n'a pas de listes de contrôle d'accès qui précisent quels développeurs ont accès à quels secrets. Il n'a aucun mécanisme d'authentification.

La solution idéale semble être ceci:

  • un développeur ouvre une application web.
  • S'authentifie à l'aide d'un mécanisme de connexion unique.
  • copie une longue liste de docker secret create commandes et les exécute dans le terminal.

nous devons encore voir si tel une application apparaît.

7
répondu Vanuan 2017-02-10 04:15:29

vous pouvez aussi spécifier secrets stocké localement dans un fichier en utilisant file:secrets objet. Ensuite, vous n'avez pas à docker secret create vous-même, Composer / docker stack deploy va le faire pour vous.

version: '3.1'

secrets:
  password:
    file: ./password

services:
  password_consumer:
    image: alpine
    secrets:
      - password

Référence: composer file version 3 référence: Secrets

3
répondu nathanleclaire 2017-10-07 05:50:52

je suppose que le mot clé est secretssecret. C'est du moins ce que je comprends en lisant le schéma.

1
répondu fzgregor 2017-02-09 15:36:53

Est-ce l'indentation exacte de votre docker-compose.yml fichier? J' pensersecretsecrets devrait être imbriqué sous a (c'est à dire l'un des services), ne relevant pas directement de services section.

0
répondu sxn 2017-02-10 04:39:29