非常教程

Docker 17参考手册

引擎: 安全 | Engine: Security

在内容信任沙箱中演示 | Play in a content trust sandbox (Engine)

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

在通过这个沙盒之前,您应该仔细阅读信任概述。

先决条件

这些说明假定您正在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
Docker 17

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

主页 https://docker.com/
源码 https://github.com/docker/docker
版本 17
发布版本 17.06