如何使用 docker trust sign 命令对镜像进行签名

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 docker trust sign 命令来保障你的 Docker 镜像安全。我们将首先检查一个未签名的镜像,以了解其在签名前的特性。然后,你将以仓库管理员的身份练习对镜像标签进行签名,确认其真实性,并随后验证签名。最后,你将探索作为指定签名者对标签进行签名和验证的过程,展示 Docker 内容信任(Docker Content Trust)的协作特性。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/tag("Tag an Image") docker/ImageOperationsGroup -.-> docker/push("Push Image to Repository") subgraph Lab Skills docker/inspect -.-> lab-555255{{"如何使用 docker trust sign 命令对镜像进行签名"}} docker/pull -.-> lab-555255{{"如何使用 docker trust sign 命令对镜像进行签名"}} docker/tag -.-> lab-555255{{"如何使用 docker trust sign 命令对镜像进行签名"}} docker/push -.-> lab-555255{{"如何使用 docker trust sign 命令对镜像进行签名"}} end

检查未签名的镜像

在这一步中,你将学习如何检查一个未签名的 Docker 镜像。Docker 内容信任(Docker Content Trust)提供了一种验证 Docker 镜像完整性和真实性的方法。然而,并非所有镜像都经过签名。在深入了解签名和验证的概念之前,检查未签名的镜像有助于我们了解该镜像的基本信息。

首先,你需要从 Docker 镜像仓库拉取一个未签名的镜像。你将使用 hello-world 镜像,该镜像通常默认是未签名的。

docker pull hello-world

此命令会将 hello-world 镜像从 Docker Hub 镜像仓库下载到你的本地机器。你应该会看到指示下载进度和完成情况的输出。

接下来,你将使用 docker inspect 命令检查已拉取的镜像。该命令提供有关 Docker 对象(包括镜像、容器、卷和网络)的详细信息。

docker inspect hello-world

此命令的输出将是一个大型的 JSON 文档,其中包含有关 hello-world 镜像的各种详细信息。你可以查看此输出,以了解诸如镜像 ID、创建日期、架构、操作系统和配置等信息。

由于此镜像未签名,你在 docker inspect 命令的输出中不会找到任何与签名或信任相关的信息。从 Docker 内容信任的角度来看,这是未签名镜像的关键特征。

以仓库管理员身份对标签进行签名

在这一步中,你将学习如何以仓库管理员的身份对 Docker 镜像标签进行签名。Docker 内容信任(Docker Content Trust)使用数字签名来确保你拉取的镜像正是发布者所意图的。作为仓库管理员,你有权对镜像标签进行签名,以确认其真实性。

在对镜像进行签名之前,你需要启用 Docker 内容信任。这可以通过将 DOCKER_CONTENT_TRUST 环境变量设置为 1 来实现。

export DOCKER_CONTENT_TRUST=1

此命令会在你当前的终端会话中为后续的 Docker 命令启用内容信任。

现在,让我们为上一步中拉取的 hello-world 镜像添加一个包含仓库名称的新标签。你将使用占位仓库名称 your_docker_username/my-signed-image如果你有 Docker Hub 用户名,请将 your_docker_username 替换为你实际的用户名;在这个实验中,你也可以直接使用 labexuser

docker tag hello-world labexuser/my-signed-image:latest

此命令会创建一个新标签 labexuser/my-signed-image:latest,它指向与 hello-world 相同的镜像。

现在,你将把这个带标签的镜像推送到镜像仓库。当启用 Docker 内容信任时,推送一个未签名的镜像标签会提示你对其进行签名。

docker push labexuser/my-signed-image:latest

当你执行此命令时,Docker 会提示你创建一个新的签名密钥或使用现有的密钥。由于这可能是你第一次进行签名,系统会要求你创建一个新密钥。你需要为新密钥提供一个密码短语。请记住这个密码短语,因为你稍后可能需要用它来对其他镜像进行签名或轮换密钥。

输入并确认密码短语后,Docker 会对镜像标签进行签名,并将其推送到镜像仓库。你应该会看到指示签名过程和推送成功的输出。

以仓库管理员身份验证签名

在这一步中,你将验证上一步中签名的镜像标签的签名。作为仓库管理员,你可以使用 Docker 内容信任(Docker Content Trust)来确保你拉取的镜像就是你签名的那个。

首先,确保 Docker 内容信任仍然处于启用状态。如果你开启了一个新的终端会话,可能需要再次设置环境变量。

export DOCKER_CONTENT_TRUST=1

现在,你将尝试拉取已签名的镜像标签。由于启用了 Docker 内容信任,Docker 会在拉取镜像之前验证签名。

docker pull labexuser/my-signed-image:latest

当你运行此命令时,Docker 会检查 labexuser/my-signed-image:latest 标签是否有有效的签名。如果签名有效且可信,镜像将被拉取。你应该会看到指示正在拉取镜像以及正在验证签名的输出。输出中会明确提到“Verifying trust data for”。

如果签名无效或缺失(且内容信任已启用),拉取操作将失败,从而防止你使用可能已被篡改的镜像。

为了进一步检查与该镜像关联的信任信息,你可以使用 docker trust inspect 命令。

docker trust inspect labexuser/my-signed-image:latest

此命令将显示与指定镜像标签关联的签名的详细信息。你应该会看到有关签名者和已签名标签的信息。此输出确认了镜像标签已成功签名,并且 Docker 内容信任认可该签名。

以签名者身份对标签进行签名

在这一步中,你将了解指定的“签名者”如何对 Docker 镜像标签进行签名。在实际场景中,一个仓库可能有多个签名者,每个签名者负责对特定的标签或版本进行签名。这使得签名过程更加分散和安全。

首先,确保已启用 Docker 内容信任(Docker Content Trust):

export DOCKER_CONTENT_TRUST=1

现在,为你的镜像创建一个新标签,模拟签名者可能负责的不同版本或发布。

docker tag labexuser/my-signed-image:latest labexuser/my-signed-image:v1.0.0

这将创建一个新标签 labexuser/my-signed-image:v1.0.0,指向同一个镜像。

要以不同的“签名者”身份对这个新标签进行签名,你可以使用 docker trust sign 命令。该命令允许你使用特定的密钥显式地对特定标签进行签名。

docker trust sign labexuser/my-signed-image:v1.0.0

当你执行此命令时,Docker 会提示你输入要使用的签名密钥的密码短语。如果你使用的是在步骤 2 中生成的同一密钥,请输入该密码短语。如果你是使用不同密钥的不同签名者,则应使用该密钥的密码短语。

成功输入密码短语后,Docker 将对 labexuser/my-signed-image:v1.0.0 标签进行签名。你应该会看到确认签名过程的输出。

最后,你需要将更新后的信任数据推送到镜像仓库。对已签名标签执行 docker push 命令时,会包含新的签名信息。

docker push labexuser/my-signed-image:v1.0.0

此命令会将 v1.0.0 标签及其关联的签名推送到镜像仓库。

以签名者身份验证签名

在最后这一步,你将验证在上一步中以“签名者”身份签名的 v1.0.0 镜像标签的签名。这展示了任何启用了 Docker 内容信任(Docker Content Trust)的用户如何验证由可信签名者签名的镜像的真实性。

首先,确保已启用 Docker 内容信任。

export DOCKER_CONTENT_TRUST=1

现在,尝试拉取 v1.0.0 镜像标签。由于已启用内容信任,Docker 将验证与此标签关联的签名。

docker pull labexuser/my-signed-image:v1.0.0

与步骤 3 中的验证类似,你应该会看到输出,表明 Docker 正在验证该镜像的信任数据,然后拉取它。这确认了你作为签名者所应用的签名是有效的且被认可的。

为了进一步确认签名信息,你可以再次使用 docker trust inspect 命令。

docker trust inspect labexuser/my-signed-image:v1.0.0

此命令的输出将显示 v1.0.0 标签的签名者。你应该会看到上一步中使用的签名者的密钥信息列在这里。这提供了具体的证据,证明该标签已由可信实体签名。

至此,你对使用 Docker 内容信任对 Docker 镜像标签进行签名和验证的探索就结束了。通过启用内容信任并使用签名密钥,你可以通过确保所使用镜像的完整性和真实性,显著增强容器工作流程的安全性。

总结

在本次实验中,你首先通过检查未签名的镜像,了解了其基本信息以及缺少签名细节的情况,从而学会了如何使用 Docker 内容信任(Docker Content Trust)。接着,你探索了作为仓库管理员对 Docker 镜像标签进行签名的过程,这包括启用内容信任并使用 docker trust sign 命令来确认镜像的真实性。

完成签名过程后,你学会了如何以仓库管理员的身份验证签名,以确保镜像的完整性。你还练习了以指定签名者的身份对标签进行签名,展示了仓库内签名权限的委托。最后,你以签名者的身份验证了签名,确认了委托签名的成功应用和验证。