コンテナの「中身」は本当に信じられますか?――サプライチェーン攻撃から身を守る「デジタル署名」の仕組み
こんにちは!現場の最前線でセキュリティと向き合っているエンジニアです。
皆さんは、普段開発で使っている「コンテナイメージ」を、どれくらい信頼していますか?「公式のレジストリから落としてきたから大丈夫」「有名なライブラリを使っているから安心」……そう思っているとしたら、少しだけ注意が必要です。
今回は、現代のIT現場で最も恐れられている脅威の一つ、「サプライチェーン攻撃」を防ぐための切り札、「コンテナイメージの署名と検証」について、身近な例えを交えながら一歩ずつ学んでいきましょう。
—
1. なぜ「コンテナの封印」が必要なのか?
想像してみてください。あなたは宅配便で大切な荷物を送ろうとしています。箱にガムテープを貼って「中身は絶対に開けていません」と証明したいですよね。
もし、配送の途中で悪い人が箱を開け、中身を「偽物の怪しい製品」に入れ替えて、もう一度ガムテープを貼って届けたらどうでしょう?受け取った人は、その製品が「公式のもの」だと信じて使い始めてしまいます。
コンテナの世界でも同じことが起きます。攻撃者はレジストリ(コンテナを保管する倉庫)に忍び込み、あなたが信頼しているイメージを「悪意あるコードが仕込まれた偽物」とすり替えることがあります。これがサプライチェーン攻撃です。
これを防ぐのが「デジタル署名」です。箱に特殊な「改ざん防止シール」を貼り、受け取る時に「シールが剥がれていないか(=中身が本物か)」を確認する仕組みを作ればいいのです。
—
2. Cosignでイメージに「デジタル署名」を付与しよう
現在、最も広く使われているツールの一つが 「Cosign」 です。これを使うと、誰でも簡単にイメージに署名を付与できます。
まずは、あなたのイメージに秘密の鍵で「これは私が作った本物です!」という署名スタンプを押してみましょう。
# Cosignを使ってイメージに秘密鍵で署名するコマンド
# この操作により、イメージのハッシュ値に対してデジタル署名が付与されます
cosign sign --key cosign.key my-registry.com/my-app:v1.0
cosign.key: あなただけが持つ秘密の鍵です。絶対に誰にも見せないでくださいね。my-registry.com/my-app:v1.0: 署名対象のイメージです。
これで、イメージの横に「署名という名の保証書」が添えられました。
—
3. 「受け取り時」の検証を忘れないで!
署名をするだけでは不十分です。大切なのは、「サーバーにデプロイする瞬間に、その署名が正しいかを確認すること」です。
もし署名がなかったり、偽物の鍵で署名されていたりしたら、コンテナを起動させないように設定します。これを「検証(Verification)」と呼びます。
# 署名が正しいか検証するコマンド
# 署名が一致しない場合、このコマンドはエラーを返します
cosign verify --key cosign.pub my-registry.com/my-app:v1.0
cosign.pub: 公開鍵です。誰でも持っていてOKな「証明書」のようなものです。
この検証コマンドを、デプロイの自動化パイプライン(CI/CD)の中に組み込むのが、今の現場では「常識」になりつつあります。
—
4. 現場で意識すべき「泥臭い」ポイント
教科書通りにはいかないのが現場の面白いところです。運用を始める際に、以下のポイントを心に留めておいてください。
1. 鍵の管理が命です: 秘密鍵(cosign.key)を紛失すると、二度と署名ができなくなります。逆に盗まれると、攻撃者が自由に署名できるようになってしまいます。クラウドの鍵管理サービス(KMS)などを活用し、決して手元のデスクトップに放置しないでくださいね。
2. 「とりあえず動く」を許さない: 開発環境では署名なしでも動くようにしておき、本番環境のデプロイ時だけ「署名がないイメージは起動を拒否する」というポリシー(Admission Controllerの設定など)を徹底しましょう。
3. 全自動化が鍵: 人間が手動で検証するのはミスのもとです。Kubernetesを使っているなら、Kyverno や Policy Controller といったツールを使い、「署名のないイメージはデプロイできない」というルールを強制的に適用させるのがプロのやり方です。
—
まとめ:セキュリティは「疑う」ことから始まる
デジタル署名は、決して魔法の盾ではありません。しかし、「誰が作ったか分からないもの」を自動的に拒絶する仕組みは、今のネットワーク社会において「玄関に鍵をかける」のと同じくらい当たり前のマナーです。
「難しそうだな」と感じたら、まずは身近な小さなプロジェクトで cosign を使ってみてください。自分で署名し、自分で検証する体験を積むことで、セキュリティの重要性がより深く理解できるようになるはずです。
一歩ずつ、着実に。一緒に安全なシステムを作り上げていきましょう!
コメント