©
本文档使用
php.cn手册 发布
本页面介绍了如何设置和使用沙盒进行信任实验。沙箱允许您在本地配置和尝试信任操作,而不会影响生产映像。
在通过这个沙盒之前,您应该仔细阅读信任概述。
这些说明假定您正在Linux或macOS中运行。您可以在本地机器或虚拟机上运行此沙箱。您需要拥有在本地机器或虚拟机上运行docker命令的权限。
此沙箱需要您安装两个Docker工具:Docker Engine> = 1.10.0和Docker Compose> = 1.6.0。要安装Docker引擎,请从支持的平台列表中进行选择。要安装Docker Compose,请参阅此处的详细说明。
最后,您需要在本地系统或VM上安装一个文本编辑器。
如果您只是使用信任开箱即用,则只需要您的Docker Engine客户端并访问Docker Hub。沙盒模拟生产信任环境,并设置这些附加组件。
容器 | 描述 |
---|---|
trustsandbox | 具有最新版Docker Engine和一些预配置证书的容器。这是您的沙箱,您可以使用docker客户端来测试信任操作。 |
注册服务器 | 本地注册表服务。 |
公证服务器 | 这项服务完成所有重要的管理信任 |
这意味着您将运行您自己的内容信任(公证)服务器和注册表。如果您只使用Docker Hub工作,则不需要这些组件。它们为您而构建在Docker Hub中。但是,对于沙箱,您可以构建自己的整个模拟生产环境。
在trustsandbox
容器中,您与本地注册表交互而不是Docker Hub。这意味着您的日常图像存储库不被使用,他们受到保护
当你在使用沙盒时,你也会创建root和仓库密钥。沙箱被配置为存储trustsandbox
容器内的所有密钥和文件。由于您在沙盒中创建的键仅用于播放,因此销毁容器也会破坏它们。
通过在trustsandbox
容器中使用docker-in-docker图像,您不会使用任何您推送和拖动的图像来毁坏您的真正docker守护进程缓存。这些图像将存储在附加到此容器的匿名卷中,并且可以在销毁容器后销毁。
在本节中,您将使用Docker Compose来指定如何设置trustsandbox
容器,公证服务器和注册服务器并将其链接在一起。
1. 创建一个新的trustsandbox
目录并进行更改。$ mkdir trustsandbox $ cd trustsandbox
2. 用你最喜欢的编辑器创建一个文件docker-compose.yml
。例如,使用vim:
$ 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服务器和注册表映像将首先从Docker Hub下载。在sandbox中播放现在所有东西都已设置好了,你可以进入你的trustsandbox
容器并开始测试Docker内容信任。在你的主机上,在trustsandbox
容器中获取一个shell 。$ docker exec -it trustsandbox sh /#测试一些信任操作现在,你将从trustsandbox
容器中取出一些图像。
6. 下载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
7. 标记为推送到我们的沙盒注册表中:/#docker标记docker / trusttest sandboxregistry:5000 / test / trusttest:latest
8. 启用内容信任。
/ # export DOCKER_CONTENT_TRUST=1
9. 识别信任服务器。/#export DOCKER_CONTENT_TRUST_SERVER = https:// notaryserver:4443这一步只是必要的,因为沙盒正在使用它自己的服务器。通常,如果您使用的是Docker公共集线器,则此步骤不是必需的。
10. 测试图像。
/ # 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
。
11. 推送并签署可信映像。/ # 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.
此密码将用于保护签名系统中最敏感的密钥。请选择一个长而复杂的密码,并小心保持密码和密钥文件本身的安全和备份。强烈建议您使用密码管理器来生成密码并保持安全。将无法恢复此密钥。您可以在您的配置目录中找到该密钥。输入ID为27ec255的新根密钥的密码:为ID为27ec255的新根密钥重复密码:为ID为58233f9(sandboxregistry:5000 / test / trusttest)的新存储库密钥输入密码:为ID为58233f9(sandboxregistry:5000 / test / trusttest)的新存储库密钥重复密码:完成初始化“sandboxregistry:5000 / test / trusttest”已成功签署“sandboxregistry:5000 / test / trusttest”:latest
由于您第一次推送此存储库,因此docker会创建新的根和存储库密钥并要求您输入加密密码。如果在此之后再次推送,它只会要求您输入存储库密码,以便它可以解密密钥并再次签名。对ID为58233f9(sandboxregistry:5000 / test / trusttest)的新存储库密钥重复密码:完成初始化“sandboxregistry:5000 / test / trusttest”成功签名为“sandboxregistry:5000 / test / trusttest”:latest由于您要将此存储库Docker首次创建新的根和存储库密钥,并要求您输入密码来加密密码。如果在此之后再次推送,它只会要求您输入存储库密码,以便它可以解密密钥并再次签名。对ID为58233f9(sandboxregistry:5000 / test / trusttest)的新存储库密钥重复密码:完成初始化“sandboxregistry:5000 / test / trusttest”成功签名为“sandboxregistry:5000 / test / trusttest”:latest
由于您要将此存储库Docker首次创建新的根和存储库密钥,并要求您输入密码来加密密码。如果在此之后再次推送,它只会要求您输入存储库密码,以便它可以解密密钥并再次签名。码头工人创建新的根和存储库密钥,并要求您输入用于加密它们的密码。如果在此之后再次推送,它只会要求您输入存储库密码,以便它可以解密密钥并再次签名。码头工人创建新的根和存储库密钥,并要求您输入用于加密它们的密码。如果在此之后再次推送,它只会要求您输入存储库密码,以便它可以解密密钥并再次签名。
12. 试着拉你刚才推送的图片:
/ # 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
数据损坏时会发生什么情况,并且在启用信任时尝试将其拉出?在本节中,您将进入sandboxregistry
并篡改一些数据。然后,你试着拉它。
保持trustsandbox
外壳和容器运行。
从您的主机打开一个新的交互式终端,并在sandboxregistry
容器中获得一个shell 。
$ docker exec -it sandboxregistry bash root@65084fc6f047:/#
列出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
切换到其中一个图层的注册表存储(请注意,它位于不同的目录中):
root@65084fc6f047:/# cd /var/lib/registry/docker/registry/v2/blobs/sha256/aa/aac0c133338db2b18ff054943cee3267fe50c75cdee969aed88b1992539ed042
将恶意数据添加到其中一个trusttest
图层:root @ 65084fc6f047:/#echo“恶意数据”>数据
回到你的trustsandbox
终端。
列出trusttest
图像。/ # docker images | 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
trusttest:latest
从我们的本地缓存中删除图像。
/ # docker rmi -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不会重新下载它已经缓存的图像,但我们希望Docker尝试从注册表中下载被篡改的图像并拒绝它,因为它是无效的。
再次拉动图像。这将从注册表中下载图像,因为我们没有缓存它。
/ # 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
你会看到拉操作没有完成,因为信任系统无法验证图像。
现在,您的本地系统上有一个完整的Docker内容信任沙箱,可以随时使用它并查看它的行为。如果您发现Docker存在任何安全问题,请随时通过security@docker.com向我们发送电子邮件。
完成后,要清理所有已启动的服务和已创建的所有匿名卷,只需在创建Docker Compose文件的目录中运行以下命令:
$ docker-compose down -v