管理内容信任的密钥
对镜像标签的信任是通过使用密钥来管理的。Docker 的内容信任使用五种不同类型的密钥:
| 密钥 | 描述 |
|---|---|
| 根密钥 | 镜像标签的内容信任的根源。当启用内容信任时,您只需创建一次根密钥。也称为离线密钥,因为它应该保持离线状态。 |
| 目标 | 此密钥允许您对镜像标签进行签名,以管理委托,包括委托密钥或允许的委托路径。也称为存储库密钥,因为此密钥决定了哪些标签可以签署到镜像存储库中。 |
| 快照 | 该密钥对当前的镜像标签集合进行签名,防止混合搭配攻击。 |
| 时间戳 | 此密钥允许 Docker 镜像存储库具有新鲜度安全保证,而无需在客户端定期刷新内容。 |
| 委托 | 委托密钥是可选的标签密钥,允许您将镜像标签的签名委托给其他发布者,而无需共享您的目标密钥。 |
当第一次在启用了内容信任的情况下执行 `docker push` 时,系统会自动为镜像仓库生成根密钥、目标密钥、快照密钥和时间戳密钥。
根密钥和目标密钥在客户端本地生成和存储。
时间戳密钥和快照密钥是安全地生成并存储在与 Docker registry 一起部署的签名服务器中的。这些密钥在一个不直接暴露于互联网的后端服务中生成,并且在静止时进行加密。使用 Notary CLI 在本地管理您的快照密钥。
委托密钥是可选的,并且不是作为普通 `docker` 工作流程的一部分生成的。它们需要手动生成并添加到存储库。
选择一个密码
您为根密钥和仓库密钥选择的密码短语应随机生成并存储在密码管理器中。拥有仓库密钥允许用户对仓库中的镜像标签进行签名。密码短语用于加密您的静态密钥,并确保丢失笔记本电脑或意外备份不会将私钥材料置于风险之中。
备份你的密钥
所有 Docker 信任密钥在创建时都会使用您提供的密码进行加密存储。即便如此,您仍应注意备份它们的位置。好的做法是创建两个加密的 USB 密钥。
警告将您的密钥备份到安全可靠的位置非常重要。仓库密钥的丢失是可以恢复的,但根密钥的丢失是无法恢复的。
Docker 客户端将密钥存储在 `~/.docker/trust/private` 目录中。在备份它们之前,您应该将它们 `tar` 成一个归档文件。
$ umask 077; tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private; umask 022
硬件存储和签名
Docker 内容信任可以存储并使用来自 Yubikey 4 的根密钥进行签名。Yubikey 的优先级高于存储在文件系统中的密钥。当您使用内容信任初始化一个新的存储库时,Docker Engine 会在本地查找根密钥。如果没有找到密钥并且存在 Yubikey 4,Docker Engine 会在 Yubikey 4 中创建一个根密钥。有关更多详细信息,请参阅 Notary 文档。
在 Docker Engine 1.11 之前,此功能仅在实验分支中提供。
密钥丢失
警告如果发布者丢失了密钥,这意味着将失去为相关仓库签署镜像的能力。如果您丢失了密钥,请发送电子邮件至 Docker Hub 支持。提醒一下,根密钥的丢失是无法恢复的。
此丢失还需要每个在此丢失事件之前使用了来自此存储库的已签名标签的消费者进行手动干预。
镜像消费者在处理之前从受影响的仓库下载的内容时会收到以下错误
Warning: potential malicious behavior - trust data has insufficient signatures for remote repository docker.io/my/image: valid signatures did not meet threshold
要纠正这个问题,他们需要下载一个用新密钥签名的新镜像标签。