Helm 出處與完整性

Helm 具有出處工具,可幫助圖表使用者驗證套件的完整性和來源。Helm 使用基於 PKI、GnuPG 和備受推崇的套件管理器的產業標準工具,可以產生和驗證簽章檔案。

概觀

完整性是透過將圖表與出處記錄進行比較來建立的。出處記錄儲存在出處檔案中,這些檔案與打包的圖表一起儲存。例如,如果圖表的名稱為 myapp-1.2.3.tgz,則其出處檔案將為 myapp-1.2.3.tgz.prov

出處檔案會在打包時產生 (helm package --sign ...),並且可以透過多個命令檢查,尤其是 helm install --verify

工作流程

本節說明有效使用出處數據的潛在工作流程。

先決條件

  • 二進位格式 (非 ASCII-armored 格式) 的有效 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.tgzmychart-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 憑證

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 檔案遺失或損毀。這表示設定錯誤,或是原始維護人員未建立出處檔案。
  • 用於簽署檔案的金鑰不在您的金鑰環中。這表示簽署圖表的實體不是您已經表示信任的人。
  • .prov 檔案的驗證失敗。這表示圖表或出處數據有問題。
  • 出處檔案中的檔案雜湊與封存檔案的雜湊不符。這表示封存檔案已被竄改。

如果驗證失敗,則有理由不信任該套件。

出處檔案

出處檔案包含圖表的 YAML 檔案,以及數個驗證資訊。出處檔案的設計目的是自動產生。

會新增以下出處數據

  • 圖表檔案 (Chart.yaml) 已包含在內,以便讓人員和工具都能輕鬆檢視圖表的內容。
  • 圖表套件 (.tgz 檔案) 的簽章 (SHA256,就像 Docker) 已包含在內,並且可以用來驗證圖表套件的完整性。
  • 整個主體使用 OpenPGP 使用的演算法進行簽署 (請參閱 Keybase.io,了解新興的加密簽署和驗證方法)。

這兩者的組合為使用者提供了以下保證

  • 套件本身未被竄改 (checksum 套件 .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 的內容。第二個檔案是 checksums,一個檔案名稱到打包時該檔案內容的 SHA-256 摘要的對應表。

簽章區塊是標準的 PGP 簽章,它提供 防竄改 功能。

圖表儲存庫

圖表儲存庫充當 Helm 圖表的集中存放處。

圖表儲存庫必須能夠透過特定請求透過 HTTP 提供出處檔案,並且必須在與圖表相同的 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 應該會導致圖表和出處檔案的下載,而無需額外的使用者設定或操作。

基於 OCI 的儲存庫中的簽章

將圖表發布到 基於 OCI 的儲存庫 時,可以使用 helm-sigstore 外掛程式 將出處發布到 sigstore如文件中所述,建立出處和使用 GPG 金鑰簽章的過程很常見,但可以使用 helm sigstore upload 命令將出處發布到不可變的透明度日誌。

建立權限和真實性

在處理信任鏈系統時,能夠建立簽章者的權限非常重要。或者,簡單來說,上述系統取決於您信任簽署圖表的人員。反過來,這表示您需要信任簽章者的公開金鑰。

Helm 的設計決策之一是 Helm 專案本身不會作為必要的一方介入信任鏈。我們不希望成為所有圖表簽署者的「憑證授權單位」。相反地,我們強烈支持去中心化模型,這也是我們選擇 OpenPGP 作為基礎技術的部分原因。因此,在建立授權方面,我們在 Helm 2 中或多或少地將此步驟留作未定義狀態(此決策在 Helm 3 中沿用)。

然而,對於那些有興趣使用來源系統的人,我們有一些指標和建議。

  • Keybase 平台提供了一個公開的集中式信任資訊儲存庫。
    • 您可以使用 Keybase 來儲存您的金鑰或取得其他人的公鑰。
    • Keybase 也提供了非常棒的說明文件。
    • 雖然我們還沒有測試過,但 Keybase 的「安全網站」功能可以用來提供 Helm 圖表。
    • 基本概念是由官方的「圖表審核員」使用他或她的金鑰簽署圖表,然後將產生的來源檔案上傳到圖表儲存庫。
    • 目前有一些關於在儲存庫的 index.yaml 檔案中包含有效簽署金鑰列表的想法。