Compartir comentarios
Las respuestas se generan en base a la documentación.

Jugar en un entorno de pruebas de confianza de contenido

Esta página explica cómo configurar y utilizar un entorno de pruebas (sandbox) para experimentar con la confianza. El entorno de pruebas te permite configurar y probar operaciones de confianza localmente sin afectar a tus imágenes de producción.

Antes de trabajar en este entorno de pruebas, debes haber leído la descripción general de la confianza.

Requisitos previos

Estas instrucciones asumen que estás ejecutando Linux o macOS. Puedes ejecutar este entorno de pruebas en una máquina local o en una máquina virtual. Necesitas tener privilegios para ejecutar comandos de docker en tu máquina local o en la máquina virtual.

Este entorno de pruebas requiere que instales dos herramientas de Docker: Docker Engine >= 1.10.0 y Docker Compose >= 1.6.0. Para instalar Docker Engine, elige de la lista de plataformas compatibles. Para instalar Docker Compose, consulta las instrucciones detalladas aquí.

¿Qué hay en el entorno de pruebas?

Si utilizas la confianza de forma predeterminada (out-of-the-box), solo necesitas tu cliente de Docker Engine y acceso a Docker Hub. El entorno de pruebas imita un entorno de confianza de producción y configura estos componentes adicionales.

ContenedorDescripción
trustsandboxUn contenedor con la versión más reciente de Docker Engine y con algunos certificados preconfigurados. Este es tu entorno de pruebas donde puedes usar el cliente docker para probar las operaciones de confianza.
Servidor de registroUn servicio de registro local.
Servidor NotaryEl servicio que realiza todo el trabajo pesado de gestionar la confianza.

Esto significa que ejecutas tu propio servidor de confianza de contenido (Notary) y registro. Si trabajas exclusivamente con Docker Hub, no necesitarías estos componentes. Están integrados en Docker Hub para ti. Sin embargo, para el entorno de pruebas, construyes todo tu propio entorno de producción simulado.

Dentro del contenedor trustsandbox, interactúas con tu registro local en lugar de con Docker Hub. Esto significa que tus repositorios de imágenes cotidianos no se utilizan. Están protegidos mientras juegas.

Cuando juegas en el entorno de pruebas, también creas claves raíz y de repositorio. El entorno de pruebas está configurado para almacenar todas las claves y archivos dentro del contenedor trustsandbox. Dado que las claves que creas en el entorno de pruebas son solo para jugar, al destruir el contenedor también las destruyes.

Al utilizar una imagen de docker-in-docker para el contenedor trustsandbox, tampoco contaminas la caché de tu demonio de Docker real con las imágenes que subes y descargas. Las imágenes se almacenan en un volumen anónimo adjunto a este contenedor y se pueden destruir después de que destruyas el contenedor.

Construir el entorno de pruebas

En esta sección, utilizas Docker Compose para especificar cómo configurar y conectar entre sí el contenedor trustsandbox, el servidor Notary y el servidor de registro.

  1. Crea un nuevo directorio trustsandbox y accede a él.

    $ mkdir trustsandbox
    $ cd trustsandbox
    
  2. Crea un archivo llamado compose.yaml con tu editor favorito. Por ejemplo, usando vim:

    $ touch compose.yaml
    $ vim compose.yaml
    
  3. Añade lo siguiente al nuevo archivo.

    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:3
        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. Guarda y cierra el archivo.

  5. Ejecuta los contenedores en tu sistema local.

    $ docker compose up -d
    

    La primera vez que ejecutes esto, las imágenes de docker-in-docker, el servidor Notary y el registro se descargarán desde Docker Hub.

Jugar en el entorno de pruebas

Ahora que todo está configurado, puedes entrar en tu contenedor trustsandbox y comenzar a probar la confianza de contenido de Docker. Desde tu máquina anfitriona, obtén una shell en el contenedor trustsandbox.

$ docker container exec -it trustsandbox sh
/ #

Probar algunas operaciones de confianza

Ahora, descarga algunas imágenes desde el contenedor trustsandbox.

  1. Descarga una imagen de docker para realizar pruebas.

    / # 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. Etiquétala para subirla a tu registro del entorno de pruebas:

    / # docker tag docker/trusttest sandboxregistry:5000/test/trusttest:latest
    
  3. Habilita la confianza de contenido.

    / # export DOCKER_CONTENT_TRUST=1
    
  4. Identifica el servidor de confianza.

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

    Este paso solo es necesario porque el entorno de pruebas utiliza su propio servidor. Normalmente, si utilizas el Docker Public Hub, este paso no es necesario.

  5. Descarga la imagen de prueba.

    / # 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
    

    Verás un error, porque este contenido aún no existe en el notaryserver.

  6. Sube y firma la imagen de confianza.

    / # 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
    

    Due a que estás subiendo este repositorio por primera vez, Docker crea nuevas claves raíz y de repositorio y te pide frases de contraseña con las que cifrarlas. Si vuelves a subir contenido después de esto, solo te pedirá la frase de contraseña del repositorio para poder descifrar la clave y firmar de nuevo.

  7. Intenta descargar la imagen que acabas de subir:

    / # 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
    

Probar con imágenes maliciosas

¿Qué sucede cuando los datos se corrompen e intentas descargarlos con la confianza habilitada? En esta sección, entras en el sandboxregistry y alteras algunos datos. Luego, intentas descargarlos.

  1. Deja la shell de trustsandbox y el contenedor en ejecución.

  2. Abre una nueva terminal interactiva desde tu anfitrión y obtén una shell en el contenedor sandboxregistry.

    $ docker container exec -it sandboxregistry bash
    root@65084fc6f047:/#
    
  3. Enumera las capas de la imagen test/trusttest que subiste:

    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. Accede al almacenamiento del registro para una de esas capas (esta se encuentra en un directorio diferente):

    root@65084fc6f047:/# cd /var/lib/registry/docker/registry/v2/blobs/sha256/aa/aac0c133338db2b18ff054943cee3267fe50c75cdee969aed88b1992539ed042
    
  5. Añade datos maliciosos a una de las capas de trusttest:

    root@65084fc6f047:/# echo "Malicious data" > data
    
  6. Vuelve a tu terminal de trustsandbox.

  7. Enumera la imagen de 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. Elimina la imagen trusttest:latest de tu caché 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 no vuelve a descargar las imágenes que ya tiene en caché, pero quieres que Docker intente descargar la imagen alterada del registro y la rechace porque no es válida.

  9. Descarga la imagen de nuevo. Esto descarga la imagen desde el registro, ya que no la tienes en caché.

    / # 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
    

    La descarga no se completó porque el sistema de confianza no pudo verificar la imagen.

Más juego en el entorno de pruebas

Ahora que tienes un entorno de pruebas completo de confianza de contenido de Docker en tu sistema local, siéntete libre de jugar con él y ver cómo se comporta. Si encuentras algún problema de seguridad con Docker, no dudes en enviarnos un correo electrónico a [email protected].

Limpiar tu entorno de pruebas

Cuando hayas terminado y quieras limpiar todos los servicios que has iniciado y los volúmenes anónimos que se hayan creado, ejecuta el siguiente comando en el directorio donde creaste tu archivo de Docker Compose:

$ docker compose down -v