イメージ署名とは?コンテナイメージが本物であることを証明する
イメージ署名はコンテナイメージに暗号署名を付与し、消費者がそれが信頼されたbuilderから来て改変されていないことを検証できるようにします。
コンテナイメージはregistry内のただのバイト列であり、registryは侵害されたりイメージが差し替えられたりする可能性があります。イメージ署名はイメージの正確なコンテンツに検証可能な署名を結びつけます。clusterがイメージを実行する前に、署名を確認し、署名されていないものや改ざんされたものを拒否できます。これが悪意あるイメージが本番環境に忍び込むのを防ぐ方法です。
署名が実際に結びつくもの
署名はイメージのdigest、つまりその正確なコンテンツのハッシュに対して行われ、tagに対してではありません。tagはミュータブルで再ポイントできますが、digestはできません。digestに署名するということは、署名がその正確なバイト列に対してのみ有効であることを意味します。
署名と検証のフロー
- buildパイプラインがイメージをbuildした後に署名する。
- 署名がregistry内のイメージとともに保存される。
- deploy時に、admission controllerが署名を検証する。
- 署名されていない、または一致しないイメージは拒否される。
clusterで強制する
署名は何かがそれを確認する場合にのみ役立ちます。admissionポリシー(例えばSigstore policy controllerやKyvernoを介して)はpodが起動する前に署名を検証するため、悪意あるイメージをpushした攻撃者はそれをスケジュールできません。
attestationとの組み合わせ
署名はイメージが信頼できるソースから来たことを証明します。その上に重ねられたattestationはさらに多くを語ります。どのcommitがbuildしたか、そのSBOMは何か、どのscanを通過したか。両者が組み合わさることで、gateが本物の信頼判断を下せます。
CIで安全に署名する
Sigstoreを介したkeyless署名により、パイプラインはworkload identityで保存された鍵なしに署名できます。buildと署名を隔離されたエフェメラルなrunnerで実行することで、署名アイデンティティを他のjobや攻撃者が制御するコードから遠ざけます。
重要なポイント
- イメージ署名は署名をイメージのイミュータブルなdigestに結びつけます。
- admission controllerが署名を検証し、署名されていないイメージや改ざんされたイメージを拒否します。
- keyless署名とattestationにより、deploy gateが本物の信頼判断を下せます。