介绍
供应链证据只有在部署前经过验证才有意义。一个发布包可能包含 Kubernetes 清单文件、SBOM(软件物料清单)、镜像元数据以及校验和文件。校验和用于证明所列文件未被篡改。SBOM 和镜像元数据则帮助你确认发布包中声称包含的镜像和软件包证据是否属实。
在本实验中,你将使用 sha256sum 和 jq 验证本地发布包,确认 SBOM 和镜像元数据描述的是已批准的工作负载,记录一份精简的 JSON 验证结果,并仅部署已批准的清单文件。本实验不需要外部下载或签名工具,重点在于培养 CKS 的核心习惯:在信任发布制品之前,先验证本地证据。
检查发布包
在这一步中,你将在运行任何验证命令之前检查发布包。这一点至关重要,因为校验和文件仅涵盖其中列出的路径。一个文件可能存在于发布包中,但却不在已批准的发布集合内。
从项目目录开始并阅读说明:
cd /home/labex/project
sed -n '1,180p' RELEASE_VALIDATION_NOTES.md
列出发布包中的文件:
find release-bundle -path release-bundle/evidence -prune -o -type f -print | sort | tee release-bundle/evidence/bundle-files.txt
进入发布包目录并检查校验和文件:
cd /home/labex/project/release-bundle
cat checksums.sha256 | tee evidence/checksum-file-review.txt
你应该能看到 manifests/receipt-ledger-approved.yaml、sbom.json 和 image-metadata.json 的校验和。未列出的清单文件应该存在于发布包中,但它不应出现在 checksums.sha256 中。
验证校验和并拒绝未列出的候选文件
在这一步中,你将使用 sha256sum -c 验证已列出的制品。-c 选项会从校验和文件中读取预期的哈希值,并将其与当前文件进行比较。如果结果成功,则意味着所列文件仍然与已批准的校验和匹配。
运行校验和验证:
sha256sum -c checksums.sha256 | tee evidence/checksum-verification.txt
确认未列出的清单文件不属于已批准的校验和证据:
if grep -q 'receipt-ledger-unlisted.yaml' checksums.sha256; then
echo "unlisted manifest is unexpectedly approved" | tee evidence/unlisted-check.txt
else
echo "unlisted manifest is not in the approved checksum list" | tee evidence/unlisted-check.txt
fi
第一个命令应该为三个已列出的文件打印 OK。第二个命令应该显示未列出的清单文件不在已批准的校验和列表中。
匹配 SBOM 元数据与镜像元数据
在这一步中,你将检查 SBOM 和镜像元数据。校验和可以告诉你文件未被篡改,但它无法解释 SBOM 是否描述了你计划部署的镜像。为此,你需要比较这两个文件中的镜像名称和摘要(digest)。
提取 SBOM 组件元数据:
jq '.metadata.component' sbom.json | tee evidence/sbom-component.json
确认 SBOM 包含预期的软件包条目:
jq '.components[] | select(.name == "busybox")' sbom.json | tee evidence/sbom-required-package.json
检查镜像元数据:
jq . image-metadata.json | tee evidence/image-metadata-review.json
现在,根据你刚刚检查的证据创建一个精简的验证 JSON。Shell 变量将从发布包中读取已批准的清单校验和及镜像摘要,而不是对其进行硬编码。
approved_sha="$(awk '$2=="manifests/receipt-ledger-approved.yaml" {print $1}' checksums.sha256)"
image_digest="$(jq -r '.digest' image-metadata.json)"
cat > evidence/validation.json <<EOF
{
"checksum_status": "verified",
"approved_manifest": "manifests/receipt-ledger-approved.yaml",
"approved_manifest_sha256": "${approved_sha}",
"sbom_name": "receipt-ledger",
"sbom_version": "1.8.4",
"sbom_image": "busybox:1.36",
"sbom_package": "busybox",
"image_digest": "${image_digest}",
"rejected_manifest": "manifests/receipt-ledger-unlisted.yaml",
"rejection_reason": "not-listed-in-checksums"
}
EOF
jq -M . evidence/validation.json
此 JSON 并非一份叙述性报告,而是一份机器可读的验证事实记录,是你部署前所需要的依据。
仅部署已批准的清单文件
在这一步中,你将仅部署通过校验和验证的清单文件。未列出的候选文件虽然存在于发布包中,但由于它未在已批准的校验和文件中列出,因此不应将其部署到集群中。
应用已批准的清单文件:
kubectl apply -f manifests/receipt-ledger-approved.yaml
等待部署完成:
kubectl -n cks-prep-sbom rollout status deployment/receipt-ledger --timeout=120s
确认未列出的 Deployment 未被创建:
if kubectl -n cks-prep-sbom get deployment receipt-ledger-unlisted >/dev/null 2>&1; then
echo "unlisted deployment exists" | tee evidence/unlisted-deployment-check.txt
else
echo "unlisted deployment is absent" | tee evidence/unlisted-deployment-check.txt
fi
读取已批准 Pod 的运行时状态:
pod="$(kubectl -n cks-prep-sbom get pod -l app=receipt-ledger --field-selector=status.phase=Running -o jsonpath='{.items[0].metadata.name}')"
kubectl -n cks-prep-sbom exec "$pod" -- cat /release/status.txt | tee evidence/runtime-status.txt
运行时状态应为:
release-status=approved
总结
你检查了本地发布包,验证了已批准的校验和,确认了未列出的候选文件不在已批准的发布集合内,匹配了 SBOM 元数据与镜像元数据,记录了精简的 JSON 验证证据,并仅部署了已批准的 Kubernetes 清单文件。这就是核心的供应链证据工作流:在部署前验证完整性和身份。



