署名キーとは何か?真正性と完全性を証明する
署名キーとは、デジタル署名を生成するために使われる秘密鍵であり、これによって他者はデータが本物であり、改ざんされていないことを検証できます。
署名キーは、非対称鍵ペアの秘密側であり、暗号化のためではなく署名のために使われます。秘密鍵で作成された署名は、公開鍵を持つ誰もが検証でき、データが鍵の保有者から来たものであり、改変されていないことを証明します。CI/CDでは、署名キーはartifact、コンテナイメージ、commitを保護し、サプライチェーンの信頼を支えます。
署名の仕組み
保有者はデータをハッシュ化し、そのハッシュを自身の秘密の署名キーで暗号化して署名を生成します。検証者はハッシュを再計算し、公開鍵を使って署名と照合します。一致すれば、真正性と完全性が同時に証明されます。
署名が証明すること
- 真正性:データは秘密鍵の保有者から来たものである。
- 完全性:データは署名以降に変更されていない。
- 否認防止:署名者は署名したことをもっともらしく否認できない。
CI/CDにおける署名キー
パイプラインはリリースartifact、コンテナイメージ、buildの来歴に署名し、下流の利用者が受け取ったものを検証できるようにします。署名されたcommitとtagにより、レビュアーは変更が信頼できる貢献者から来たことを確認でき、ソフトウェアサプライチェーンを強化します。
秘密鍵の保護
署名キーは、あなたが保持する最も機密性の高いsecretの一つです。それを持つ者は誰でも信頼されたartifactを偽造できます。ハードウェアセキュリティモジュールまたはマネージドキーサービスに保管すべきであり、repoに平文で置いてはならず、スケジュールに沿ってローテーションすべきです。
keyless署名
より新しいアプローチは、長命の秘密鍵に依存するのではなく、workload identity(OIDCを介して)に紐づいた短命の署名証明書を発行します。これにより、OIDCが常設のクラウド認証情報を取り除くのと同じように、常設のキーをパイプラインから取り除きます。
runner上での署名
署名操作はrunner上で実行されます。キーをマネージドサービスに保管し、隔離されたエフェメラルなrunner(Latchkeyのマネージドrunnerなど)を使うことで、ジョブ中の署名材料の露出を制限します。
重要なポイント
- 署名キーとは、検証可能なデジタル署名を作成するために使われる秘密鍵です。
- 署名は、artifactの真正性、完全性、否認防止を証明します。
- 署名キーはハードウェアまたはマネージドサービスで保護するか、keylessなOIDC署名を使いましょう。