依赖项与制品签名
使用 SLSA 和 Sigstore 验证来源。
依赖项与制品签名 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
为什么溯源信息很重要
SBOM 会告诉您软件制品中包含什么。溯源信息会告诉您它来自哪里以及如何构建。签名会将软件制品与可验证的来源绑定,使使用者能够拒绝任何不是由您的受信任流水线生成的制品。
如果没有溯源信息,攻击者替换您仓库中的 tar 压缩包后,就无法与合法发布版本区分开来。
使用摘要,而非标签
完整性的基础是内容寻址。软件制品的加密哈希值(摘要)可以唯一标识其中完全相同的字节。像 latest 这样的可变标签可以被重新指向其他内容,而摘要不会改变。
# pull by immutable digest, not a tag
docker pull my-app@sha256:1d52838af602b4b5a831beb13a0e4d073280665ea7be7f69ce2382f29c5a613f
# compute a file digest
sha256sum release-1.4.0.tar.gz数字签名基础
数字签名使用私钥对软件制品的哈希值进行签名;任何拥有匹配公钥的人都可以验证该签名。这会提供两项保证:
- 完整性——软件制品在签名后未被修改
- 真实性——签名由私钥持有者完成
困难之处不在于数学,而在于密钥管理和信任分发:验证者如何知道应该信任哪个公钥?
使用 Sigstore 进行无密钥签名
传统签名要求团队保护长期存在的私钥,而这些私钥可能会泄露。Sigstore 提供无密钥签名:它会签发一个与 OIDC 身份绑定的短期证书(例如持续集成任务或开发者邮箱),完成签名,并将该事件记录到名为 Rekor 的公开透明日志中。
这样就没有可供窃取的长期密钥,而且每个签名都可以由公众审计。
使用 Cosign 进行签名
Cosign 是 Sigstore 用于签署容器镜像和其他软件制品的工具。在无密钥模式下,它使用流水线的 OIDC 令牌,因此磁盘上不会保存密钥文件。
# keyless sign in CI (uses ambient OIDC identity)
COSIGN_EXPERIMENTAL=1 cosign sign my-registry/my-app@sha256:1d5283...
# verify, asserting the expected signer identity
cosign verify my-registry/my-app@sha256:1d5283... \
--certificate-identity-regexp '.*@my-org\.com' \
--certificate-oidc-issuer https://accounts.google.com透明日志
Sigstore 会将每个签名事件记录到 Rekor 中。Rekor 是一个具备篡改检测能力、只能追加内容的公开日志。这是一项强大的检测性控制措施:
- 您可以证明某项内容何时完成签名
- 窃取身份的攻击者无法秘密地完成签名——该事件会被公开记录
- 异常签名(意外身份、非工作时间)会变得可检测
透明性会将无声的入侵转变为可观测的证据。
SLSA:构建完整性级别
SLSA(软件制品供应链级别)是一个用于评估构建流程可信度的框架。级别越高,对防止篡改的保证要求越严格。
- L1——存在并记录了溯源信息
- L2——由托管构建服务提供已签名的溯源信息
- L3——采用强化且隔离的构建;即使是流水线内部人员也无法伪造溯源信息
SLSA 是一份路线图:选择目标级别并弥补差距。
构建溯源证明
溯源证明是一份经过签名的声明,用于描述软件制品的构建方式:源代码提交、构建者身份、构建参数和输入。in-toto 格式对此进行了标准化。
# generate and attach SLSA provenance for an image
cosign attest --type slsaprovenance \
--predicate provenance.json \
my-registry/my-app@sha256:1d5283...
# verify provenance matches expected source repo
cosign verify-attestation --type slsaprovenance my-registry/my-app@sha256:1d5283...在准入阶段强制执行签名验证
只有在某个机制拒绝未签名的软件制品时,签名才有用。在 Kubernetes 中,准入控制器可以阻止任何缺少有效签名以及来自受信任身份的溯源信息的镜像。
- 策略控制器会在 Pod 启动前验证 Cosign 签名
- 拒绝由意外身份签名的镜像
- 要求溯源信息指向经过批准的源代码仓库
这样就形成了闭环:不受信任的软件制品永远不会运行。
为上游依赖签名
当溯源信息不仅覆盖您发布的内容,也覆盖您使用的内容时,其价值最大。各个生态系统正在加入原生签名和溯源机制:
- npm 溯源信息会将已发布的软件包关联到其源代码提交和持续集成运行记录
- 容器基础镜像越来越多地附带 Cosign 签名
- 编程语言包仓库正在试行由 Sigstore 支持的验证机制
优先选择能够发布可验证溯源信息的依赖项,并在支持的情况下于安装过程中进行验证。
将验证放在首位
实用的签名策略应当分层实施,并在端到端进行验证:
- 通过摘要固定输入
- 对软件制品进行无密钥签名,并附加 SBOM 和溯源证明
- 将所有内容记录到透明日志中
- 在部署时通过准入策略强制执行验证
整个链条的强度取决于其中最薄弱的、未经验证的环节,因此请在每个使用点进行验证。
快速检查:无密钥签名
思考无密钥签名为何能够提升软件供应链安全性。
回顾:依赖项和软件制品签名
您已经学会了如何证明并强制执行溯源信息。
- 通过摘要固定版本,而不是使用可变标签
- 数字签名提供完整性和真实性;挑战在于密钥管理
- Sigstore + Cosign 通过公开的 Rekor 透明日志实现无密钥签名
- SLSA 对构建完整性进行分级;溯源证明记录软件制品的构建方式
- 准入策略会在部署时拒绝任何未签名或不受信任的内容
下一步:强化生成这些软件制品的持续集成/持续交付流水线。
用 AI 导师学习 Cyber Security Academy — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 76
- 课程
- 303
常见问题解答
「依赖项与制品签名」课时是免费的吗?
是的 — 「依赖项与制品签名」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「依赖项与制品签名」这节课中我会学到什么?
使用 SLSA 和 Sigstore 验证来源。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「依赖项与制品签名」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 供应链威胁
- 软件物料清单(SBOM)
- 依赖项与制品签名
- 保护 CI/CD 流水线