⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Jouer dans un bac à sable de confiance de contenu

Cette page explique comment configurer et utiliser un bac à sable pour expérimenter avec la confiance. Le bac à sable vous permet de configurer et d'essayer les opérations de confiance localement sans impacter vos images de production.

Avant de travailler avec ce bac à sable, vous devriez avoir lu l' aperçu de la confiance.

Prérequis

Ces instructions supposent que vous exécutez sous Linux ou macOS. Vous pouvez exécuter ce bac à sable sur une machine locale ou sur une machine virtuelle. Vous devez avoir les privilèges pour exécuter les commandes docker sur votre machine locale ou dans la VM.

Ce bac à sable nécessite l'installation de deux outils Docker : Docker Engine >= 1.10.0 et Docker Compose >= 1.6.0. Pour installer Docker Engine, choisissez dans la liste des plateformes supportées. Pour installer Docker Compose, voir les instructions détaillées ici.

Que contient le bac à sable ?

Si vous utilisez simplement la confiance prête à l'emploi, vous n'avez besoin que de votre client Docker Engine et d'un accès au Docker Hub. Le bac à sable imite un environnement de confiance de production, et configure ces composants supplémentaires.

Conteneur Description
trustsandbox Un conteneur avec la dernière version de Docker Engine et avec des certificats préconfigurés. C'est votre bac à sable où vous pouvez utiliser le client docker pour tester les opérations de confiance.
Serveur Registry Un service de registre local.
Serveur Notary Le service qui fait tout le gros travail de gestion de la confiance

Cela signifie que vous exécutez votre propre serveur de confiance de contenu (Notary) et votre registre. Si vous travaillez exclusivement avec le Docker Hub, vous n'auriez pas besoin de ces composants. Ils sont intégrés dans le Docker Hub pour vous. Pour le bac à sable, cependant, vous construisez votre propre environnement de production factice complet.

Dans le conteneur trustsandbox, vous interagissez avec votre registre local plutôt qu'avec le Docker Hub. Cela signifie que vos dépôts d'images quotidiens ne sont pas utilisés. Ils sont protégés pendant que vous jouez.

Lorsque vous jouez dans le bac à sable, vous créez également des clés racine et de dépôt. Le bac à sable est configuré pour stocker toutes les clés et fichiers à l'intérieur du conteneur trustsandbox. Puisque les clés que vous créez dans le bac à sable ne sont que pour le jeu, détruire le conteneur les détruit également.

En utilisant une image docker-in-docker pour le conteneur trustsandbox, vous ne polluez pas non plus votre cache de démon Docker réel avec les images que vous poussez et tirez. Les images sont stockées dans un volume anonyme attaché à ce conteneur, et peuvent être détruites après avoir détruit le conteneur.

Construire le bac à sable

Dans cette section, vous utilisez Docker Compose pour spécifier comment configurer et lier ensemble le conteneur trustsandbox, le serveur Notary, et le serveur Registry.

  1. Créez un nouveau répertoire trustsandbox et allez dedans.

     $ mkdir trustsandbox
     $ cd trustsandbox
    
  2. Créez un fichier appelé compose.yaml avec votre éditeur favori. Par exemple, en utilisant vim :

     $ touch compose.yaml
     $ vim compose.yaml
    
  3. Ajoutez ce qui suit au nouveau fichier.

     version: "2"
     services:
       notaryserver:
         image: dockersecurity/notary_autobuilds:server-v0.5.1
         volumes:
           - notarycerts:/var/lib/notary/fixtures
         networks:
           - sandbox
         environment:
           - NOTARY_SERVER_STORAGE_TYPE=memory
           - NOTARY_SERVER_TRUST_SERVICE_TYPE=local
       sandboxregistry:
         image: registry:2.4.1
         networks:
           - sandbox
         container_name: sandboxregistry
       trustsandbox:
         image: docker:dind
         networks:
           - sandbox
         volumes:
           - notarycerts:/notarycerts
         privileged: true
         container_name: trustsandbox
         entrypoint: ""
         command: |-
             sh -c '
                 cp /notarycerts/root-ca.crt /usr/local/share/ca-certificates/root-ca.crt &&
                 update-ca-certificates &&
                 dockerd-entrypoint.sh --insecure-registry sandboxregistry:5000'
     volumes:
       notarycerts:
         external: false
     networks:
       sandbox:
         external: false
    
  4. Sauvegardez et fermez le fichier.

  5. Exécutez les conteneurs sur votre système local.

     $ docker compose up -d
    

    La première fois que vous exécutez ceci, les images docker-in-docker, serveur Notary, et registre sont téléchargées depuis Docker Hub.

Jouer dans le bac à sable

Maintenant que tout est configuré, vous pouvez entrer dans votre conteneur trustsandbox et commencer à tester la confiance de contenu Docker. Depuis votre machine hôte, obtenez un shell dans le conteneur trustsandbox.

$ docker container exec -it trustsandbox sh
/ #

Tester quelques opérations de confiance

Maintenant, tirez quelques images depuis l'intérieur du conteneur trustsandbox.

  1. Téléchargez une image docker pour tester.

     / # docker pull docker/trusttest
     docker pull docker/trusttest
     Using default tag: latest
     latest: Pulling from docker/trusttest
    
     b3dbab3810fc: Pull complete
     a9539b34a6ab: Pull complete
     Digest: sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a
     Status: Downloaded newer image for docker/trusttest:latest
    
  2. Étiquetez-la pour être poussée vers notre registre de bac à sable :

     / # docker tag docker/trusttest sandboxregistry:5000/test/trusttest:latest
    
  3. Activez la confiance de contenu.

     / # export DOCKER_CONTENT_TRUST=1
    
  4. Identifiez le serveur de confiance.

     / # export DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443
    

    Cette étape n'est nécessaire que parce que le bac à sable utilise son propre serveur. Normalement, si vous utilisez le Docker Public Hub, cette étape n'est pas nécessaire.

  5. Tirez l'image de test.

     / # docker pull sandboxregistry:5000/test/trusttest
     Using default tag: latest
     Error: remote trust data does not exist for sandboxregistry:5000/test/trusttest: notaryserver:4443 does not have trust data for sandboxregistry:5000/test/trusttest
    

    Vous voyez une erreur, parce que ce contenu n'existe pas encore sur le notaryserver.

  6. Poussez et signez l'image de confiance.

     / # docker push sandboxregistry:5000/test/trusttest:latest
     The push refers to a repository [sandboxregistry:5000/test/trusttest]
     5f70bf18a086: Pushed
     c22f7bc058a9: Pushed
     latest: digest: sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926 size: 734
     Signing and pushing trust metadata
     You are about to create a new root signing key passphrase. This passphrase
     will be used to protect the most sensitive key in your signing system. Please
     choose a long, complex passphrase and be careful to keep the password and the
     key file itself secure and backed up. It is highly recommended that you use a
     password manager to generate the passphrase and keep it safe. There will be no
     way to recover this key. You can find the key in your config directory.
     Enter passphrase for new root key with ID 27ec255:
     Repeat passphrase for new root key with ID 27ec255:
     Enter passphrase for new repository key with ID 58233f9 (sandboxregistry:5000/test/trusttest):
     Repeat passphrase for new repository key with ID 58233f9 (sandboxregistry:5000/test/trusttest):
     Finished initializing "sandboxregistry:5000/test/trusttest"
     Successfully signed "sandboxregistry:5000/test/trusttest":latest
    

    Parce que vous poussez ce dépôt pour la première fois, Docker crée de nouvelles clés racine et de dépôt et vous demande des phrases de passe avec lesquelles les chiffrer. Si vous poussez à nouveau après cela, il ne demande que la phrase de passe du dépôt afin de pouvoir déchiffrer la clé et signer à nouveau.

  7. Essayez de tirer l'image que vous venez de pousser :

     / # docker pull sandboxregistry:5000/test/trusttest
     Using default tag: latest
     Pull (1 of 1): sandboxregistry:5000/test/trusttest:latest@sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926
     sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926: Pulling from test/trusttest
     Digest: sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926
     Status: Downloaded newer image for sandboxregistry:5000/test/trusttest@sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926
     Tagging sandboxregistry:5000/test/trusttest@sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926 as sandboxregistry:5000/test/trusttest:latest
    

Tester avec des images malveillantes

Que se passe-t-il lorsque les données sont corrompues et que vous essayez de les tirer lorsque la confiance est activée ? Dans cette section, vous entrez dans le sandboxregistry et altérez certaines données. Ensuite, vous essayez de les tirer.

  1. Laissez le shell et le conteneur trustsandbox en cours d'exécution.

  2. Ouvrez un nouveau terminal interactif depuis votre hôte, et obtenez un shell dans le conteneur sandboxregistry.

    $ docker container exec -it sandboxregistry bash
    root@65084fc6f047:/#
    
  3. Listez les couches pour l'image test/trusttest que vous avez poussée :

    root@65084fc6f047:/# ls -l /var/lib/registry/docker/registry/v2/repositories/test/trusttest/_layers/sha256
    total 12
    drwxr-xr-x 2 root root 4096 Jun 10 17:26 a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
    drwxr-xr-x 2 root root 4096 Jun 10 17:26 aac0c133338db2b18ff054943cee3267fe50c75cdee969aed88b1992539ed042
    drwxr-xr-x 2 root root 4096 Jun 10 17:26 cc7629d1331a7362b5e5126beb5bf15ca0bf67eb41eab994c719a45de53255cd
    
  4. Allez dans le stockage de registre pour une de ces couches (c'est dans un répertoire différent) :

    root@65084fc6f047:/# cd /var/lib/registry/docker/registry/v2/blobs/sha256/aa/aac0c133338db2b18ff054943cee3267fe50c75cdee969aed88b1992539ed042
    
  5. Ajoutez des données malveillantes à une des couches trusttest :

    root@65084fc6f047:/# echo "Malicious data" > data
    
  6. Retournez à votre terminal trustsandbox.

  7. Listez l'image trusttest.

    / # docker image ls | grep trusttest
    REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
    docker/trusttest                      latest              cc7629d1331a        11 months ago       5.025 MB
    sandboxregistry:5000/test/trusttest   latest              cc7629d1331a        11 months ago       5.025 MB
    sandboxregistry:5000/test/trusttest   <none>              cc7629d1331a        11 months ago       5.025 MB
    
  8. Supprimez l'image trusttest:latest de notre cache local.

    / # docker image rm -f cc7629d1331a
    Untagged: docker/trusttest:latest
    Untagged: sandboxregistry:5000/test/trusttest:latest
    Untagged: sandboxregistry:5000/test/trusttest@sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926
    Deleted: sha256:cc7629d1331a7362b5e5126beb5bf15ca0bf67eb41eab994c719a45de53255cd
    Deleted: sha256:2a1f6535dc6816ffadcdbe20590045e6cbf048d63fd4cc753a684c9bc01abeea
    Deleted: sha256:c22f7bc058a9a8ffeb32989b5d3338787e73855bf224af7aa162823da015d44c
    

    Docker ne retélécharge pas les images qu'il a déjà en cache, mais nous voulons que Docker tente de télécharger l'image altérée depuis le registre et la rejette parce qu'elle est invalide.

  9. Tirez l'image à nouveau. Cela télécharge l'image depuis le registre, parce que nous ne l'avons pas en cache.

    / # docker pull sandboxregistry:5000/test/trusttest
    Using default tag: latest
    Pull (1 of 1): sandboxregistry:5000/test/trusttest:latest@sha256:35d5bc26fd358da8320c137784fe590d8fcf9417263ef261653e8e1c7f15672e
    sha256:35d5bc26fd358da8320c137784fe590d8fcf9417263ef261653e8e1c7f15672e: Pulling from test/trusttest
    
    aac0c133338d: Retrying in 5 seconds
    a3ed95caeb02: Download complete
    error pulling image configuration: unexpected EOF
    

    Le tirage ne s'est pas terminé parce que le système de confiance n'a pas pu vérifier l'image.

Plus de jeu dans le bac à sable

Maintenant, vous avez un bac à sable de confiance de contenu Docker complet sur votre système local, n'hésitez pas à jouer avec et voir comment il se comporte. Si vous trouvez des problèmes de sécurité avec Docker, n'hésitez pas à nous envoyer un email à [email protected].

Nettoyer votre bac à sable

Lorsque vous avez terminé, et que vous voulez nettoyer tous les services que vous avez démarrés et tous les volumes anonymes qui ont été créés, exécutez simplement la commande suivante dans le répertoire où vous avez créé votre fichier Docker Compose :

    $ docker compose down -v