# 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](/engine/security/trust/trust_sandbox/).

## 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](/engine/install/). Para instalar Docker Compose, consulta las [instrucciones detalladas aquí](/compose/install/).

## ¿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.

| Contenedor | Descripción |
|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------|
| trustsandbox    | Un 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 registro | Un servicio de registro local. |
| Servidor Notary   | El 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.

   ```console
   $ mkdir trustsandbox
   $ cd trustsandbox
   ```

2. Crea un archivo llamado `compose.yaml` con tu editor favorito. Por ejemplo, usando vim:

   ```console
   $ touch compose.yaml
   $ vim compose.yaml
   ```

3. Añade lo siguiente al nuevo archivo.

   ```yaml
   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.

   ```console
   $ 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`.

```console
$ 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.

   ```console
   / # 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:

   ```console
   / # docker tag docker/trusttest sandboxregistry:5000/test/trusttest:latest
   ```

3. Habilita la confianza de contenido.

   ```console
   / # export DOCKER_CONTENT_TRUST=1
   ```

4. Identifica el servidor de confianza.

   ```console
   / # 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.

   ```console
   / # 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.
   ```console
   / # 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:

   ```console
   / # 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`.

   ```console
   $ docker container exec -it sandboxregistry bash
   root@65084fc6f047:/#
   ```

3. Enumera las capas de la imagen `test/trusttest` que subiste:

    ```console
    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):

   ```console
   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`:

   ```console
   root@65084fc6f047:/# echo "Malicious data" > data
   ```

6. Vuelve a tu terminal de `trustsandbox`.

7. Enumera la imagen de `trusttest`.

   ```console
   / # 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.

   ```console
   / # 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é.

   ```console
   / # 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 <security@docker.com>.

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

   ```console
   $ docker compose down -v
   ```

