幸运的是,Docker通过名为DockerContentTrust的功能实现了一种信任机制。在网络系统之间传输数据时,信任是一个核心问题。特别是,当通过不受信任的Internet网络进行通信时,确保系统运行的所有数据的完整性和可信发布者至关重要。1.信任机制介绍什么是DCT,它的作用是什么!DockerContentTrust(DCT)提供了对从远程Docker仓库上传和下载的镜像文件使用数字签名的能力,可以保证镜像文件的完整性和发布者的可信度。DCT通过Docker标签来区分是否对镜像文件进行签名,镜像发布者可以决定对哪些标签进行签名。DCT实现的是客户端签名和验证,也就是说它们是由Docker客户端执行的。显然,这样的密码机制对于保证网络拉取和推送的软件的可信度是非常重要的,它在整个技术栈的各个层面和软件交付流水线的各个环节都发挥着越来越大的作用。重要角色。Docker中的镜像签名2.镜像签名介绍镜像文件的签名,秘钥使用的过程和关系!对图像标签的信任是通过使用签名密钥来管理的。第一次使用DCT进行操作时,会创建一个密钥集,由以下类密钥组成:一个镜像的DCT的roottagrepositorykey-tagkey-repositorykey用于对需要推送到指定镜像仓库的tagged镜像进行签名或者对tag进行签名的taggingkeystimestampkey-timeStampkey存储在远程镜像库,用于一些更高级的使用场景,保证时效性server-managedkeys如timestampkey,为你的repository提供新鲜度安全保证Docker中的镜像签名下图描述了各种签名key及其关系,但是它需要注意的是,根密钥丢失后很难恢复,因此应将根密钥备份到安全的地方。Docker中的镜像签名3.首先使用使用我们自建的公证人(一种在内容之间建立信任的平台)服务进行容器签名在DockerCLI中,我们可以使用dockertrust命令对容器文件进行签名和推送。但需要注意的是,必须部署公证服务器(notary)对容器镜像进行签名。#NotaryServer$gitclonehttps://github.com/theupdateframework/notary.git$docker-composeup-dDocker中的镜像签名要对Docker镜像进行签名,需要一个密钥对,可以在本地使用命令生成(默认存储在~/.docker/trust/中),也可以由证书颁发机构生成。#Locallygenerate$dockertrustkeygeneratepoint_meGeneratingkeyforpoint_me...Enterpassphrasefornewpoint_mekeywithID9deed25:Repeatpassphrasefornewpoint_mekeywithID9deed25:Successfullygeneratedandloadedprivatekey.#使用现有的$dockertrustkeyloadkey.pem--namepoint_meLoadingkeyfrom"key.pem"...Enterpassphrasefornewpoint_mekeywithID8ae710e:Repeatpassphrasefornewpoint_mekeywithID8ae710e:Successfullyimportedkeyfromkey.pem接下来,我们将公开密钥被添加到公证服务器。如果是第一次执行,需要输入一些相关信息后才能使用。$dockertrustsigneradd--keycert.pempoint_meregistry.example.com/admin/demo将签名者“point_me”添加到registry.example.com/admin/demo...为ID为10b5e94的新存储库密钥输入密码:最后,我们会用私钥对具体图片文件的标签进行签名,并推送到仓库中。#签名$dockertrustsignregistry.example.com/admin/demo:1为本地镜像registry.example.com/admin/demo:1签名并推送信任数据,可能会覆盖远程信任数据推送指的是repository[registry.example.com/admin/demo]7bff100f35cb:Pushed1:digest:sha256:3d2e482b82608d153a374df3357c0291589a61cc194ec4a9ca2381073a17f58esize:528SigningandpushingtrustmetadataEnterpassphraseforsignerkeywithID8ae710e:Successfullysignedregistry.example.com/admin/demo:1#启用$exportDOCKER_CONTENT_TRUST=1#推送$dockerpushregistry.example.com/admin/demo:1Thepushreferstorepository[registry.example.com/admin/demo:1]7bff100f35cb:Pushed1:digest:sha256:3d2e482b82608d153a374df3357c0291589a61cc194ec4a9ca2381073a17f58esize:528SigningandpushingtrustmetadataEnterpassphrase对于ID为8ae710e的签名者密钥:成功签署registry.example.com/admin/demo:1#查看$dockertrustinspect--prettyregistry.example.com/admin/demo:1#删除远程程序服务器对应该镜像$dockertrustrevokeregistry.example.com/admin/demo:1EnterpassphraseforsignerkeywithID8ae710e:Successfullydeletedsignatureforregistry.example.com/admin/demo:1如果要启用,Docker客户端默认禁用图像签名it,然后将DOCKER_CONTENT_TRUST环境变量设置为1。这将防止用户使用未签名的图像文件,对应相应的客户端命令,如push、build、create、pull和run。#拉取失败$dockerpullregistry.example.com/user/image:1Error:remotetrustdatadoesnotexistforregistry.example.com/user/image:registry.example.comdoesnothavetrustdataforregistry.example。com/user/image#拉取成功$dockerpullregistry.example.com/user/image@sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819asha256:ee7491c9c31db1ffb7673d91e9fac5d6354a89d0e97408567e09df069a1687c1:Pullingfromuser/imageff3a5c916c92:Pullcompletea59a168caba3:PullcompleteDigest:sha256:ee7491c9c31db1ffb7673d91e9fac5d6354a89d0e97408567e09df069a1687c1Status:Downloadednewerimageforregistry.example.com/user/image@sha256:ee7491c9c31db1ffb7673d91e9fac5d6354a89d0e97408567e09df069a1687c14。使用示例直接基于hub.docker仓库服务进行操作!下面通过一个配置DCT的简单实际例子进行说明。我们需要一个Docker客户端和一个用于推送图像的存储库,DockerHub上的图像存储库就可以了。#启用特性$exportDOCKER_CONTENT_TRUST#登录hub.docker仓库$dockerlogin#标记镜像并推送到目标镜像库$dockerimagetagalpine:latestescape/dockerbook:v1#推送新标记的镜像#签名时会创建两个密钥,根密钥和库密钥$dockerimagepushnigelpoulton/dockerbook:v1#拉取镜像时使用如下命令覆盖DCT设置$dockerimagepull--disable-content-trustnigelpoulton/dockerbook:unsigned#尝试运行一个未签名的图像容器$dockercontainerrun-d--rmnigelpoulton/dockerbook:unsigneddocker:没有unsigned.5的信任数据。参考链接ContenttrustinDockerDeployNotaryServerwithComposecontainerimagesignature
