管理内容信任的密钥
镜像标签的信任是通过使用密钥来管理的。Docker 的内容信任使用了五种不同类型的密钥:
| 密钥 | 描述 |
|---|---|
| root key | 镜像标签的内容信任根。启用内容信任时,您只需创建一次根密钥。也称为离线密钥,因为它应保持离线状态。 |
| 目标 | 此密钥允许您签署镜像标签,管理包括委托密钥或允许的委托路径在内的委托。也称为仓库密钥,因为此密钥决定了哪些标签可以签署到镜像仓库中。 |
| snapshot | 此密钥用于签署当前的镜像标签集合,防止混合匹配攻击。 |
| 时间戳 | 此密钥允许 Docker 镜像仓库在不要求客户端定期刷新内容的情况下,具有新鲜度安全保证。 |
| 委托 | 委托密钥是可选的标记密钥,允许您将签名镜像标记委托给其他发布者,而无需共享您的目标密钥。 |
当首次对启用了内容信任的 docker push 进行操作时,
会为该镜像仓库自动生成根密钥、目标密钥、快照密钥和时间戳密钥:
root 键和 targets 键是在客户端本地生成并存储的。
时间戳和快照密钥是在与 Docker 注册表一起部署的签名服务器中安全生成和存储的。这些密钥是在不直接暴露于互联网的后端服务中生成的,并且在静态时加密。使用 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 引擎会在本地查找根密钥。如果 未找到密钥且存在 Yubikey 4,Docker 引擎将在 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
要纠正此问题,他们需要下载一个用新密钥签名的新镜像标签。