如何使用 docker trust signer remove 命令移除签名者

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本次实验中,你将学习如何使用 docker trust signer remove 命令管理 Docker 仓库的签名者。首先,我们会检查仓库当前的签名者,以了解现有的信任关系。

检查完成后,你将练习从单个仓库中移除签名者,然后验证移除是否成功。最后,你将学习如何同时从多个仓库中移除签名者,并确认更改。本次实验将让你亲身体验如何管理 Docker 中的内容信任。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/tag("Tag an Image") subgraph Lab Skills docker/inspect -.-> lab-555257{{"如何使用 docker trust signer remove 命令移除签名者"}} docker/pull -.-> lab-555257{{"如何使用 docker trust signer remove 命令移除签名者"}} docker/tag -.-> lab-555257{{"如何使用 docker trust signer remove 命令移除签名者"}} end

检查仓库的当前签名者

在这一步中,你将学习如何检查 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

你应该会看到列出签名者及其密钥的输出,这表明该仓库已被签名。输出将显示有关 TargetsReleases 签名者的信息。

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/trusttestSigners 部分下,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/trusttestSigners 部分下没有 Releases,这证实了该签名者已成功从这个特定仓库中移除。

从多个仓库中移除签名者

在这一步中,你将学习如何使用 Docker 内容信任(Docker Content Trust)同时从多个 Docker 仓库中移除签名者。当需要在多个仓库中撤销某个签名者的授权时,这种方法非常高效。

docker trust signer remove 命令允许你在签名者名称之后指定多个仓库。

假设你还有另一个仓库,例如 docker/another-trusttest,它也有 Releases 签名者。要使用一条命令从 docker/trusttestdocker/another-trusttest 这两个仓库中移除 Releases 签名者,你需要列出这两个仓库的名称。

首先,拉取 hello-world 镜像,将其用作第二个仓库进行演示。然后为其打标签,以模拟另一个仓库。

docker pull hello-world
docker tag hello-world docker/another-trusttest

现在,从 docker/trusttestdocker/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/trusttestSigners 列表中。

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 环境中管理内容信任的实际应用。