Docker 生产环境之使用可信镜像 - 为内容信任(content trust)管理密钥

本文介绍Docker内容信任使用的五种密钥类型及其作用,包括rootkey、targets、snapshot、timestamp和delegation密钥。同时提供了密钥管理的最佳实践,如选择密码、备份密钥、使用硬件存储及应对密钥丢失的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址

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

密钥描述
root key镜像标签的内容信任根。启用内容信任后,将创建一次 root 密钥。也称为脱机密钥,因为它应该脱机保存。
targets此密钥允许签署镜像标记,以管理 delegation,包括 delegations 密钥或允许的 delegations 路径。也称为存储库密钥,因为此密钥确定可以将哪些标签签入镜像存储库。
snapshot标记当前的镜像标签集合,防止混合和匹配攻击。
timestamp允许 Docker 镜像存储库具有最新安全保证,而无需在客户端定期刷新内容。
delegation可选的标签密钥,允许你将签名镜像标签委托给其他发布者,而无需共享 targets 密钥。

在第一次启用 Content Trust 的情况下执行 docker push 时,会自动为镜像存储库生成 root,targets,snapshot 和 timestamp 密钥:

  • root 和 targets 密钥在本地生成并存储在客户端。
  • timestamp 和 snapshot 安全地生成并存储在与 Docker registry 一起部署的签名服务器中。这些密钥是在不直接暴露于互联网的后端服务中生成的,并且在空闲时进行加密。

Delegation 密钥是可选的,不是作为普通 docker 工作流程的一部分生成的。他们需要手动生成并添加到存储库。

注意:在 Docker Engine 1.11 之前,snapshot 密钥也是在客户端本地生成和存储的。使用 Notary CLI 再次本地管理 snapshot 密钥,以获取使用较新版本的 Docker 创建的存储库。

1. 选择一个密码

为 root 密钥和 repository 密钥选择的密码应该随机生成并存储在密码管理器中。使用 repository 密钥允许用户在存储库上签名镜像标签。密码短语用于加密密钥,并确保丢失的笔记本电脑或意外备份不会使密钥材料处于危险之中。

2. 备份密钥

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

将密钥备份到安全的位置非常重要。repository 密钥的丢失是可恢复的;root 密钥丢失后无法恢复。

Docker 客户端将密钥存储在 ~/.docker/trust/private 目录中。在备份之前,应该通过 tar 将它们压缩到一个存档中:

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

3. 硬件存储和签名

Docker Content Trust 可以使用 Yubikey 4 的 root 密钥进行存储和签名。Yubikey 优先于存储在文件系统中的密钥。当你使用内容信任初始化新的存储库时,Docker Engine 会在本地查找 root 密钥。如果没有找到密钥并且存在 Yubikey 4,则 Docker Engine 将在 Yubikey 4 中创建一个 root 密钥。请参阅 Notary 文档 以获取更多详细信息。

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

4. 丢失密钥

如果发布者丢失密钥,这意味着无法为你的存储库签署可信内容。如果丢失密钥,请联系 Docker Support(support@docker.com)以重置存储库状态。

这种损失还需要每个在损失之前获取标签图像的消费者进行手动干预。 镜像使用者会收到他们已经下载的内容的错误讯息:

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

为了解决这个问题,他们需要下载一个用新密钥签名的新镜像标签。

### Docker `trust inspect` 命令的功能与用法 `docker trust inspect` 是 Docker 中用于查看信任策略的详细信息的一个命令。它主要用于检查由 Notary 和 Docker Content Trust (DCT) 配置的信任元数据,这些元数据定义了如何验证镜像签名以及确保镜像的真实性和完整性。 以下是关于该命令的一些重要说明: #### 功能概述 通过执行 `docker trust inspect`,用户可以获得有关特定镜像或其标签的信任配置的信息。这包括签发者、密钥详情以及其他与内容可信度相关的属性。此功能对于企业环境中实施严格的镜像安全控制尤为重要[^1]。 #### 使用方法 基本语法如下所示: ```bash docker trust inspect [OPTIONS] NAME[:TAG|@DIGEST] ``` - **NAME**: 表示要查询的具体镜像名称。 - **TAG 或 DIGEST**: 可选部分;如果省略,则默认显示最新版本的相关信息。 例如,为了获取名为 `myrepo/app` 的镜像及其标记为 `v1.0` 的具体信任设置,可以运行以下命令: ```bash docker trust inspect myrepo/app:v1.0 ``` 此外还可以附加一些选项来调整输出格式或者过滤结果,比如使用 `-j/--json` 参数返回 JSON 格式的原始数据以便于程序解析。 #### 输出解读 典型的响应可能包含以下几个方面: - **Signatures:** 列出了所有有效的数字签名列表连同它们对应的公钥指纹。 - **Roles:** 显示哪些角色被授权签署当前实体(如开发者, CI系统等). - **Expiration Date:** 指定每条记录的有效期限. 以上各项均有助于管理员评估整个供应链的安全状况并及时更新过期凭证[^2]. #### 注意事项 虽然上述介绍涵盖了大部分常规场景下的应用方式,但在实际部署过程中仍需注意以下几点: - 确保目标主机已启用 Docker Content Trust (`export DOCKER_CONTENT_TRUST=1`) 否则即使存在相关联的信任对象也可能无法正常检视. - 对私有注册表的操作前应先完成身份认证过程(`docker login`)以免因权限不足而导致失败. --- ### 示例代码 下面给出一段简单的脚本演示如何自动化提取某个远程存储库下全部可用版本号所关联的信任细节: ```python import subprocess def get_trust_info(repo_name): try: result = subprocess.run(['docker', 'trust', 'inspect', repo_name], capture_output=True, text=True) if result.returncode != 0: raise Exception(f"Error occurred: {result.stderr}") print(result.stdout) except Exception as e: print(e) if __name__ == "__main__": repository = input("Enter the full path of your docker image including registry domain:") get_trust_info(repository) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值