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.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 憑證
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
檔案中包含有效簽署金鑰列表的想法。