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