原文地址

本页面介绍了如何设置和使用沙盒(sandbox)进行信任实验。沙盒允许你在本地配置和尝试信任操作,而不会影响生产镜像。

在开始这个沙盒实验之前,应该仔细阅读 信任概述

1. 先决条件

这些说明假定你正在 Linux 或 macOS 中运行。可以在本地机器或虚拟机上运行此沙箱。需要拥有在本地机器或虚拟机上运行 docker 命令的权限。

此沙箱需要安装两个 Docker 工具:Docker Engine >= 1.10.0 和 Docker Compose >= 1.6.0。要安装 Docker 引擎,请从 支持的平台列表 中进行选择。要安装 Docker Compose,请参阅 此处

2. 沙盒 sandbox 是什么

如果你只是开箱即用,则只需要 Docker Engine 客户端并访问 Docker Hub。沙盒模拟生产中的信任环境,并设置这些附加组件。

ContainerDescription
trustsandboxA container with the latest version of Docker Engine and with some preconfigured certificates. This is your sandbox where you can use the docker client to test trust operations.
Registry serverA local registry service.
Notary serverThe service that does all the heavy-lifting of managing trust

这意味着你运行你自己的内容信任(Notary)服务器和 registry。如果你只使用 Docker Hub 工作,则不需要这些组件。它们为你构建在 Docker Hub 中。但是,对于沙箱,可以构建自己的整个模拟生产环境。

trustsandbox 容器中,可以与本地 registry 而不是 Docker Hub 进行交互。这意味着你的日常镜像仓库不被使用。他们在你练习的过程中受到保护。

在沙盒中玩时,还可以创建 root 和 repository 密钥。沙盒被配置为存储 trustsandbox 容器内的所有密钥和文件。由于你在沙盒中创建的密钥仅用于练习,因此销毁容器也会破坏它们。

通过在 trustsandbox 容器中使用 docker-in-docker 镜像,不会污染真正的 Docker 守护进程缓存,并且不会影响你推送和获取的任何镜像。这些镜像存储在与此容器相连的匿名卷中,并且可以在销毁容器后销毁。

3. 构建沙盒

在本节中,将使用 Docker Compose 来指定如何设置 trustsandbox 容器,Notary 服务器和 Registry 服务器并将其链接在一起。

1. 创建并进入新的 trustsandbox 目录
 $ mkdir trustsandbox
 $ cd trustsandbox
2. 创建名为 docker-compose.yml 的文件
 $ touch docker-compose.yml
 $ vim docker-compose.yml
3. 把下面内容复制到刚创建的文件
 version: "2"
 services:
   notaryserver:
     image: dockersecurity/notary_autobuilds:server-v0.4.2
     volumes:
       - notarycerts:/go/src/github.com/docker/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. 保存并关闭文件
5. 本地运行容器
 $ docker-compose up -d

第一次运行这个时,docker-in-docker,Notary 服务器和 registry 镜像会从 Docker Hub 下载。

4. 运行沙盒

现在所有的东西都已经设置好了,你可以进入你的 trustsandbox 容器并开始测试 Docker 内容信任。在你的主机上,在 trustsandbox 容器中获取一个 shell。

$ docker container exec -it trustsandbox sh
/ #

4.1 测试 trust 操作

现在,从 trustsandbox 容器中获取镜像。

1. 下载要测试的 Docker 镜像
 / # 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. 将其标记为推送到我们的沙箱注册表中:
 / # docker tag docker/trusttest sandboxregistry:5000/test/trusttest:latest
3. 开启内容信任
 / # export DOCKER_CONTENT_TRUST=1
4. 识别信任服务器
 / # export DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443

这一步是必要的,因为沙盒正在使用自己的服务器。通常,如果使用的是 Docker Public Hub,则此步骤不是必需的。

5. 获取测试镜像
 / # 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

你看到一个错误,因为这个内容在 notaryserver 上还不存在。

6. Push 并且 sign trusted 镜像
 / # 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

由于你第一次推送此存储库,因此 Docker 会创建新的 root 和 repository 密钥,并要求你提供用于加密它们的密码短语。如果在此之后再次推送,它只会要求输入存储库密码,以便它可以解密密钥并再次签名。

7. 尝试获取刚上传的镜像
 / # 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

4.2 测试篡改镜像

在启用信任并尝试获取镜像时,如果数据损坏会发生什么? 在本节中,将进入 sandboxregistry 并篡改一些数据。然后,尝试 pull 它。

1. 保持 trustsandbox shell 和容器的运行
2. 从主机打开一个新的交互式终端,并在 sandboxregistry 容器中获取一个 shell
$ docker container exec -it sandboxregistry bash
root@65084fc6f047:/#
3. 列出你推送的 test/trusttest 镜像的层:
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. 切换目录到其中一个层的 registry 存储位置(位于不同的目录中):
root@65084fc6f047:/# cd /var/lib/registry/docker/registry/v2/blobs/sha256/aa/aac0c133338db2b18ff054943cee3267fe50c75cdee969aed88b1992539ed042
5. 将恶意数据添加到其中一个 trusttest 层:
root@65084fc6f047:/# echo "Malicious data" > data
6. 回到 trustsandbox 终端
7. 列出 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. 从本地缓存中删除 trusttest:latest 镜像
/ # 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 does not re-download images that it already has cached, but we want Docker to attempt to download the tampered image from the registry and reject it because it is invalid.

9. 再次获取镜像。这会从 registry 中下载。
/ # 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

pull 无法完成,因为信任系统无法验证镜像。

5. 在沙盒中的更多练习

现在,你的本地系统上有一个完整的 Docker 内容信任沙箱,可以随时使用它并查看它的行为。如果发现 Docker 存在任何安全问题,请随时通过security@docker.com向我们发送电子邮件。

6. 清理沙盒

完成后,要清理所有已启动的服务和已创建的所有匿名卷,只需在创建 Docker Compose 文件的目录中运行以下命令:

    $ docker-compose down -v
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐