Helm来源和完整性

Helm有一个来源工具帮助chart用户检测包的完整性和来源。使用基于PKI,GnuPG及流行包管理器的行业标准工具,Helm可以生成和检测签名文件。

概述

完整性是通过比较chart的出处记录来建立的。出处记录存储在 出处文件,和打包好的chart放在一起。比如, 如果有个名为myapp-1.2.3.tgz的chart,则它的出处文件是myapp-1.2.3.tgz.prov

出处文件会在打包时生成(helm package --sign ...),并可以通过多重命名检查,尤其是helm install --verify

工作流

这部分描述有效使用源数据的潜在工作流。

前置条件:

  • 合法的二进制格式(非ASCII包裹)的PGP密钥对
  • helm命令行工具
  • GnuPG命令行工具(可选)
  • Keybase命令行工具(可选)

注意: 如果你的PGP私钥有密码,系统将提示你为所有支持--sign选项的命令输入密码。

创建新的chart与之前一样:

$ helm create mychart
Creating mychart

一旦准备好打包了,使用helm package命令时添加--sign参数,并且指定已知的字符串key和包含相应私钥的秘钥环:

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

注意: --key参数的值必须是对应key的uid(在gpg --list-keys输出列表中)的子字符串,比如名字或者email。 指纹码 不能 使用。

提示: 针对GnuPG用户,你的私钥的keyring在~/.gnupg/secring.gpg。你可以使用gpg --list-secret-keys列出你需要的key。

警告: GnuPG v2版在默认位置~/.gnupg/pubring.kbx使用了新格式kbx存储私钥的keyring。使用以下命令将你的keyring转换到传统的gpg格式:

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

此时,您应该同时看到了mychart-0.1.0.tgzmychart-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 --generate-name --verify mychart-0.1.0.tgz

如果keyring包含的与签名chart关联的公钥不在默认位置,需要在打包helm package时使用--keyring PATH指定keyring的path。

如果验证失败,chart的安装会在渲染前中止。

使用Keybase.io证书

Keybase.io 服务使得建立加密身份的信任链变得很容易。

前置条件:

  • 配置 Keybase.io 账户
  • 本地已安装GnuPG
  • 本地已安装keybase CLI

对包签名

第一步是将keybase秘钥导入本地的GnuPG的秘钥环keyring:

$ 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秘钥签名的chart。比如你要验证使用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

chart无法验证的原因

一般失败的原因有这些:

  • The .prov file is missing or corrupt. 说明有配置错误或者原有维护者没有创建源文件。
  • The key used to sign the file is not in your keyring. 说明这个签名chart的秘钥不是你已经注明为信任的秘钥。
  • The verification of the .prov file failed. 这说明chart或者源数据有错误。
  • The file hashes in the provenance file do not match the hash of the archive file. 表明chart包已经被篡改。

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

来源文件

来源文件包含chart的YAML文件加上一些验证信息。来源文件会自动生成。

会添加下列源数据:

  • chart文件(Chart.yaml) 让人和工具都可以看到chart中的内容。
  • chart包(.tgz文件)签名(SHA256,就像Docker),可以用来验证chart包的完整性。
  • 使用了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签名,用于 防篡改

Chart仓库

Chart仓库是一个Helm chart的集合。

Chart仓库必须要保证通过指定的http请求提供源文件,同时要确保使用同样URI路径的chart是可用的。

比如,如果包的基础URL是https://example.com/charts/mychart-1.2.3.tgz,则若是存在的源文件地址https://example.com/charts/mychart-1.2.3.tgz.prov必须能访问。

从终端用户的角度来看,helm install --verify myrepo/mychart-1.2.3应该同时下载chart和源文件,且不需要额外的用户配置或操作。

建立权威和真实性

当处理信任链系统时,建立签名者的权威变得非常重要。或者简单来说,上面的系统实际上取决于你信任的签名chart的人。也就意味着你需要信任签名者的公钥。

Helm的一个设计决策是Helm项目不会将自己作为必须的一方插入到信任链中。我们不想针对所有的chart签名者成为“证书颁发机构”, 而是更喜欢分布式模型,这是我们选择OpenPGP作为我们的基础技术的原因之一。所以在建立权威的问题上,在chart 2中或多或少没有定义这一步(会在接下来的Helm 3中决定)。

当然,对于使用源系统感兴趣的人,我们有一些提示和建议:

  • Keybase平台为可靠信息提供了一个公共的中心化的仓库。
    • 你可以使用Keybase存储你的key或者获取其他人的公钥。
    • Keybase还有非常好的文档
    • 我们还没有测试的时候,Keybase的“安全站点”特性可以提供Helm chart。
    • 基础想法是一个官方的“chart审核人”使用他(她)的私钥签名,然后上传源文件到chart仓库。
    • 该想法的一些做法是在仓库的index.yaml文件中列出一些合法的秘钥。