【入門編】 コンテナイメージの脆弱性スキャンと署名検証 (Cosign) – 暗号理論・認証基盤 & エンドポイントセキュリティ防御ガイド

こんにちは!日々の開発やインフラの管理、本当にお疲れ様です。

「コンテナ」ってすごく便利ですよね。Dockerを使って、自分のパソコンで動いた環境をそのままクラウドの本番サーバーにポンと持って行ける。まるで、引っ越しのときにダンボール箱に荷物を詰めて、そのまま新居に運ぶような手軽さがあります。

でも、ちょっと待ってください。そのダンボール箱、「どこで誰が詰めたか」本当に自信を持って言えますか?もしかしたら、その箱の中に、悪意ある誰かがこっそり泥棒の道具(脆弱性やマルウェア)を忍ばせていたとしたら……?

今回は、新人のIT担当者や、セキュリティにこれから触れる開発者の方に向けて、現代のソフトウェアイノベーションの要である「コンテナサプライチェーン」を守るための技術、「コンテナイメージの脆弱性スキャンと署名検証(Cosign)」について、身近な防犯の例えを交えながら優しく紐解いていきたいと思います。一歩ずつ、一緒に学んでいきましょう!

—

1. 家の鍵と防犯に例える「コンテナサプライチェーン」の脅威

みなさんは、ネット通販で届いた荷物を開けるとき、ダンボールのテープが不自然に剥がされていなかったり、中身がすり替わっていないか確認しますよね。

ソフトウェアの世界でも同じです。私たちが普段使うコンテナイメージ(Docker Hubなどで公開されているベースイメージなど)は、世界中の色々な人が作った部品を組み合わせてできています。これをソフトウェアサプライチェーン(供給網)と呼びます。

もし、この供給網の途中で、悪意ある攻撃者が人気のあるコンテナイメージのなかにコソッと秘密裏のバックドア(不正なプログラムの抜け道)を仕込んだらどうなるでしょうか?
あなたの会社の大切なシステムが、そのコンテナをデプロイ(本番稼働)した瞬間に乗っ取られてしまうかもしれません。

これを防ぐためには、次の2つのステップが絶対に必要になります。
1. 健康診断(脆弱性スキャン):箱の中に、既知の危険なバグや古い部品が入っていないかを調べる。
2. 身元証明と封印(署名と検証):信頼できる人が作ったものか確認し、途中で中身が改ざんされていないかを証明する。

—

2. 健康診断:Trivyでコンテナの「お医者さん」を体験する

まずは、コンテナの中に「病気(脆弱性)」が隠れていないかをチェックする方法から見ていきましょう。ここで登場するのが、オープンソースの脆弱性スキャナー「Trivy(トリビー)」です。

Trivyは、いわばコンテナイメージ専用の優秀なお医者さんです。イメージの中に含まれているOSのパッケージや言語のライブラリ(PythonのpipやNode.jsのnpmなど)を隅々まで検査し、「おいおい、このライブラリには有名なセキュリティの穴(CVE)があるから早く直しなよ!」と教えてくれます。

Trivyを使ったスキャンの実行例

実際に、手元の端末でコンテナイメージの健康診断をするコマンドを見てみましょう。ターミナルを開いて、次のように実行します。

# 「my-app:latest」というコンテナイメージの脆弱性をスキャンするコマンド
trivy image --severity HIGH,CRITICAL my-app:latest

【コードのポイント解説】

  • trivy image:Trivyにコンテナイメージを診断するように伝えています。
  • --severity HIGH,CRITICAL:数ある脆弱性のなかでも、特に危険度の高い「HIGH(高)」と「CRITICAL(緊急)」のものだけに絞って表示させるフィルターです。日々の開発では、まずここから潰していくのが鉄則です。

もしここで脆弱性が見つかったら、ベースとなるイメージのバージョンを新しくしたり、ライブラリをアップデートして再度ビルドし直す必要があります。

—

3. 身元証明と封印:SigstoreとCosignの出番です

さて、Trivyで健康診断をして「このイメージは安全だ!」と分かりました。でも、それを本番サーバーに運ぶまでの間に、悪意ある第三者がこっそり自分の作った危険なイメージとすり替えたらどうでしょう?

ここで必要になるのが、「署名(Signature)」です。
昔のヨーロッパの王様が、重要なお触れを出すときに自分の指輪(シーリングスタンプ)でロウソクの油に「ピシッ」と紋章を刻んだのを知っていますか? あれと同じです。「これは間違いなく私が作ったもので、途中で誰も開けていませんよ」という証明書をデジタルで作るわけです。

ここで大活躍するのが、「Cosign(コサイン)」というツールです。これは、Sigstore(シグストア)という、証明書を安全に発行する仕組みを使って、コンテナイメージにデジタル署名をするための強力なツールです。

なぜCosignがすごいのか?

従来のデジタル署名は、「秘密鍵」というパスワードのようなものを厳重に管理しなければならず、鍵をなくしたり盗まれたりするリスクが管理者の頭痛の種でした。
しかし、Cosignは現代の認証技術を使い、個人のGoogleやGitHub、Microsoftなどのアカウント(OIDC)を利用して、鍵の管理をクラウドに安全に任せつつ、手軽に署名ができる仕組みを提供してくれています。

—

4. 実践!Cosignでイメージに署名をして、検証してみよう

それでは、実際にCosignを使って「署名」と「検証」を行う一連の流れを見ていきましょう。

① コンテナイメージに署名をする(開発者側の作業)

あなたが開発した安全なコンテナイメージをレジストリ(Docker HubやGitHub Container Registryなど)にプッシュした後、自分の身分を証明して署名を付けます。

# 鍵なし(Keylessモード)でコンテナイメージに署名をするコマンド
# 実行するとブラウザが立ち上がり、GitHubなどのアカウント認証を求められます
cosign sign --yes ghcr.io/your-account/my-app:latest

【コードのポイント解説】

  • cosign sign:指定したコンテナイメージに対してデジタル署名を行います。
  • --yes:対話形式の確認をスキップしてスムーズに署名を進めるためのオプションです。
  • ghcr.io/...:署名対象となるコンテナイメージの住所(タグ付き)です。

このコマンドを実行すると、「このイメージは、間違いなくあなたのGitHubアカウントの持ち主が承認したものです」というデジタル証明書が、イメージと一緒にレジストリに登録されます。

—

② 本番サーバー側でイメージの「封印」を確認する(検証の作業)

次に、本番環境やKubernetesなどのデプロイ基盤側の作業です。
本番サーバーは、コンテナを動かす直前に必ず「このイメージは本当に本物か? 途中で改ざんされていないか?」をCosignを使ってチェック(検証)させます。もし怪しいイメージであれば、デプロイをガチャンと強制終了させます。

# コンテナイメージの署名が正しいか(改ざんされていないか)を検証するコマンド
cosign verify \
  --certificate-identity "https://github.com/your-account/my-app/.github/workflows/build.ymlのパスなど" \
  --certificate-issuer "https://token.actions.githubusercontent.com" \
  ghcr.io/your-account/my-app:latest

【コードのポイント解説】

  • cosign verify:イメージに施されたデジタル署名が本物かどうかを確認します。
  • --certificate-identity:誰が(どのワークフローや人物が)署名したのかという「身元(アイデンティティ)」を厳密に指定します。ここを一致させることで、他人が勝手に作った偽物フェイクイメージを完全に弾くことができます。
  • --certificate-issuer:証明書を発行した信頼できる認証局(今回はGitHub ActionsのOIDCプロバイダ)を指定しています。

もし、途中で誰かがイメージを改ざんしていたり、身元が一致しない場合は、この検証コマンドがエラーを吐いて処理をストップしてくれます。泥棒が侵入する隙を、この厳重な「デジタル錠前」がピシャリと塞いでくれるわけです。

—

5. まとめ:安全なコンテナライフに向けて

いかがでしたでしょうか?
コンテナのサプライチェーンセキュリティと聞くと、なんだか文字数が多くて難しそうに感じたかもしれませんが、やっていることは実にシンプルです。

1. Trivyでお医者さんのように健康診断をして、危ないバグを取り除く。
2. Cosignを使って、誰が作ったものか「デジタル署名」という名の封印をする。
3. 本番環境で、その封印が破られていないか検証してから動かす。

この仕組みを日々の開発パイプライン(CI/CD)に組み込んでおくだけで、外部からのサプライチェーン攻撃に対する防御力は跳ね上がります。

セキュリティは一日にして成らず。まずはローカル環境でTrivyを動かしてみるところから、一歩ずつ進めていきましょう!あなたの手掛けるソフトウェアが、より安全で強固なものになることを心から応援しています。

コメント

タイトルとURLをコピーしました