Helmの来歴と完全性
Helmには、チャートユーザーがパッケージの完全性と出所を検証するのに役立つ来歴ツールがあります。PKI、GnuPG、および定評のあるパッケージマネージャーに基づいた業界標準のツールを使用することで、Helmは署名ファイルを生成および検証できます。
概要
完全性は、チャートを来歴レコードと比較することで確立されます。来歴レコードは、パッケージ化されたチャートとともに保存される来歴ファイルに保存されます。たとえば、チャートの名前がmyapp-1.2.3.tgz
の場合、その来歴ファイルはmyapp-1.2.3.tgz.prov
になります。
来歴ファイルはパッケージング時 (helm package --sign ...
) に生成され、複数のコマンド、特にhelm install --verify
でチェックできます。
ワークフロー
このセクションでは、来歴データを効果的に使用するための潜在的なワークフローについて説明します。
前提条件
- バイナリ(ASCII装甲ではない)形式の有効なPGPキーペア
helm
コマンドラインツール- GnuPG コマンドラインツール (オプション)
- Keybase コマンドラインツール (オプション)
注: PGP秘密鍵にパスフレーズがある場合は、--sign
オプションをサポートするすべてのコマンドでそのパスフレーズを入力するように求められます。
新しいチャートの作成は以前と同じです
$ helm create mychart
Creating mychart
パッケージ化の準備ができたら、helm package
に--sign
フラグを追加します。また、署名キーが認識される名前と、対応する秘密鍵を含むキーリングを指定します
$ 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は、デフォルトの場所~/.gnupg/pubring.kbx
に新しい形式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
署名付きチャートに関連付けられた公開キーを含むキーリングがデフォルトの場所ではない場合は、helm package
の例のように、--keyring PATH
でキーリングを指す必要がある場合があります。
検証に失敗した場合、チャートがレンダリングされる前にインストールは中止されます。
Keybase.ioの資格情報を使用する
Keybase.ioサービスを使用すると、暗号化されたIDの信頼チェーンを簡単に確立できます。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
ファイル) の署名 (Dockerと同じSHA256) が含まれており、チャートパッケージの完全性を検証するために使用できます。 - 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セクションには、2つのドキュメント (...\n
で区切られています) が含まれていることに注意してください。最初のファイルはChart.yaml
の内容です。2番目は、チェックサム、つまりパッケージング時のファイルの内容の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の「セキュアWebサイト」機能は、Helmチャートを配信するために使用できる可能性があります。
- 基本的な考え方としては、公式の「チャートレビュー担当者」が自身のキーでチャートに署名し、その結果生成される来歴ファイルをチャートリポジトリにアップロードするというものです。
- 有効な署名キーのリストをリポジトリの
index.yaml
ファイルに含めるというアイデアに関する作業も進められています。