在内容信任沙箱中播放
预计阅读时间:8分钟
本页说明了如何设置和使用沙箱来尝试信任。沙箱允许您在本地配置和尝试信任操作,而不会影响生产映像。
在使用此沙箱之前,您应该已阅读 信任概述。
先决条件
这些说明假定您正在Linux或macOS上运行。您可以在本地计算机或虚拟机上运行此沙箱。您需要具有特权才能在本地计算机或VM中运行docker命令。
此沙箱需要您安装两个Docker工具:Docker Engine> = 1.10.0和Docker Compose> = 1.6.0。要安装Docker Engine,请从支持的平台列表中进行选择 。要安装Docker Compose,请参阅此处的 详细说明。
沙箱中有什么?
如果您开箱即用地使用信任,则只需要Docker Engine客户端并访问Docker Hub。沙箱模拟了生产信任环境,并设置了这些其他组件。
容器 | 描述 |
---|---|
信任箱 | 具有最新版本的Docker Engine并带有一些预配置证书的容器。这是您的沙箱,您可以在其中使用docker 客户端来测试信任操作。 |
注册表服务器 | 本地注册表服务。 |
公证服务器 | 繁重的管理信任服务 |
这意味着您将运行自己的内容信任(公证)服务器和注册表。如果仅使用Docker Hub,则不需要这些组件。它们已为您内置在Docker Hub中。但是,对于沙盒,您可以构建自己的整个模拟生产环境。
在trustsandbox
容器内,您与本地注册表而非Docker Hub进行交互。这意味着您的日常图像存储库未使用。他们在您玩耍时受到保护。
当您在沙盒中玩游戏时,还将创建根密钥和存储库密钥。沙箱配置为将所有密钥和文件存储在trustsandbox
容器内。由于您在沙箱中创建的键仅用于播放,因此破坏容器也将破坏它们。
通过为trustsandbox
容器使用docker-in-docker映像,您也不会使用任何推入和拉出的映像来污染真正的Docker守护进程缓存。图像存储在与此容器相连的匿名卷中,销毁容器后可以销毁。
建立沙箱
在本节中,您将使用Docker Compose来指定如何设置trustsandbox
容器,公证服务器和注册表服务器并将其链接在一起。
-
创建一个新
trustsandbox
目录并切换到该目录。$ mkdir trustsandbox $ cd trustsandbox
-
docker-compose.yml
用您喜欢的编辑器创建一个名为的文件。例如,使用vim:$ touch docker-compose.yml $ vim docker-compose.yml
-
将以下内容添加到新文件中。
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
-
保存并关闭文件。
-
在本地系统上运行容器。
$ docker-compose up -d
第一次运行此命令时,将从Docker Hub下载docker-in-docker,Notary服务器和注册表映像。
在沙盒中玩
现在一切都已设置好,您可以进入trustsandbox
容器并开始测试Docker内容信任。在您的主机上,获取trustsandbox
容器中的外壳。
$ docker container exec -it trustsandbox sh
/ #
测试一些信任操作
现在,从trustsandbox
容器中拉出一些图像。
-
下载
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
-
标记它以将其推送到我们的沙箱注册表中:
/ # docker tag docker/trusttest sandboxregistry:5000/test/trusttest:latest
-
启用内容信任。
/ # export DOCKER_CONTENT_TRUST=1
-
识别信任服务器。
/ # export DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443
仅因为沙箱正在使用其自己的服务器,才需要执行此步骤。通常,如果您使用的是Docker Public Hub,则无需执行此步骤。
-
拉测试图像。
/ # 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
。 -
推送并签名受信任的图像。
/ # 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将创建新的根和存储库密钥,并要求您提供用于加密它们的密码短语。如果在此之后再次按下,它将仅询问您存储库密码,以便它可以解密密钥并再次签名。
-
尝试拉出您刚刚推送的图像:
/ # 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
容器中获得一个外壳 。$ docker container 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 "Malicious data" > data
-
回到您的
trustsandbox
终端。 -
列出
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
-
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不会重新下载已经缓存的映像,但是我们希望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