コンテナイメージの digest を調べる方法
CI / CDパイプラインなどでDockerコンテナを利用する際、より安全なバージョン指定方法としてdigestの指定があります。今回はDockerコンテナのDigestをCLIで調べる方法をまとめました。 なぜdige […]
目次
CI / CDパイプラインなどでDockerコンテナを利用する際、より安全なバージョン指定方法としてdigestの指定があります。今回はDockerコンテナのDigestをCLIで調べる方法をまとめました。
なぜdigestを使うのか?
2026年3月に発生した Trivy のサプライチェーン攻撃では、v0.69.4 という正規バージョンに見せかけた悪意あるイメージが Docker Hub に公開されました。CI/CD パイプラインがそのタグを参照していた組織では、認証情報が窃取される被害が相次いでいます。
攻撃が成立した背景には、タグがミュータブル(書き換え可能)であるという Docker の仕様があります。タグは特定のイメージへのポインタに過ぎず、プッシュ権限さえあれば同じタグ名で別のイメージに上書きすることができます。そのため、仮にaquasec/trivy:0.69.3 と書いても、それが指す先は変わる可能性があります。
digest はこの問題を解決してくれます。イメージ内容の SHA-256 ハッシュそのものであるため、内容が 1 バイトでも変われば値が変わるからです。よって仮にタグが差し替えられても、digest を指定していれば別のイメージを引いてしまうことはありません。
digest の調べ方
docker buildx imagetools inspect を使います。ローカルにイメージを pull せず、レジストリに直接問い合わせるため、pull のコストなしに digest を取得することができます。
docker buildx imagetools inspect aquasec/trivy:0.69.3
出力例:
Name: docker.io/aquasec/trivy:0.69.3
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest: sha256:bcc376de8d77cfe086a917230e818dc9f8528e3c852f7b1aff648949b6258d1c
Manifests:
Name: docker.io/aquasec/trivy:0.69.3@sha256:7228e304ae0f610a1fad...
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/amd64
Name: docker.io/aquasec/trivy:0.69.3@sha256:532de2ce287f594fbfbd...
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/arm64
Digest: 行の値(sha256:bcc376de...)がマルチアーキテクチャ対応のイメージ全体を指す manifest list digest です。Manifests: 以下の各エントリは、amd64・arm64 それぞれのプラットフォーム digest で、別の値になっています。
manifest list digest とプラットフォーム digest の使い分け
manifest list digest を指定すると、実行環境のアーキテクチャに応じて適切なイメージが自動選択されます。プラットフォーム digest を指定すると、特定のアーキテクチャのイメージに固定されます。
CI 環境が Linux/amd64 に固定されているとわかっている場合はプラットフォーム digest を使っても問題ありません。しかしそうでない場合には、 manifest list digest を使う方が安全です。
もしdigest のみを抽出したい場合は --format オプションで絞り込めます。
docker buildx imagetools inspect aquasec/trivy:0.69.3 \
--format '{{json .Manifest}}' | jq -r '.digest'
# sha256:bcc376de8d77cfe086a917230e818dc9f8528e3c852f7b1aff648949b6258d1c
CircleCI の config.yml への適用例
取得した digest をタグの代わりに指定しましょう。image: は イメージ名@digest の形式で記述できます。
jobs:
sbom-and-scan:
docker:
# タグは mutable なため digest でピン留めする
# タグ: 0.69.3 — 更新時: docker buildx imagetools inspect aquasec/trivy:0.69.3
- image: aquasec/trivy@sha256:bcc376de8d77cfe086a917230e818dc9f8528e3c852f7b1aff648949b6258d1c
コメントに対応するタグ名を残しておくと、次回更新する際に inspect コマンドを再実行する手間を減らせます。
注意点
digest のピン留めは「このバイト列を使う」という保証であり、「このバイト列が安全である」という保証ではありません。攻撃者が悪意あるイメージを push した後に取得した digest をピン留めしても意味がない点には注意が必要です。
そのため、digest を取得するタイミングと、そのイメージの信頼性の確認は切り離して考える必要がある点は忘れないようにしましょう。