artifact署名とは?
artifact署名は、buildの出力に暗号署名を付与し、誰もがそれが改ざんされておらず、あなたから来たものであることを検証できるようにします。
artifactが一度pipelineを離れると、レジストリやネットワークを経由していきます。署名により、利用者は信頼する前に2つのことを確認できます。あなたがbuildして以来変更されていないこと、そしてbuildしたのがあなたであることです。
署名の仕組み
pipelineはartifactのダイジェストを計算し、秘密鍵で署名します。利用者は対応する公開鍵で署名を検証します。artifactが1バイトでも変わっていれば、検証は失敗します。
keyless署名
長命な署名鍵の管理はリスクを伴います。keyless署名(たとえばSigstore/cosign経由)は、OIDCアイデンティティに紐づいた短命な証明書を使うため、漏洩する秘密鍵が存在しません。OIDCによるクラウド認証と同じアイデンティティモデルです。
小さな例
CIでcosign sign <image>を実行すると、workflowのOIDCアイデンティティを使ってコンテナimageに署名します。鍵は保存されません。deployゲートがcosign verifyを実行し、期待するアイデンティティからの有効な署名がないimageを拒否します。
署名とprovenance
署名はartifact自体の完全性と出所を証明します。provenanceはそれがどのようにbuildされたかを記述します。両者は自然に組み合わさります。artifactに署名し、それに付随するprovenanceの声明にも署名します。
検証こそが要点
署名は、何かが署名をチェックする場合にのみ役立ちます。重要な境界(deployステップやadmission controller)で検証を強制すれば、署名のない、あるいは改ざんされたartifactは実行される前に拒否されます。
重要なポイント
- 署名により、利用者はartifactの完全性と出所を検証できます。
- keyless署名は、短命なOIDCアイデンティティを使うことで、長命な鍵を回避します。
- 署名は、何かが検証を強制する場合にのみ有用です。