管理内容信任的密钥

镜像标签的信任是通过使用密钥来管理的。Docker 的内容信任使用了五种不同类型的密钥

密钥描述
root 密钥镜像标签内容信任的根。启用内容信任后,您只需创建一次 root 密钥。也称为离线密钥,因为它应该保持离线存储。
targets 密钥该密钥允许您对镜像标签进行签名,管理委托,包括委托密钥或允许的委托路径。也称为仓库密钥,因为该密钥决定了哪些标签可以签名到镜像仓库中。
snapshot 密钥该密钥对当前镜像标签集合进行签名,防止混合匹配攻击。
timestamp 密钥该密钥使得 Docker 镜像仓库可以提供新鲜度安全保证,而无需客户端定期刷新内容。
delegation 密钥Delegation 密钥是可选的标签密钥,允许您将镜像标签的签名委托给其他发布者,而无需共享您的 targets 密钥。

首次启用内容信任执行 docker push 时,会自动为镜像仓库生成 root、targets、snapshot 和 timestamp 密钥

  • root 和 targets 密钥在客户端本地生成和存储。

  • timestamp 和 snapshot 密钥安全地生成并存储在与 Docker registry 一起部署的签名服务器中。这些密钥在后端服务中生成,该服务不直接暴露于互联网,并且在静态时是加密的。使用 Notary CLI 在本地管理您的 snapshot 密钥

Delegation 密钥是可选的,不会作为常规 docker 工作流程的一部分生成。它们需要手动生成并添加到仓库

选择一个密码

您为 root 密钥和仓库密钥选择的密码应随机生成并存储在密码管理器中。拥有仓库密钥允许用户对仓库中的镜像标签进行签名。密码用于对静态密钥进行加密,确保丢失的笔记本电脑或意外的备份不会泄露私钥材料。

备份密钥

所有 Docker 信任密钥都使用您创建时提供的密码加密存储。即使如此,您仍然应该注意备份它们的位置。一个好的做法是创建两个加密的 USB 密钥。

警告

将您的密钥备份到安全可靠的位置非常重要。仓库密钥丢失是可恢复的,但 root 密钥丢失则不可恢复。

Docker 客户端将密钥存储在 ~/.docker/trust/private 目录中。在备份它们之前,您应该将它们 tar 打包成归档文件

$ umask 077; tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private; umask 022

硬件存储和签名

Docker 内容信任可以使用 Yubikey 4 中的 root 密钥进行存储和签名。Yubikey 的优先级高于存储在文件系统中的密钥。当您使用内容信任初始化新的仓库时,Docker Engine 会在本地查找 root 密钥。如果找不到密钥且存在 Yubikey 4,Docker Engine 会在 Yubikey 4 中创建 root 密钥。有关更多详细信息,请参阅 Notary 文档

在 Docker Engine 1.11 之前,此功能仅在实验分支中提供。

密钥丢失

警告

如果发布者丢失了密钥,意味着失去了对相关仓库中的镜像进行签名的能力。如果您丢失了密钥,请发送电子邮件至 Docker Hub 支持。提醒一下,root 密钥的丢失是不可恢复的。

这种丢失还需要在使用该仓库丢失前签名标签的每个消费者进行手动干预。
镜像消费者对于之前从受影响的仓库下载的内容会看到以下错误

Warning: potential malicious behavior - trust data has insufficient signatures for remote repository docker.io/my/image: valid signatures did not meet threshold

为了纠正此问题,他们需要下载使用新密钥签名的新镜像标签。

页面选项