简介
在本次实验中,你将学习如何使用 docker trust signer remove
命令管理 Docker 仓库的签名者。首先,我们会检查仓库当前的签名者,以了解现有的信任关系。
检查完成后,你将练习从单个仓库中移除签名者,然后验证移除是否成功。最后,你将学习如何同时从多个仓库中移除签名者,并确认更改。本次实验将让你亲身体验如何管理 Docker 中的内容信任。
在本次实验中,你将学习如何使用 docker trust signer remove
命令管理 Docker 仓库的签名者。首先,我们会检查仓库当前的签名者,以了解现有的信任关系。
检查完成后,你将练习从单个仓库中移除签名者,然后验证移除是否成功。最后,你将学习如何同时从多个仓库中移除签名者,并确认更改。本次实验将让你亲身体验如何管理 Docker 中的内容信任。
在这一步中,你将学习如何检查 Docker 仓库的当前签名者。Docker 内容信任(Docker Content Trust)允许你验证所使用的所有镜像的完整性和发布者。启用内容信任后,Docker 会确保你拉取的镜像已签名。
首先,让我们启用 Docker 内容信任。你可以通过将 DOCKER_CONTENT_TRUST
环境变量设置为 1
来实现。
export DOCKER_CONTENT_TRUST=1
现在内容信任已启用,当你与镜像进行交互时,Docker 会检查签名。要检查仓库的签名者,你可以使用 docker trust inspect
命令,后跟仓库名称。
让我们来检查 ubuntu
仓库的签名者。
docker trust inspect ubuntu
你应该会看到类似以下的输出,显示签名者及其密钥:
No signatures for ubuntu
此输出表明 ubuntu
仓库目前没有签名。对于许多官方镜像来说,除非它们明确启用了内容信任和签名,否则这是正常现象。
让我们尝试检查一个已知有签名的仓库,例如 docker/trusttest
。我们需要先拉取该镜像,以确保我们拥有必要的元数据。
docker pull docker/trusttest
现在,检查 docker/trusttest
的签名者。
docker trust inspect docker/trusttest
你应该会看到列出签名者及其密钥的输出,这表明该仓库已被签名。输出将显示有关 Targets
和 Releases
签名者的信息。
Signers of docker/trusttest:
ROLE KEYS
---- ----
Releases 0a0d52c692a8b3459f3422732222222222222222222222222222222222222222: docker/trusttest
Signatures for docker/trusttest:
SIGNER KEYS
------ ----
Releases 0a0d52c692a8b3459f3422732222222222222222222222222222222222222222: docker/trusttest
此输出确认 docker/trusttest
仓库已被签名,并列出了与签名者关联的密钥。
在这一步中,你将学习如何使用 Docker 内容信任(Docker Content Trust)从单个 Docker 仓库中移除签名者。当签名者的密钥泄露,或者用户不再被授权为特定仓库的镜像签名时,此操作非常有用。
要移除签名者,我们使用 docker trust signer remove
命令。该命令需要指定要移除的签名者名称以及要从中移除该签名者的仓库。
让我们从 docker/trusttest
仓库中移除 Releases
签名者。回顾上一步可知,docker/trusttest
有一个 Releases
签名者。
docker trust signer remove Releases docker/trusttest
运行此命令时,系统会提示你确认移除操作。输入 y
并按回车键继续。
Removing signer "Releases" from docker/trusttest. Are you sure you want to continue? (y/n): y
确认后,签名者将从指定的仓库中移除。你应该会看到表明移除成功的输出。
Successfully removed signer "Releases" from docker/trusttest
此命令会在公证服务器(notary server)存储的信任数据中,移除 Releases
签名者的公钥与 docker/trusttest
仓库的关联。它不会删除签名者的密钥本身,只是撤销其为该特定仓库签名的授权。
在这一步中,你将验证签名者是否已成功从仓库中移除。你可以像第一步那样,再次使用 docker trust inspect
命令来完成验证。
在上一步中,你从 docker/trusttest
仓库移除了 Releases
签名者,因此你应该期望运行 docker trust inspect docker/trusttest
时,输出中不再将 Releases
列为签名者。
让我们再次检查 docker/trusttest
的签名者。
docker trust inspect docker/trusttest
仔细观察输出。你会发现,在 docker/trusttest
的 Signers
部分下,Releases
签名者已不再列出。
Signers of docker/trusttest:
ROLE KEYS
---- ----
Targets 0a0d52c692a8b3459f3422732222222222222222222222222222222222222222: docker/trusttest
Signatures for docker/trusttest:
SIGNER KEYS
------ ----
Releases 0a0d52c692a8b3459f3422732222222222222222222222222222222222222222: docker/trusttest
请注意,虽然 Releases
签名者已从授权的 Signers
列表中移除,但 Signatures
部分可能仍会显示由 Releases
所做的签名。这是因为 remove
命令只是撤销了签名者为未来镜像签名的 授权,但不一定会立即从公证服务器(notary server)中移除现有的签名。不过,为了验证签名者在该仓库中的 角色 是否已被移除,检查 Signers
列表就足够了。
docker/trusttest
的 Signers
部分下没有 Releases
,这证实了该签名者已成功从这个特定仓库中移除。
在这一步中,你将学习如何使用 Docker 内容信任(Docker Content Trust)同时从多个 Docker 仓库中移除签名者。当需要在多个仓库中撤销某个签名者的授权时,这种方法非常高效。
docker trust signer remove
命令允许你在签名者名称之后指定多个仓库。
假设你还有另一个仓库,例如 docker/another-trusttest
,它也有 Releases
签名者。要使用一条命令从 docker/trusttest
和 docker/another-trusttest
这两个仓库中移除 Releases
签名者,你需要列出这两个仓库的名称。
首先,拉取 hello-world
镜像,将其用作第二个仓库进行演示。然后为其打标签,以模拟另一个仓库。
docker pull hello-world
docker tag hello-world docker/another-trusttest
现在,从 docker/trusttest
和 docker/another-trusttest
这两个仓库中移除 Releases
签名者。请注意,在实际场景中,docker/another-trusttest
可能实际上并没有 Releases
签名者,但此命令展示了从多个仓库中移除签名者的语法。
docker trust signer remove Releases docker/trusttest docker/another-trusttest
系统会提示你确认对每个仓库的移除操作。针对每个确认提示,输入 y
并按回车键。
Removing signer "Releases" from docker/trusttest. Are you sure you want to continue? (y/n): y
Successfully removed signer "Releases" from docker/trusttest
Removing signer "Releases" from docker/another-trusttest. Are you sure you want to continue? (y/n): y
Successfully removed signer "Releases" from docker/another-trusttest
输出结果证实,Releases
签名者已从两个指定的仓库中移除。此命令提供了一种便捷的方式,通过一次操作就能管理多个仓库的签名者授权。
在这一步中,你将验证签名者是否已成功从在上一步中指定的两个仓库中移除。你将再次对每个仓库使用 docker trust inspect
命令。
首先,检查 docker/trusttest
的签名者。由于你在上一步中移除了 Releases
签名者并确认了移除操作,因此你应该期望 Releases
签名者仍不在 Signers
列表中。
docker trust inspect docker/trusttest
输出结果应显示,Releases
不在 docker/trusttest
的 Signers
列表中。
Signers of docker/trusttest:
ROLE KEYS
---- ----
Targets 0a0d52c692a8b3459f3422732222222222222222222222222222222222222222: docker/trusttest
Signatures for docker/trusttest:
SIGNER KEYS
------ ----
Releases 0a0d52c692a8b3459f3422732222222222222222222222222222222222222222: docker/trusttest
现在,检查 docker/another-trusttest
的签名者。由于你也尝试从这个仓库中移除 Releases
签名者,因此你应该期望它也不在该仓库的 Signers
列表中。
docker trust inspect docker/another-trusttest
docker/another-trusttest
的输出应表明没有签名者,因为 hello-world
(你将其标记为 docker/another-trusttest
)默认没有签名,并且你尝试移除 Releases
签名者(该标签最初就没有这个签名者)。
No signatures for docker/another-trusttest
这证实了,当 docker trust signer remove
命令与多个仓库名称一起使用时,它会尝试从每个列出的仓库中移除指定的签名者。对 docker/trusttest
的验证显示,签名者已成功从之前有该签名者的仓库中移除;对 docker/another-trusttest
的验证显示,没有该签名者的仓库(因此,移除尝试不会添加该签名者)的状态。
在本次实验中,你学习了如何使用 docker trust
命令管理 Docker 仓库的签名者。首先,你启用了 Docker 内容信任(Docker Content Trust),并使用 docker trust inspect
检查了仓库的当前签名者。这让你能够了解在给定仓库中,哪些密钥与镜像签名相关联。
随后,你练习了从单个仓库中移除签名者,并再次使用 docker trust inspect
验证了移除操作。最后,你将所学知识进行拓展,同时从多个仓库中移除了签名者,并确认已成功从所有指定的仓库中移除该签名者。通过这次实践,你了解了 docker trust signer remove
命令在 Docker 环境中管理内容信任的实际应用。