コンテナを起動せずに Docker イメージのコンテンツを検査する方法

Docker イメージは、任意のバイナリとライブラリを単一のデータ BLOB にバンドルできます。画像の実際の内容を検査することは、画像の適合性を評価し、セキュリティ上の危険を特定するのに役立ちます。
画像のコンテンツを探索する最も簡単な方法は、コンテナを起動し、シェル セッションを取得し、次に ls
や cd
などの通常のターミナル コマンドを使用してそのディレクトリ構造を内部から表示することです。ただし、これはセキュリティ クリティカルな環境では理想的ではありません。不明なイメージを使用してコンテナーを作成すると、悪意のあるエントリポイント スクリプトにさらされる可能性があります。
コンテナを起動せずにイメージのファイルを検査するために使用できるテクニックを次に示します。
コンテナを起動せずに作成する
docker create
は、あまり知られていない docker run
に相当します。指定されたイメージの上に新しいコンテナを起動せずに作成します。後で docker start
コマンドを使用して起動できます。
新しいコンテナーを作成することは、実行されるまで不活性なままであるため、危険ではありません。これは、使用しない VM の構成設定を定義することに大まかに例えることができます。たとえ汚染されたオペレーティング システム ISO から起動するように設定されていたとしても、環境に損害を与えることはありません。
docker create --name suspect-container suspect-image:latest
上記のコマンドは、suspect-image:latest
イメージに基づく suspect-container
という新しいコンテナを作成します。
コンテナのファイルシステムのエクスポート
これで、有効ではあるが停止したコンテナーが完成したので、docker export
コマンドを使用してそのファイルシステムをエクスポートできます。コンテナーは一度も起動されていないため、エクスポートがイメージのレイヤーによって定義されたファイルシステムを正確に表現していることを確認できます。
docker export suspect-container > suspect-container.tar
最終的に、イメージ内のすべてが含まれる tar アーカイブが作業ディレクトリに作成されます。お気に入りのソフトウェアを使用してこのアーカイブを開くか抽出し、画像のディレクトリを参照し、ファイルのリストと表示を行います。
アーカイブを保存したり開いたりする必要がなく、代わりにターミナルでファイル リストを取得したい場合は、tar
コマンドを変更します。
docker export suspect-container | tar t > suspect-container-files.txt
tar t
は、入力アーカイブの内容をリストします。最終的に、イメージ内のすべてのリストが suspect-container-files.txt
内に作成されます。
「docker image save」を使う
この手法のバリエーションとして、docker image save
を使用する方法があります。このコマンドは、イメージのデータを tar アーカイブに直接保存します。
docker image save suspect-image:latest > suspect-image.tar
この方法では、画像から作成されたコンテナではなく、画像に焦点を当てたアーカイブが作成されます。 tar には、画像のレイヤーを記述する manifest.json
ファイルと、すべての個々のレイヤーのコンテンツを含むディレクトリのセットが含まれます。
これは、イメージの構築における各レイヤーの役割を評価するときに役立ちます。ただし、停止したコンテナを作成してエクスポートする方が、イメージの最終ファイル システムを参照するためのよりアクセスしやすい方法です。
「docker image History」を使用したレイヤーのリスト表示
イメージのコンテンツを検査するもう 1 つの方法は、docker imagehistory
コマンドを使用してレイヤー リストを表示することです。
docker image history suspect-image:latest
これにより、イメージのレイヤーを構成した Dockerfile 命令が公開されます。イメージのファイルシステム内の個々のファイルやディレクトリを表示することはできませんが、疑わしい動作を強調表示するのにより効果的です。
コマンドの出力の各行は、画像内の新しいレイヤーを表します。 「CREATED BY」列には、レイヤーを作成した Dockerfile 命令が表示されます。

レイヤー リストをスキャンすると、悪意のあるイメージの使用を示す可能性のある不審なアクションを迅速に特定できます。 RUN
命令内の不明なバイナリ、予期しない環境変数の変更、および疑わしい CMD
ステートメントと ENTRYPOINT
ステートメントを探します。
後の 2 つのレイヤーは、おそらく、画像の履歴を検査するときに評価する最も重要です。これらは、コンテナーを docker run
または docker start
したときに何が起動されるかを正確に示します。いずれかの命令が疑わしい、または見慣れないものであると思われる場合は、上記の手法を使用して、参照されているバイナリまたはスクリプトを完全に検査することを検討してください。
イメージのファイルシステムにアクセスすると、その内容が非常に詳細に表示されるため、手動で検査した後でも、悪意のあるコンテンツは簡単に気付かれない可能性があります。 docker image History
によって公開されるレイヤー リストは、偽装されたファイル システム アイテムを見つけるのには役立ちませんが、スパイウェアのこっそりダウンロードや環境変数のオーバーライドなど、明らかに悪意のある操作を表面化する場合にはより効果的です。
サードパーティツール
画像の内容を一覧表示するのに役立つサードパーティのオープンソース ツールも利用できます。これらは通常、フィルタリング機能を提供するため、インストールされているオペレーティング システム パッケージ、プログラミング言語の依存関係、および通常のファイルをすばやく列挙できます。
画像検査は、Anchore コンテナー スキャン エンジンに組み込まれています。 Anchore をインストールした後、anchore-cli image content my-image:latest
を実行することで使用できます。これにより、ターゲット イメージのファイル システムの内容の完全なリストが提供されます。

もう 1 つのオプションは、画像コンテンツを視覚化するために特別に構築されたツールである Dive です。レイヤーベースのアプローチを使用し、新しいレイヤーごとに行われたファイルシステムの変更を強調表示します。ツリーベースの対話型ターミナル ビューを使用してファイル システムを参照します。
結論
通常、Docker イメージは使用時点では不透明です。一般的なレジストリでは、API やユーザー インターフェイスにファイルのリストが提供されていません。この機能は Docker CLI にも統合されていません。多くの開発者はイメージをそのまま使用していますが、リスクの高い環境では監査されていないイメージは耐えられない場合があります。
疑わしい画像をアーカイブにエクスポートし、そのコンテンツを参照することで、その画像を検査できます。これにより、イメージが不活性に保たれ、悪意のあるコンテンツが実行されるのを防ぐと同時に、イメージがコンテナー内に作成するファイルシステムの完全なビューが提供されます。
手動によるコンテンツ探索と自動画像スキャンを組み合わせることで、セキュリティ体制をさらに強化できます。これらは既知の脆弱性を検出するプロセスを加速しますが、隠された場所に置かれた新しい悪意のあるファイルを検出するには効果的ではない可能性があります。複数の手法を使用すると、対象範囲を広げ、可能な限り広範囲の疑わしいファイルのセットを捕捉できます。