Helm的出处和诚信

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

版本2.0.0-alpha.4引入了一个验证chart真实性的系统。 虽然我们预计文件格式或证明算法的算法不会发生重大变化,但这部分Helm在2.0.0-RC1发布之前不会被视为冻结。 issure983可以找到有关此功能的原始计划。

概览

通过将chart与出处记录进行比较来建立完整性。 出处记录存储在provenance文件中,并与打包chart一起存储。 例如,如果chart名称为myapp-1.2.3.tgz,则其出处文件将为myapp-1.2.3.tgz.prov。

Provenance文件在打包时生成(helm package —sign …),可以通过多个命令进行检查,值得注意的是helm install —verify。

workflow

本节描述了有效使用provenance数据的潜在工作流程。

先决条件:

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

如果您的PGP私钥具有密码,则系统会提示您输入该密码以查看支持—sign选项的任何命令。

跟之前一样创建一个新chart

  1. $ helm create mychart
  2. Creating mychart

准备打包后,将—sign标志添加到helm包。 另外,指定签名密钥已知的名称和包含相应私钥的密钥环:

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

提示:对于GnuPG用户,您的密钥环在〜/.gnupg/secring.gpg中。 您可以使用gpg —list-secret-keys列出您拥有的密钥。

在这一点上,你应该看到mychart-0.1.0.tgz和mychart-0.1.0.tgz.prov。 这两个文件最终应该上传到您想要的chart存储库。

你可以使用helm verify验证你的chart:

  1. $ helm verify mychart-0.1.0.tgz

验证失败如下所示:

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

要在安装过程中进行验证,请使用—verify标志。

  1. $ helm install --verify mychart-0.1.0.tgz

如果密钥环(包含与签名chart关联的公钥)不在默认位置,则可能需要使用—keyring PATH指向密钥环,如helm软件包示例中所示。

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

使用Keybase.io凭据

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

先决条件:

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

签署软件包

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

  1. $ keybase pgp export -s | gpg --import

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

您可以通过运行进行仔细检查gpg --list-secret-keys

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

请注意,您的密钥将有一个标识符字符串:

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

这是你的钥匙的全名。

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

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

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

验证软件包

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

  1. $ keybase follow technosophos
  2. $ keybase pgp pull

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

此时,您现在可以使用helm verify或带有--verify 标志的任何命令:

  1. $ helm verify somechart-1.2.3.tgz

chart可能无法验证的原因

这些是失败的常见原因。

  • prov文件丢失或损坏。这表明某些内容配置错误或原始维护人员未创建出处文件。
  • 用于签署文件的密钥不在您的钥匙环中。这表明签名chart的实体不是您已经表示信任的人员。
  • prov文件的验证失败。这表明chart或来源数据有问题。
  • 源文件中的文件哈希与存档文件的哈希不匹配。这表明档案已被篡改。

如果验证失败,则有理由怀疑该软件包。

PROVENANCE文件

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

添加了以下几个provenance数据:

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

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

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

该文件的格式如下所示:

  1. -----BEGIN PGP SIGNED MESSAGE-----
  2. name: nginx
  3. description: The nginx web server as a replication controller and service pair.
  4. version: 0.5.1
  5. keywords:
  6. - https
  7. - http
  8. - web server
  9. - proxy
  10. source:
  11. - https://github.com/foo/bar
  12. home: http://nginx.com
  13. ...
  14. files:
  15. nginx-0.5.1.tgz: sha256:9f5270f50fc842cfcb717f817e95178f
  16. -----BEGIN PGP SIGNATURE-----
  17. Version: GnuPG v1.4.9 (GNU/Linux)
  18. iEYEARECAAYFAkjilUEACgQkB01zfu119ZnHuQCdGCcg2YxF3XFscJLS4lzHlvte
  19. WkQAmQGHuuoLEJuKhRNo+Wy7mhE7u1YG
  20. =eifq
  21. -----END PGP SIGNATURE-----

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

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

chart 库

Chart库用作Helm chart的集中集合。

Chart存储库必须能够通过特定的请求通过HTTP为源代码文件提供服务,并且必须使它们在与chart相同的URI路径下可用。

例如,如果软件包的基本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和prov文件。

建立权威和真实性

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

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

但是,对于那些有兴趣使用出处(provenance)系统的人,我们有一些建议和建议:

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

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