检查谁批准了指南更新

网络安全Beginner
立即练习

介绍

Waymark 发布徒步节指南。供应商送来了几个更新交付包。你的工作是接收主办方要求的版本,不能仅凭校验和匹配就信任交付包。

你将使用独立提供的发布者公钥,用 Cosign 验证真实签名,比较所请求的产品和版本,并检查归档摘要。你需要掌握基本终端和路径操作;无需编程或云账户。本实验负责选择更新。下一个引导实验会把这些判断变为可复用的接收脚本。

从徒步节指南和更新请求开始

本步骤先查看正常运行的服务,找到主办方的请求,再选择更新。打开 Event Guide 标签页。当前 event-guide 的版本为 2.0。打开 Old Mill Walk:集合时间是 11:00。使用页面上的 All walks 链接返回,然后下载路线表。网站和 CSV 描述的是相同的两条步行路线。

指南首页在标题上方标明版本,并在每条路线的卡片上显示集合时间:

更新前正常运行的 Waymark 指南

现在切换到 Workspace。这个终端和指南共用同一个容器;这些标签页是不同入口,并非不同机器。cd 用来改变终端的当前目录。以下绝对路径可以在任何目录中使用:

cd /home/labex/project/waymark

cat 显示小型文本文件。阅读主办方独立于交付包提供的请求:

cat /opt/labex-waymark/trust/request.json

该 JSON 对象包含两个命名字段:

{
  "product": "event-guide",
  "version": "2.1"
}

产品标识要更新哪一份指南;版本标识请求的版次。真实的旧版本并不是本次更新。独立固定的公钥为 /opt/labex-waymark/trust/publisher.pub。不要改动这个公钥和请求。

ls 列出目录条目。查看交付目录:

ls candidates

交付包使用 parcel-101 等交付标签;名称不代表批准证据。每个包都包含 manifest.json、manifest.sigstore.json、guide.tar.gz 和 SHA256SUMS。清单描述产品、版本和归档摘要。签名包保存签名。归档保存实际指南文件。保持原始交付包、当前指南、历史发布和访客须知完整。你将把选中的交付包复制到 accepted/。

如果命令报告 No such file or directory,运行上面的绝对路径 cd 命令,用 ls candidates 检查拼写,然后重试。本实验中的操作都不需要重置环境。

理解校验和匹配能说明什么

本步骤将比较两个都能通过旁附校验和检查的交付包。留在 Workspace。

SHA-256 摘要是根据文件字节计算出的指纹。在预期指纹本身可信的前提下,指纹匹配有助于发现字节变化。sha256sum -c 读取校验和列表,将其中命名的文件与列表进行比较。这里的 -c 表示“检查”。由于列表使用相对文件名,请在交付包目录内运行:

cd candidates/parcel-103
sha256sum -c SHA256SUMS

预期输出为 guide.tar.gz: OK。返回项目并尝试另一个交付包:

cd /home/labex/project/waymark/candidates/parcel-104
sha256sum -c SHA256SUMS

同样预期输出 guide.tar.gz: OK。这两个列表都与归档在同一次交付中送达。替换归档的人也可以计算新的旁附校验和。OK 只能证明这两个文件相互一致;它不能识别发布者,也不能证明这是所请求的更新。

返回项目:

cd /home/labex/project/waymark

接下来,你将使用主办方已经信任的公钥验证清单。这样,归档的预期摘要将来自经过验证的清单,而非未经签名的旁附列表。

使用独立公钥验证发布者

本步骤将区分可信的真实签名与未获批准的密钥所做的签名。从 Workspace 的 /home/labex/project/waymark 目录开始。

发布者用私钥签署文件。相应公钥让接收者能够验证签名,并发现已签名文件的变化。公钥必须通过你已经信任的渠道获得。交付包不能批准它自己的密钥。本练习固定使用单独提供在 /opt/labex-waymark/trust/ 下的合成发布者公钥;你不会获得发布者私钥。

Cosign 是已准备好的签名工具。verify-blob 验证文件;--key 选择可信公钥;--bundle 选择签名包。最后一个参数指定被签名字节所属的确切清单。

这些合成交付包签名时没有使用公共透明日志。--insecure-ignore-tlog 明确跳过日志收录验证。它仍要求签名在所选公钥下有效。本地练习不会验证公共 OIDC 身份、证书服务或透明日志;不要把这一例外照搬到要求这些服务的策略中。

下面的交付包由另一把密钥签名。预期验证失败,返回非零退出状态,并显示签名验证错误:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-102/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-102/manifest.json

echo 打印值;$? 是紧前一条命令的退出状态。零表示成功,非零数字表示失败。立即查看:

echo $?

现在验证固定发布者签署的交付包:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-104/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-104/manifest.json

预期出现透明日志警告和 Verified OK:

WARNING: Skipping tlog verification is an insecure practice that lacks transparency and auditability verification for the blob.
Verified OK

检查紧前一条命令的状态:

echo $?

预期为 0。清单由可信密钥签署。这只是其中一个判断;你还需要检查清单批准了什么。

检查签名的产品、版本和归档摘要

本步骤使用已验证的清单判断一个真实交付包是否为所请求的发布。留在 Workspace。

先验证真实的旧版本。该命令预期成功:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-101/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-101/manifest.json

jq 读取 JSON。过滤器 .product, .version 打印这两个命名字段。单引号将过滤器保留为一个参数,避免 shell 解释其中的标点:

jq '.product, .version' candidates/parcel-101/manifest.json

预期为 "event-guide" 和 "2.0"。这是一个真实的指南,但并非请求的 2.1。签名不会自动让旧版本变得适用。

查看上一步已验证的候选包:

cat candidates/parcel-104/manifest.json

它的产品和版本与独立请求一致。sha256 字段是 guide.tar.gz 的 64 字符十六进制摘要;无需记住它。jq -r 打印字段时去掉 JSON 引号。打印预期摘要:

jq -r .sha256 candidates/parcel-104/manifest.json

现在计算实际归档的摘要:

sha256sum candidates/parcel-104/guide.tar.gz

第一个字段必须与已验证清单中的摘要相符。后面打印的文件名不属于摘要。

之前查看过的已改动归档也有真实签名的清单,但它当前的字节已不再与清单一致。先验证其清单,再比较两个摘要来确认这一点:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-103/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-103/manifest.json
jq -r .sha256 candidates/parcel-103/manifest.json
sha256sum candidates/parcel-103/guide.tar.gz

签名通过,但摘要不同。应拒绝此包。现在有三个独立判断:可信签名者、请求的产品/版本,以及一致的归档字节。任一项失败,都意味着尚不能接收更新。

接收请求的交付包并保持线上指南不变

本步骤保存已验证且符合请求的交付包,以便交接。从 Workspace 的 /home/labex/project/waymark 目录开始。

accepted/ 已经存在。cp 复制文件;最后一个参数是目标目录。复制已验证的清单、签名包和归档:

cp candidates/parcel-104/manifest.json candidates/parcel-104/manifest.sigstore.json candidates/parcel-104/guide.tar.gz accepted/

复制后得到一组独立文件。请验证这组文件,不要假定先前的验证也适用于之后的副本:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle accepted/manifest.sigstore.json --insecure-ignore-tlog accepted/manifest.json
jq '.product, .version' accepted/manifest.json
jq -r .sha256 accepted/manifest.json
sha256sum accepted/guide.tar.gz

预期看到有效签名、event-guide、2.1,以及匹配的归档摘要。预先准备的只读自检使用这些实际文件、独立公钥/请求和预期指南内容:

python3 /opt/labex-waymark/verify.py selected

预期输出:

The accepted parcel is the independently signed, requested release with matching archive bytes.

如果失败,检查三个判断中的哪一个未通过,再从正确的原始交付包重复复制并重新验证副本。不要改动独立信任文件。检查不会替你选择交付包,也不会部署它。

切换到 Event Guide 并刷新页面。它仍应显示版本 2.0,Old Mill Walk 的集合时间仍应为 11:00。打开 Visitor notice,确认原来的实用建议仍在。本单元接收交付物以供交接;发布更新是下一单元教授的独立操作。

总结

你结合独立信任的发布者公钥、主办方要求的产品/版本以及实际归档的摘要,接收了真实签名的交付包。你还看到了为什么单凭旁附校验和、旧版本的有效签名,或放在已改动字节旁的签名清单,都不足以做出接收决定。

当前指南仍可使用。在下一个引导实验中,你将把这些判断写入可复用的接收脚本,确保只有已验证的归档字节进入运行中的指南。