原文地址

本页面介绍了如何设置和使用沙盒(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。沙盒模拟生产中的信任环境,并设置这些附加组件。

Container Description
trustsandbox A 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 server A local registry service.
Notary server The 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.2volumes:- 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.1networks:- sandbox
     container_name: sandboxregistrytrustsandbox:image: docker:dindnetworks:- sandbox
     volumes:- notarycerts:/notarycerts
     privileged: truecontainer_name: trustsandboxentrypoint: ""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: falsenetworks: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/trusttestdocker pull docker/trusttestUsing default tag: latestlatest: Pulling from docker/trusttestb3dbab3810fc: Pull completea9539b34a6ab: Pull completeDigest: sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819aStatus: 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/trusttestUsing default tag: latestError: 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:latestThe push refers to a repository [sandboxregistry:5000/test/trusttest]5f70bf18a086: Pushedc22f7bc058a9: Pushedlatest: digest: sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926 size: 734Signing and pushing trust metadataYou are about to create a new root signing key passphrase. This passphrasewill be used to protect the most sensitive key in your signing system. Pleasechoose a long, complex passphrase and be careful to keep the password and thekey file itself secure and backed up. It is highly recommended that you use apassword manager to generate the passphrase and keep it safe. There will be noway 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/trusttestUsing default tag: latestPull (1 of 1): sandboxregistry:5000/test/trusttest:latest@sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926: Pulling from test/trusttestDigest: sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926Status: Downloaded newer image for sandboxregistry:5000/test/trusttest@sha256:ebf59c538accdf160ef435f1a19938ab8c0d6bd96aef8d4ddd1b379edf15a926Tagging 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/trusttestaac0c133338d: 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

Docker 生产环境之使用可信镜像 - 在内容信任(content trust)沙盒中演示相关推荐

  1. Docker生产环境技术栈有哪些

    导语   生产环境的Docker设置包括的内容有一些基本的架构组件,这些组件对于运行容器话服务器以及传统服务器集群都是通用的,在很多的时候可以简单认为构建和运行容器的方式与构建和运行虚拟机的方式是一样 ...

  2. 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(中)

    系列文章目录 [大数据实时数据同步]超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(上) [大数据实时数据同步]超级详细的生产环境OGG(GoldenGa ...

  3. Docker生产环境实践指南

    技术栈: 1. 构建系统 2. 镜像仓库 3. 宿主机管理 4. 配置管理 5. 部署 6. 编排 7. 日志 8. 监控 镜像: 1. 如果用户像往常一样运行包安装命令,这些永远也用不上的缓存包文件 ...

  4. Docker 生产环境之安全性 - 适用于 Docker 的 AppArmor 安全配置文件

    原文地址 AppArmor(Application Armor,应用程序防护)是一个 Linux 安全模块,可保护操作系统及其应用程序免受安全威胁.要使用它,系统管理员会将 AppArmor 安全配置 ...

  5. 生产环境运行Docker的9个关键决策

    本文讲的是生产环境运行Docker的9个关键决策,[编者的话]生产环境运行Docker并没有想象的那么简单,如何实现稳定安全的部署和扩容? 又有哪些需要考虑的关键决策? 本文就此做了一些分析和阐述,赶 ...

  6. Docker容器化实战第二课 镜像、容器、仓库详解

    03 镜像使用:Docker 环境下如何配置你的镜像? 今天我将围绕 Docker 核心概念镜像展开,首先重点讲解一下镜像的基本操作,然后介绍一下镜像的实现原理.首先说明,咱们本课时的镜像均指 Doc ...

  7. ionic app 开发和生产环境的配置

    前言 像 Angular2 一样,希望 ionic 可以提供 2 个文件 ( environment.dev.ts 和 environment.prod.ts ),其中包含与开发和生产环境相对应的不同 ...

  8. 模块加载及第三方包:Node.js模块化开发、系统模块、第三方模块、package.json文件、Node.js中模块的加载机制、开发环境与生产环境、cookie与session

    1.Node.js模块化开发 1.1 JavaScript开发弊端 JavaScript 在使用时存在两大问题,文件依赖和命名冲突. 1.2 软件中的模块化开发 一个功能就是一个模块,多个模块可以组成 ...

  9. Dapper--Google生产环境下的分布式跟踪系统

    Dapper--Google生产环境下的分布式跟踪系统 概述 当代的互联网的服务,通常都是用复杂的.大规模分布式集群来实现的.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发 ...

最新文章

  1. 深度学习之梯度下降法
  2. 调用函数,输出Fibonacci数列的m项至n项
  3. 人人都能学会的 Python 多线程指南!
  4. dojo使用query dojo/query
  5. 流程再造:信息化建设的最佳拍档
  6. Safengine Android so加密
  7. linux删除mysql临时文件_linux下mysql自动备份数据库与自动删除临时文件_MySQL
  8. python初学者怎么找工作_学python找工作好找吗
  9. Python面试题之这两个参数是什么意思:*args,**kwargs?我们为什么要使用它们?
  10. UE4 虚幻引擎, 蓝图节点应用笔记(一)
  11. 终于有人把分布式系统架构讲明白了
  12. 创维数字--驱动开发岗位面试总结
  13. Charles 抓包原理与实践
  14. 你应该学点哲学的20个理由:不为拥有深奥的思想,只为更好地生活
  15. 孩子为什么不能玩抖音精彩回答,共勉
  16. python饼图添加颜色_PythonPlotly:通过字典自定义饼图颜色
  17. 用优启通U盘安装Ghost版Win10系统教程
  18. Kafka【付诸实践 03】Offset Explorer Kafka 的终极 UI 工具安装+简单上手+关键特性测试(一篇学会使用 Offset Explorer)
  19. 实现固定表头和表列的table组件
  20. [Android Pro] Android 6.0 Root

热门文章

  1. JPA Unknown Id.generator: xxx
  2. chrome浏览器字体小于12px的解决方式
  3. 30行Python代码实现自动收发邮件
  4. adb shell am 命令(活动管理)
  5. Pandas 如何保存较大文件。‘ValueError: This sheet is too large! Your sheet size is: 16388602, 3 Max sheet size
  6. 深入解析AAVE智能合约:计算和利率
  7. 【开始和MySQL做朋友】——初识MySQL
  8. Java编程之实现数字化的连连看
  9. 【内排序 -- 八大排序】
  10. 机器人工程终身学习和工作计划-2022-