コンテナのイメージ署名に関する現状

コンテナの署名について良く分かっておらず、業界スタンダードみたいなものがもうあるのかな。と思っていたら、どうやらそうでもなかったので、個人的なメモとしてまとめてみます。

# Cosign
・[Sigstore](https://www.sigstore.dev/) プロジェクトの一部。[GitHubページ](https://github.com/sigstore/cosign)
・サポートのページを見ると、Docker Hub、AWS ECR、GCP、Azure、GitHub、Quay (Red Hat)、Harbor と殆どの有名所のコンテナレジストリが[列挙されている](https://github.com/sigstore/cosign#registry-support) 。
・Red Hat のレジストリ・ソフトウェアである [Quay が対応している](https://access.redhat.com/documentation/en-us/red_hat_quay/3.6/html-single/use_red_hat_quay/index#cosign-oci-intro) とある。

### Cosign の Kubernetes 対応
・Red Hat の Kubernetes である OpenShift はこのイメージの検証には対応していない。
・[Connaisseur](https://sse-secure-systems.github.io/connaisseur/v2.5.1/) という Admission Controller が Cosign の検証に対応している。Connaisseur は、後述 Notary にも対応している。
・Connaisseur は、フランス語で 「鑑定家」「目利き」という意味。
・[Gatekeeperを使う方法](https://medium.com/@LachlanEvenson/verifying-container-signatures-on-kubernetes-with-gatekeeper-19a4519c3016)もある。

# Simple Signing (Red Hat)

・[Red Hatが採用している方式](https://www.redhat.com/en/blog/container-image-signing) 
・Simple Singing という呼び方が正しいかは？だが、[cosign のプロジェクトページ](https://github.com/sigstore/cosign#things-that-should-probably-change) で、この方式で使っている JSONファイルを `Simple Signing format` という呼び方をしている。
・GnuPGで鍵のペアを使って秘密鍵でコンテナの digest 等の情報が書いてある JSON のテキストを秘密鍵で暗号化する(署名)。
・署名をホストする Web Server の設置が必要。
・podman、buildah、skopeo 等の Red Hat が提供するコンテナ管理用のコマンドで署名が可能。
・Linux の rpm のパッケージの署名で使われているのと同じ方式。
・OpenShift (Red Hat の Kubernetes)は、コンテナデプロイ時にこの署名を検証するように[設定する事ができる](https://docs.openshift.com/container-platform/4.9/security/container_security/security-container-signature.html) 
・署名検証用の公開鍵はOpenShiftの各ノードに MCO (Machine Config Operator)という OpenShift 独自の Node 構成用の Controller 経由で組み込まれる。

# DCT (Docker Content Trust)
・[Nortary](https://matsuand.github.io/docs.docker.jp.onthefly/engine/security/trust/#signing-images-with-docker-content-trust) をベースに実装と、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に対応している](https://cloud.ibm.com/docs/ContinuousDelivery?topic=ContinuousDelivery-tutorial-cd-kube-image-signing&locale=ja)
・Azure DevOps Services と Azure Container Registry も [DCTに対応している](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/ecosystems/containers/content-trust?view=azure-devops) 

### Nortary 
・Notary は「公証人」という意味。[Git Hub ページ](https://github.com/notaryproject/notary)。
・2017年に CNCF Project として採用
・現在、Notary v2 の仕様策定が進んでいる。
### Notary v2 
・v2ができた背景は、[クリーエーションラインさんのブログ](https://www.creationline.com/lab/aquasecurity/42049)に少し言及がある。
・2022/03/17時点で、[draft1](https://github.com/notaryproject/notaryproject/releases/tag/v1.0.0-draft.1) が最新。[draft2](https://github.com/notaryproject/notaryproject/releases)は、プレ・リリース
### Notary の Kubernetes 対応
・Kubernetes そのものは対応しておらず([参考記事](https://www.cncf.io/blog/2021/07/28/enforcing-image-trust-on-docker-containers-using-notary/))、Admission Webhookを使って検証する仕組みを作る必用がある。
・IBM の [Portieris](https://github.com/IBM/portieris) という Admission Controller 経由で使える。v1を使っておりv2は使ってない。
・`Cosign` の所でてきた [Connaisseur](https://sse-secure-systems.github.io/connaisseur/v2.5.1/) という Admission Controller も存在している。こちらもv1を使用しており v2は `PLANNED` になっている。