Helm 出处和完整性

Helm 拥有 provenance 工具,可帮助图表用户验证包的完整性和来源。使用基于 PKI、GnuPG 和受人尊敬的包管理器的行业标准工具,Helm 可以生成和验证签名文件。

概述

完整性通过将图表与 provenance 记录进行比较来建立。provenance 记录存储在 *provenance 文件* 中,这些文件与打包的图表一起存储。例如,如果一个图表名为 `myapp-1.2.3.tgz`,它的 provenance 文件将是 `myapp-1.2.3.tgz.prov`。

provenance 文件在打包时生成(`helm package --sign ...`),并且可以通过多个命令(特别是 `helm install --verify`)进行检查。

工作流程

本节介绍了使用 provenance 数据的潜在工作流程。

先决条件

  • 以二进制(而不是 ASCII 编码)格式存在的有效 PGP 密钥对
  • helm 命令行工具
  • GnuPG 命令行工具(可选)
  • Keybase 命令行工具(可选)

注意:如果你的 PGP 私钥有密码,你将被提示输入该密码,以便执行支持 `--sign` 选项的任何命令。

创建新图表与以前相同

$ helm create mychart
Creating mychart

一旦准备好打包,请将 `--sign` 标志添加到 `helm package`。此外,请指定签名密钥已知的名义以及包含相应私钥的密钥环

$ helm package --sign --key 'John Smith' --keyring path/to/keyring.secret mychart

注意:`--key` 参数的值必须是所需密钥 `uid`(在 `gpg --list-keys` 的输出中)的子字符串,例如名称或电子邮件。指纹不能使用。

提示:对于 GnuPG 用户,你的秘密密钥环位于 `~/.gnupg/secring.gpg`。你可以使用 `gpg --list-secret-keys` 列出你拥有的密钥。

警告:GnuPG v2 使用新的格式 `kbx` 存储你的秘密密钥环,默认位置为 `~/.gnupg/pubring.kbx`。请使用以下命令将你的密钥环转换为旧的 gpg 格式

$ gpg --export >~/.gnupg/pubring.gpg
$ gpg --export-secret-keys >~/.gnupg/secring.gpg

此时,你应该看到 `mychart-0.1.0.tgz` 和 `mychart-0.1.0.tgz.prov`。这两个文件最终都应该上传到你想要的图表仓库。

你可以使用 `helm verify` 验证图表

$ helm verify mychart-0.1.0.tgz

验证失败的情况如下所示

$ helm verify topchart-0.1.0.tgz
Error: sha256 sum does not match for topchart-0.1.0.tgz: "sha256:1939fbf7c1023d2f6b865d137bbb600e0c42061c3235528b1e8c82f4450c12a7" != "sha256:5a391a90de56778dd3274e47d789a2c84e0e106e1a37ef8cfa51fd60ac9e623a"

要在安装期间进行验证,请使用 `--verify` 标志。

$ helm install --generate-name --verify mychart-0.1.0.tgz

如果包含与已签名图表关联的公钥的密钥环不在默认位置,你可能需要使用 `--keyring PATH` 指向密钥环,就像在 `helm package` 示例中一样。

如果验证失败,安装将在图表渲染之前中止。

使用 Keybase.io 凭据

The Keybase.io 服务使为加密身份建立信任链变得容易。Keybase 凭据可用于签名图表。

先决条件

  • 已配置的 Keybase.io 帐户
  • 本地安装的 GnuPG
  • 本地安装的 `keybase` CLI

签名包

第一步是将你的 keybase 密钥导入到你的本地 GnuPG 密钥环中

$ keybase pgp export -s | gpg --import

这将把你的 Keybase 密钥转换为 OpenPGP 格式,然后将其本地导入到你的 `~/.gnupg/secring.gpg` 文件中。

你可以通过运行 `gpg --list-secret-keys` 进行双重检查。

$ gpg --list-secret-keys
/Users/mattbutcher/.gnupg/secring.gpg
-------------------------------------
sec   2048R/1FC18762 2016-07-25
uid                  technosophos (keybase.io/technosophos) <technosophos@keybase.io>
ssb   2048R/D125E546 2016-07-25

请注意,你的私钥将具有一个标识符字符串

technosophos (keybase.io/technosophos) <technosophos@keybase.io>

这是你密钥的完整名称。

接下来,你可以使用 `helm package` 打包并签名图表。确保在 `--key` 中至少使用该名称字符串的一部分。

$ helm package --sign --key technosophos --keyring ~/.gnupg/secring.gpg mychart

因此,`package` 命令应同时生成 `tgz` 文件和 `tgz.prov` 文件。

验证包

你也可以使用类似的技术来验证由其他人的 Keybase 密钥签名的图表。假设你想验证由 `keybase.io/technosophos` 签名的包。为此,请使用 `keybase` 工具

$ keybase follow technosophos
$ keybase pgp pull

上面的第一个命令跟踪用户 `technosophos`。接下来,`keybase pgp pull` 下载你关注的所有帐户的 OpenPGP 密钥,并将它们放置在你的 GnuPG 密钥环(`~/.gnupg/pubring.gpg`)中。

此时,你就可以使用 `helm verify` 或任何带有 `--verify` 标志的命令了

$ helm verify somechart-1.2.3.tgz

图表可能无法验证的原因

这些是常见的失败原因。

  • `prov` 文件丢失或损坏。这表明配置错误,或者原始维护者没有创建 provenance 文件。
  • 用于签名文件的密钥不在你的密钥环中。这表明签名图表的实体不是你已经表示信任的人。
  • `prov` 文件的验证失败。这表明图表或 provenance 数据本身存在问题。
  • provenance 文件中的文件哈希与存档文件哈希不匹配。这表明存档文件已被篡改。

如果验证失败,则有理由不信任该包。

Provenance 文件

provenance 文件包含图表的 YAML 文件以及一些验证信息。provenance 文件旨在自动生成。

添加以下 provenance 数据

  • 图表文件(`Chart.yaml`)包含在内,以便人和工具都可以轻松查看图表的内容。
  • 图表包(`tgz` 文件)的签名(SHA256,与 Docker 相同)包含在内,可用于验证图表包的完整性。
  • 整个主体使用 OpenPGP 使用的算法进行签名(参见 Keybase.io,了解一种新兴的简化加密签名和验证方法)。

这些组合为用户提供了以下保证

  • 包本身未被篡改(校验包 `tgz`)。
  • 发布此包的实体是已知的(通过 GnuPG/PGP 签名)。

文件的格式如下所示

Hash: SHA512

apiVersion: v2
appVersion: "1.16.0"
description: Sample chart
name: mychart
type: application
version: 0.1.0

...
files:
  mychart-0.1.0.tgz: sha256:d31d2f08b885ec696c37c7f7ef106709aaf5e8575b6d3dc5d52112ed29a9cb92
-----BEGIN PGP SIGNATURE-----

wsBcBAEBCgAQBQJdy0ReCRCEO7+YH8GHYgAAfhUIADx3pHHLLINv0MFkiEYpX/Kd
nvHFBNps7hXqSocsg0a9Fi1LRAc3OpVh3knjPfHNGOy8+xOdhbqpdnB+5ty8YopI
mYMWp6cP/Mwpkt7/gP1ecWFMevicbaFH5AmJCBihBaKJE4R1IX49/wTIaLKiWkv2
cR64bmZruQPSW83UTNULtdD7kuTZXeAdTMjAK0NECsCz9/eK5AFggP4CDf7r2zNi
hZsNrzloIlBZlGGns6mUOTO42J/+JojnOLIhI3Psd0HBD2bTlsm/rSfty4yZUs7D
qtgooNdohoyGSzR5oapd7fEvauRQswJxOA0m0V+u9/eyLR0+JcYB8Udi1prnWf8=
=aHfz
-----END PGP SIGNATURE-----

请注意,YAML 部分包含两个文档(用 `...\n` 分隔)。第一个文件是 `Chart.yaml` 的内容。第二个是校验和,一个将文件名映射到该文件在打包时的 SHA-256 散列的映射。

签名块是一个标准的 PGP 签名,它提供了 篡改抵抗力.

图表仓库

图表仓库充当 Helm 图表的集中式集合。

图表仓库必须能够通过特定请求在 HTTP 上提供 provenance 文件,并且必须在与图表相同的 URI 路径上提供它们。

例如,如果包的基本 URL 是 `https://example.com/charts/mychart-1.2.3.tgz`,那么 provenance 文件(如果存在)必须在 `https://example.com/charts/mychart-1.2.3.tgz.prov` 上可访问。

从最终用户的角度来看,`helm install --verify myrepo/mychart-1.2.3` 应该会导致图表和 provenance 文件的下载,无需任何额外的用户配置或操作。

基于 OCI 的注册表中的签名

将图表发布到 基于 OCI 的注册表 时,helm-sigstore 插件 可用于将 provenance 发布到 sigstore如文档所述,创建 provenance 和使用 GPG 密钥签名的过程是通用的,但 `helm sigstore upload` 命令可用于将 provenance 发布到不可变透明日志。

建立权威和真实性

在处理信任链系统时,能够建立签名者的权威性非常重要。或者,更直白地说,上面的系统依赖于你信任签署图表的人。反过来,这意味着你需要信任签名者的公钥。

Helm 的一个设计决策是,Helm 项目不会将自己作为必要方插入信任链中。我们不想成为所有图表签名者的“证书颁发机构”。相反,我们强烈倾向于去中心化的模型,这也是我们选择 OpenPGP 作为基础技术的部分原因。因此,在建立权威性方面,我们在 Helm 2 中将其留待定义(这一决定在 Helm 3 中得以延续)。

但是,对于那些有兴趣使用 provenance 系统的人,我们有一些提示和建议

  • Keybase 平台提供了一个公共的集中式信任信息存储库。
    • 您可以使用 Keybase 来存储您的密钥或获取他人的公钥。
    • Keybase 还提供很棒的文档。
    • 虽然我们还没有测试,但 Keybase 的“安全网站”功能可以用于提供 Helm 图表。
    • 基本思路是,官方的“图表审核员”使用他或她的密钥对图表进行签名,然后将生成的来源文件上传到图表存储库。
    • 有人提出,可以在存储库的 index.yaml 文件中包含一个有效签名密钥列表。