在内容信任沙盒中播放
本页介绍如何设置和使用沙盒来试验信任。 沙箱允许您在本地配置和尝试信任操作,而无需 影响您的生产镜像。
在完成此沙盒之前,您应该已经通读了信任概述。
先决条件
这些说明假定您在 Linux 或 macOS 中运行。您可以运行 本地计算机或虚拟机上的此沙盒。您需要 有权在本地计算机或 VM 中运行 Docker 命令。
此沙盒要求您安装两个 Docker 工具:Docker 引擎 >= 1.10.0 和 Docker Compose >= 1.6.0。要安装 Docker Engine,请从支持的平台列表中进行选择。安装 Docker Compose,请参阅此处的详细说明。
沙盒中有什么?
如果您只是开箱即用地使用 trust,则只需要您的 Docker 引擎 客户端和对 Docker Hub 的访问权限。沙盒模拟了 production trust 环境,并设置这些附加组件。
容器 | 描述 |
---|---|
信任沙盒 | 具有最新版本的 Docker Engine 和一些预配置证书的容器。这是您的沙盒,您可以在其中使用客户端测试信任操作。docker |
注册管理机构服务器 | 本地注册表服务。 |
公证服务器 | 完成管理信任的所有繁重工作的服务 |
这意味着您运行自己的内容信任 (Notary) 服务器和注册表。 如果您只使用 Docker Hub,则不需要这些组件。 它们内置于 Docker Hub 中。但是,对于 Sandbox,您需要构建 您自己的整个模拟生产环境。
在容器中,您可以与本地注册表交互,而不是
比 Docker Hub 更重要。这意味着您的日常镜像存储库不会被使用。
当您玩游戏时,它们会受到保护。trustsandbox
在 Sandbox 中玩游戏时,您还可以创建根密钥和存储库密钥。这
sandbox 配置为将所有密钥和文件存储在容器内。由于您在 Sandbox 中创建的密钥仅用于播放,因此
销毁容器也会销毁它们。trustsandbox
通过对容器使用 docker-in-docker 镜像,您还可以
不要用您推送和拉取的任何镜像污染您的真实 Docker 守护进程缓存。
镜像存储在附加到此容器的匿名卷中。
并且可以在销毁容器后销毁。trustsandbox
构建 Sandbox
在本节中,您将使用 Docker Compose 来指定如何设置和链接在一起
容器、Notary 服务器和 Registry 服务器。trustsandbox
创建一个新目录并切换到该目录。
trustsandbox
$ mkdir trustsandbox $ cd trustsandbox
创建一个名为 with your favorite editor 的文件。例如,使用 vim:
compose.yml
$ touch compose.yml $ vim 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-in-docker、Notary 服务器和注册表 镜像从 Docker Hub 下载。
在沙盒中玩游戏
现在一切都已设置完毕,您可以进入容器并
开始测试 Docker 内容信任。从主机获取 shell
在容器中。trustsandbox
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
标记它以推送到我们的 sandbox 注册表:
/ # docker tag docker/trusttest sandboxregistry:5000/test/trusttest:latest
启用内容信任。
/ # export DOCKER_CONTENT_TRUST=1
确定信任服务器。
/ # export DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443
此步骤是必需的,因为 Sandbox 正在使用自己的服务器。 通常,如果您使用的是 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 会创建 new root 和 repository keys 并要求您提供要使用的密码 加密它们。如果在此之后再次推送,它只会要求您提供 repository passphrase 进行加密,以便它可以解密密钥并再次签名。
尝试拉取您刚刚推送的镜像:
/ # 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
让 shell 和容器保持运行状态。
trustsandbox
从主机打开一个新的交互式终端,并在容器中获取一个 shell。
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 尝试从注册表下载被篡改的镜像并拒绝 it 是因为它无效。
再次拉取镜像。这将从注册表下载镜像,因为我们没有缓存它。
/ # 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。
清理 Sandbox
当您完成并想要清理已启动的所有服务以及任何 匿名卷,只需在 目录中:
$ docker compose down -v