Helm 的出处与完整性验证

Helm 拥有可帮助 chart 用户验证 chart 包完整性和出处的工具。使用基于 PKI,GnuPG 和备受尊敬的软件包管理器的行业标准工具,Helm 可以生成并验证签名文件。

概述

完整性通过将 chart 与其出处记录进行比较来确定。出处记录存储在出处文件 provenance 中,并与打包的 chart 一起存储。例如,如果 chart 包被命名 myapp-1.2.3.tgz,其出处文件将是 myapp-1.2.3.tgz.prov

出处文件在打包时生成(helm package --sign ...),并且可以通过多个命令检查,比如 helm install --verify

工作流程

本节描述了有效使用出处数据的可用的工作流程。

前提条件:

  • 二进制(非 ASCII)格式的有效 PGP 密钥对
  • helm 命令行工具
  • GnuPG >=2.1 命令行工具(可选)
  • Keybase 命令行工具(可选)

    ** 注意:** 如果 PGP 私钥有密码,支持 --sign 选项的任何命令系统将提示输入密码。可以设置 HELM_KEY_PASSPHRASE 环境变量避免每次输入.

** 注意:** GnuPG 的密钥文件格式在 2.1 版中已更改。在该版本之前,没有必要从 GnuPG 中导出密钥,可以将 Helm 指向你的 * .gpg 文件。使用 2.1 时,引入了新的 .kbx 格式,Helm 不支持这种格式。

创建 chart:

$ helm create mychart
Creating mychart

准备打包后,将 --sign 参数加到 helm package。另外,指定已知签名密钥和包含相应私钥的密钥环 keyring:

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

** 提示:** 对于 GnuPG 用户,密钥环已存在 ~/.gnupg/secring.kbx。可以使用 gpg –list-secret-keys 列出拥有的密钥。

** 警告:** GnuPG v2.1 在默认位置在 〜/ .gnupg / pubring.kbx,使用新格式’kbx’存储密钥 keyring。请使用以下命令将钥匙 keyring 转换为传统的 gpg 格式:

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

到这里,应该可用看到 mychart-0.1.0.tgz 和 mychart-0.1.0.tgz.prov。这两个文件最终应该上传到想要的 chart 库。

可以使用 helm verify 以下方式验证 chart:

$ 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 --verify mychart-0.1.0.tgz

如果密钥 keyring(包含与签名 chart 关联的公钥)不在默认位置,则可能需要 --keyring PATHhelm package 示例中那样指向密钥 keyring。

如果验证失败,在 chart 被推到 Tiller 之前中止安装终止。

使用 Keybase.io 凭据

该 Keybase.io 服务可以很容易建立信任链的密码身份。密钥库凭证可用于对 chart 进行签名。

前提条件:

  • 已配置的 Keybase.io 帐户
  • GnuPG 在本地安装
  • keybaseCLI 本地安装

签署软件包

第一步是将 keybase 密钥导入到本地 GnuPG 密钥 keyring 中:

$ keybase pgp export -s > secring.gpg

这会将 Keybase 密钥转换为 OpenPGP 格式,然后将其本地导入到 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

提示: 如果你想添加一个 Keybase key 到已存在的 keyring, 你需要执行 keybase pgp export -s | gpg --import && gpg --export-secret-keys --outfile secring.gpg

你的密钥有一个标识符字符串:

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

这是钥匙的全名。

接下来,可以使用 helm package 打包和签名 chart。--key 确保至少使用该名称字符串的一部分。

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

结果,package 命令应该生成一个. tgz 文件和一个. tgz.prov 文件。

验证软件包

还可以使用类似的技术来验证由其他人的 Keybase 密钥签名的 chart。假设想验证签名的软件包 keybase.io/technosophos。请使用该 keybase 工具:

$ keybase follow technosophos
$ keybase pgp pull

上面的第一条命令跟踪用户 technosophos。接下来 keybase pgp pull ,将关注的所有帐户的 OpenPGP 密钥下载到 GnuPG 密钥环(~/.gnupg/pubring.gpg1)中

到此,可以使用 helm verify 或带有 --verify 参数的任何命令:

$ helm verify somechart-1.2.3.tgz

可能无法验证的原因

下面是失败的常见原因。

  • prov 文件丢失或损坏。这表明某些内容配置错误或原始维护人员未创建出处文件。
  • 用于签署文件的密钥不在钥匙 keyring 中。这表明签名 chart 的组织不是已经信任的人员。
  • prov 文件的验证失败。这表明 chart 或出处数据有问题。
  • prov 文件中的文件哈希与压缩包文件的哈希不匹配。这表明压缩包已被篡改。
  • 如果验证失败,则有理由怀疑该软件包有问题。

Provenance 文件

Provenance 文件包含 chart 的 YAML 文件以及几条验证信息。Provenance 文件被设计自动生成。

添加了以下几个出处数据:

  • 包含 chart 文件(Chart.yaml)可以让人员和工具轻松查看 chart 内容。
  • 包括 chart 包(.tgz 文件)的签名(SHA256,就像 Docker)一样,可用于验证 chart 包的完整性。
  • 整个文件使用 PGP 使用的算法进行签名(参见 [https://keybase.io],这是一种使加密签名和验证变得容易的新方法)。

这样的组合给了用户以下保证:

  • 包本身没有被篡改(校验和包 tgz)。
  • 已知发布此包的组织(通过 GnuPG / PGP 签名)。

该文件的格式如下所示:

-----BEGIN PGP SIGNED MESSAGE-----
name: nginx
description: The nginx web server as a replication controller and service pair.
version: 0.5.1
keywords:
  - https
  - http
  - web server
  - proxy
source:
- https://github.com/foo/bar
home: https://nginx.com

...
files:
        nginx-0.5.1.tgz: “sha256:9f5270f50fc842cfcb717f817e95178f”
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEARECAAYFAkjilUEACgQkB01zfu119ZnHuQCdGCcg2YxF3XFscJLS4lzHlvte
WkQAmQGHuuoLEJuKhRNo+Wy7mhE7u1YG
=eifq
-----END PGP SIGNATURE-----

注意,YAML 部分包含两个文档(由分隔 ...\n)。首先是 Chart.yaml。第二个是校验和,一个文件名到 SHA-256 摘要的映射(上显示的值是假的 / 被截断的)

签名块是一个标准的 PGP 签名,它提供了 防篡改 功能。

Chart 库

Chart 库用作 Helm chart 的集中场所。

Chart 存储库必须能够通过特定的请求通过 HTTP 为 provenance 文件提供服务,并且必须使它们在与 chart 相同的 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 应该无需额外的配置或操作即可下载 chart 和 provenance 文件。

确认认证和鉴权

在处理信任链系统时,能够确认签名者的认证很重要。或者,简单地说,上述系统取决于相信签名人员的事实。这反过来又意味着你需要信任签名者的公钥。

Kubernetes Helm 的设计决策之一是 Helm 项目不会将自己插入信任链中作为必要的组分。我们不希望成为所有 chart 签名者的 “证书颁发机构”。相反,我们强烈支持分散模式,这是我们选择 OpenPGP 作为基础技术的原因之一。所以说到确认认证时,我们在 Helm 2.0.0 中对这个步骤或多或少未明确定义。

但是,对于那些有兴趣使用 povenance 系统的人,我们有一些建议:

  • Keybase 平台提供了可靠信息的公开集中存放。
  • 可以使用 Keybase 存储密钥或获取其他公钥。
  • Keybase 也有很多可用的文档
  • 虽然我们还没有对它进行测试,但 Keybase 的 “安全网站” 功能可用于服务 Helm chart。
  • Kubernetes chart 项目 正在设法解决这个管方 chart 库 official Kubernetes Charts project 问题。
  • 这里有一个 很长的 issue,详细介绍了当前的想法。
  • 基本思想原则是官方的 “chart reviewer” 用她或他的钥匙签名 chart,然后将得到的 Provence 文件上传到 chart 存储库。
  • 关于 ` 有效签名密钥列表可包含在 index.yaml 存储库文件中 ` 的想法已经有了一些工作进展。

最后,信任链是Helm的一个发展特征,一些社区成员已经提出了将OSI模型的一部分用于签名。这是Helm团队的一个开放性调查。如果你有兴趣,请参与其中。