導入
現代のソフトウェア開発において、CI/CDパイプラインから出力された成果物が「誰によって、いつ、どのように作られたか」を証明することは、セキュリティの最優先事項です。もし悪意のある第三者がコンテナレジストリへ不正なイメージを混入させた場合、検証なしにデプロイしてしまうと深刻な被害につながります。本記事では、Sigstore/Cosignを活用してコンテナイメージに署名を付与し、サプライチェーンの安全性を高める方法を解説します。
基礎知識
Sigstoreは、ソフトウェアの署名を標準化するためのオープンソースプロジェクトです。その中でもCosignは、コンテナイメージへの署名、検証、および証明書の格納を簡素化するツールです。従来の公開鍵暗号方式では鍵管理が大きな負担でしたが、Cosignはクラウドネイティブな環境に最適化されており、鍵管理の手間を大幅に削減できます。また、デプロイ先(Kubernetesなど)でKyvernoなどのポリシーエンジンと組み合わせることで、「署名のないイメージは実行させない」といった制御を自動化できます。
実装/解決策
署名のプロセスは以下の3ステップで行います。
1. 署名用鍵ペアの生成(またはキーレス署名の利用)。
2. CI/CD上でイメージに対して署名を付与(Cosign sign)。
3. デプロイ先のクラスタで、イメージの署名を検証(Cosign verify または Admission Controllerの利用)。
サンプルプログラム
以下は、Cosignを使用してコンテナイメージに署名を付与し、その検証を行うためのコマンド例です。
cosign generate-key-pair
cosign sign –key cosign.key my-registry.com/my-image:latest
cosign verify –key cosign.pub my-registry.com/my-image:latest
応用・注意点
現場で運用する際は、以下の点に注意してください。
1. 鍵管理の重要性
秘密鍵(cosign.key)が流出すると、攻撃者が正規の署名を偽造できてしまいます。可能であれば、KMS(AWS KMSやGoogle Cloud KMSなど)と連携して鍵を管理することを強く推奨します。
2. キーレス署名の検討
Sigstoreの「キーレス署名」機能を利用すると、OIDC(OpenID Connect)を使って一時的な鍵で署名できます。これにより、鍵の管理コストをゼロにできるため、モダンなCI/CD環境ではこちらが推奨されるケースが増えています。
3. 検証の自動化
手動での検証には限界があります。Kubernetes環境であれば、Kyvernoを導入し、「署名がないイメージはPodの生成を拒否する」というポリシーを定義することで、運用を自動化し、サプライチェーン攻撃を根本から防ぐことが可能です。

コメント