コンテナの署名について良く分かっておらず、業界スタンダードみたいなものがもうあるのかな。と思っていたら、どうやらそうでもなかったので、個人的なメモとしてまとめてみます。
Cosign
・Sigstore プロジェクトの一部。GitHubページ
・サポートのページを見ると、Docker Hub、AWS ECR、GCP、Azure、GitHub、Quay (Red Hat)、Harbor と殆どの有名所のコンテナレジストリが列挙されている 。
・Red Hat のレジストリ・ソフトウェアである Quay が対応している とある。
Cosign の Kubernetes 対応
・Red Hat の Kubernetes である OpenShift はこのイメージの検証には対応していない。
・Connaisseur という Admission Controller が Cosign の検証に対応している。Connaisseur は、後述 Notary にも対応している。
・Connaisseur は、フランス語で 「鑑定家」「目利き」という意味。
・Gatekeeperを使う方法もある。
Simple Signing (Red Hat)
・Red Hatが採用している方式
・Simple Singing という呼び方が正しいかは?だが、cosign のプロジェクトページ で、この方式で使っている JSONファイルを Simple Signing format
という呼び方をしている。
・GnuPGで鍵のペアを使って秘密鍵でコンテナの digest 等の情報が書いてある JSON のテキストを秘密鍵で暗号化する(署名)。
・署名をホストする Web Server の設置が必要。
・podman、buildah、skopeo 等の Red Hat が提供するコンテナ管理用のコマンドで署名が可能。
・Linux の rpm のパッケージの署名で使われているのと同じ方式。
・OpenShift (Red Hat の Kubernetes)は、コンテナデプロイ時にこの署名を検証するように設定する事ができる
・署名検証用の公開鍵はOpenShiftの各ノードに MCO (Machine Config Operator)という OpenShift 独自の Node 構成用の Controller 経由で組み込まれる。
DCT (Docker Content Trust)
・Nortary をベースに実装と、Docker のマニュアルに記載。
Docker CLI においてはdocker trustコマンドを使って、コンテナーイメージにサインしてプッシュすることができます。
これは Notary 機能の上に実現されています。 詳細は Notary GitHub リポジトリ を参照してください。
・Docker Hub、IBM Cloud Container Registry、Azure Container Registry 等が対応している。
・docker trust
コマンドで署名が可能
・Notaryサーバーが連携した Docker Registry が必要。Notaryサーバーに公開鍵を設置する。
・IBM Cloud Kubernetes は、IBM Cloud Container Registry や、IBM Cloud Continuous Deliveryを含むエコシステム全体としDCTに対応している
・Azure DevOps Services と Azure Container Registry も DCTに対応している
Nortary
・Notary は「公証人」という意味。Git Hub ページ。
・2017年に CNCF Project として採用
・現在、Notary v2 の仕様策定が進んでいる。
Notary v2
・v2ができた背景は、クリーエーションラインさんのブログに少し言及がある。
・2022/03/17時点で、draft1 が最新。draft2は、プレ・リリース
Notary の Kubernetes 対応
・Kubernetes そのものは対応しておらず(参考記事)、Admission Webhookを使って検証する仕組みを作る必用がある。
・IBM の Portieris という Admission Controller 経由で使える。v1を使っておりv2は使ってない。
・Cosign
の所でてきた Connaisseur という Admission Controller も存在している。こちらもv1を使用しており v2は PLANNED
になっている。