docker scout compare コマンドを使ってイメージの違いを分析する方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、2 つの Docker イメージ間の違いを分析するために docker scout compare コマンドを効果的に使用する方法を学びます。このプロセスは、異なるバージョンやビルド間での脆弱性、パッケージ、その他のイメージコンポーネントの変更を理解するために重要です。

実践的な演習を通じて、デフォルト設定でのイメージの比較、ベースイメージの脆弱性の無視、深刻度とパッケージタイプによる結果のフィルタリング、および比較結果の Markdown レポートの生成を探索します。この実験の終了時には、コンテナイメージのセキュリティと構成に関する貴重な洞察を得るために docker scout compare を使いこなせるようになります。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/ls -.-> lab-555200{{"docker scout compare コマンドを使ってイメージの違いを分析する方法"}} docker/pull -.-> lab-555200{{"docker scout compare コマンドを使ってイメージの違いを分析する方法"}} docker/images -.-> lab-555200{{"docker scout compare コマンドを使ってイメージの違いを分析する方法"}} docker/build -.-> lab-555200{{"docker scout compare コマンドを使ってイメージの違いを分析する方法"}} end

デフォルト設定で 2 つのイメージを比較する

このステップでは、脆弱性スキャンツールを使用して 2 つの Docker イメージを比較する方法を学びます。イメージを比較することは、セキュリティリスクを特定し、コンテナイメージの異なるバージョンやビルド間の違いを理解するために重要です。この目的のために、trivy というツールを使用します。trivy は、コンテナやその他のアーティファクトに対するシンプルで包括的な脆弱性スキャナーです。

まず、trivy をインストールしましょう。LabEx 環境には trivy が事前にインストールされていないため、ダウンロードしてインストールする必要があります。

sudo apt-get update
sudo apt-get install -y wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) stable main" | sudo tee /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install -y trivy

上記のコマンドは、まずパッケージリストを更新し、次に新しいリポジトリを追加するために必要な依存関係をインストールします。その後、trivy リポジトリの公開鍵をダウンロードし、システムの信頼済みキーに追加します。最後に、trivy リポジトリをソースリストに追加し、再度パッケージリストを更新して trivy をインストールします。

trivy がインストールされたので、比較したい Docker イメージを取得しましょう。ubuntu イメージの 2 つの異なるバージョン ubuntu:20.04ubuntu:22.04 を比較します。

docker pull ubuntu:20.04
docker pull ubuntu:22.04

これらのコマンドは、指定された ubuntu イメージのバージョンを Docker Hub から取得します。ダウンロードの進捗状況とイメージの正常な取得を示す出力が表示されるはずです。

これで、trivy を使用してこれら 2 つのイメージを比較できます。2 つのイメージを比較する基本的なコマンドは trivy image --diff-image [image1] [image2] です。

trivy image --diff-image ubuntu:20.04 ubuntu:22.04

このコマンドは、ubuntu:20.04ubuntu:22.04 の両方を分析し、2 つのイメージ間で見つかった脆弱性の違いを報告します。出力には、一方のイメージにのみ存在する脆弱性や、深刻度が異なる脆弱性が表示されます。これにより、イメージのバージョンをアップグレードまたは変更することがセキュリティ態勢にどのような影響を与えるかを理解することができます。

出力には、深刻度(UNKNOWN、LOW、MEDIUM、HIGH、CRITICAL)で分類された脆弱性がリストされます。最初のイメージ(この場合は ubuntu:20.04)と比較して、2 番目のイメージ(ubuntu:22.04)に追加された脆弱性と削除された脆弱性が表示されます。

イメージを比較し、ベースイメージの脆弱性を無視する

前のステップでは、2 つの ubuntu イメージを比較し、脆弱性の違いを確認しました。イメージを比較する際、ベースイメージから引き継がれた脆弱性ではなく、アプリケーションコードや依存関係によって導入された脆弱性に関心がある場合があります。trivy を使用すると、指定したベースイメージに存在する脆弱性を無視することができます。

これを実証するために、まず ubuntu:20.04 をベースイメージとして使用し、単純なファイルを追加する簡単な Dockerfile を作成しましょう。

プロジェクトディレクトリに移動します。

cd ~/project

nano を使用して Dockerfile という名前のファイルを作成します。

nano Dockerfile

以下の内容を Dockerfile に貼り付けます。

FROM ubuntu:20.04
RUN echo "This is a test file" >/app/test.txt

ファイルを保存し、nano を終了します(Ctrl+X、Y、Enter)。

この Dockerfile は非常にシンプルです。ubuntu:20.04 イメージから始めて、/app ディレクトリ内に test.txt という名前のファイルを作成するコマンドを実行します。

ここで、この Dockerfile から Docker イメージをビルドしましょう。my-ubuntu-app:latest というタグを付けます。

docker build -t my-ubuntu-app:latest .

docker build コマンドは、Dockerfile からイメージをビルドします。-t my-ubuntu-app:latest フラグは、イメージに my-ubuntu-app という名前と latest というタグを付けます。最後の . は、Dockerfile が現在のディレクトリにあることを指定します。ビルドプロセスとイメージの正常な作成を示す出力が表示されるはずです。

これで、2 つのイメージができました。ubuntu:20.04(ベースイメージ)と my-ubuntu-app:latest(ベースイメージの上に構築されたイメージ)です。my-ubuntu-app:latestubuntu:20.04 を比較し、ubuntu:20.04 にすでに存在する脆弱性を無視することができます。これにより、Dockerfile の変更によって導入された脆弱性のみが表示されます。

これを実現するために、trivy image コマンドに --ignore-base フラグを使用します。

trivy image --ignore-base --diff-image ubuntu:20.04 my-ubuntu-app:latest

このコマンドは、my-ubuntu-app:latestubuntu:20.04 を比較しますが、my-ubuntu-app:latest に存在し、ubuntu:20.04 には存在しない脆弱性のみを報告します。この Dockerfile では単純なファイルを追加しただけで、新しいパッケージをインストールしていないため、前のステップの出力と比較して、報告される新しい脆弱性はほとんどないか、まったくないはずです。これは、--ignore-base がアプリケーションレイヤーのセキュリティへの影響に焦点を当てるのにどのように役立つかを示しています。

イメージを比較し、深刻度とパッケージタイプでフィルタリングする

前のステップでは、基本的なイメージ比較を行いました。ただし、出力は時に非常に詳細になることがあります。特に、多数の脆弱性を持つイメージの場合です。trivy を使用すると、深刻度レベルとパッケージタイプに基づいて結果をフィルタリングできます。これにより、最も重要な問題や特定のタイプの脆弱性に焦点を当てることができます。

再度 ubuntu:20.04ubuntu:22.04 を比較しましょう。ただし、今回は結果をフィルタリングして、深刻度が HIGH または CRITICAL の脆弱性のみを表示します。これは、最も深刻な脆弱性の修正を優先したい場合に便利です。

報告する最低深刻度レベルを指定するには、--severity フラグを使用します。深刻度レベルをカンマ区切りで指定できます。

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --severity HIGH,CRITICAL

このコマンドは、2 つの ubuntu イメージを比較し、どちらかのイメージで HIGH または CRITICAL と分類された脆弱性のみを表示します。出力がデフォルトの比較よりも大幅に短くなることに気付くでしょう。これは、深刻度が低い脆弱性(UNKNOWN、LOW、MEDIUM)が除外されているためです。

深刻度でフィルタリングするだけでなく、脆弱性が見つかったパッケージのタイプでもフィルタリングできます。trivy は、オペレーティングシステムのパッケージ(aptyum などを介してインストールされたもの)とアプリケーションの依存関係(コードで使用されるライブラリなど)の脆弱性をスキャンできます。

再度イメージを比較しましょう。今回は、オペレーティングシステムのパッケージにある脆弱性のみを探します。これには --vuln-type フラグを使用します。

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --vuln-type os

このコマンドは、2 つのイメージを比較し、オペレーティングシステムのパッケージで見つかった脆弱性のみを報告します。これは、主にイメージのベースオペレーティングシステムレイヤーのセキュリティに関心がある場合に役立ちます。

これらのフィルターを組み合わせることもできます。たとえば、オペレーティングシステムのパッケージにある HIGH または CRITICAL の脆弱性のみを表示するには、次のようにします。

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --severity HIGH,CRITICAL --vuln-type os

このコマンドは、イメージのオペレーティングシステムレイヤー内の最も深刻な脆弱性に焦点を当てた表示を提供します。フィルタリングにより、出力を管理し、セキュリティ対策を効果的に優先順位付けすることができます。

イメージを比較し、Markdown レポートを生成する

前のステップでは、脆弱性の比較結果をターミナルで直接表示しました。これは迅速なチェックには便利ですが、報告、ドキュメント化、またはさらなる分析のために、結果を構造化された形式で保存する必要があることが多いです。trivy は、Markdown を含むさまざまな出力形式をサポートしています。

Markdown レポートを生成することは便利です。なぜなら、Markdown は読みやすい軽量マークアップ言語であり、HTML や PDF などの他の形式に簡単に変換できるからです。

イメージ比較の Markdown レポートを生成するには、--format フラグを使用して markdown を指定します。また、> 演算子を使用して出力をファイルにリダイレクトします。

再度 ubuntu:20.04ubuntu:22.04 を比較し、出力を ~/project ディレクトリ内の comparison_report.md という名前の Markdown ファイルに保存しましょう。

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --format markdown > ~/project/comparison_report.md

このコマンドは、最初のステップと同じ比較を行いますが、出力を Markdown 形式にして指定されたファイルに保存します。今回はターミナルに直接出力は表示されません。

コマンドが完了したら、cat または nano を使用して生成された Markdown ファイルを表示できます。

cat ~/project/comparison_report.md

このコマンドは、comparison_report.md ファイルの内容をターミナルに表示します。見出し、リスト、テーブルなど、Markdown 構文を使用して形式が整えられた脆弱性比較結果が表示されるはずです。

また、nano でファイルを開き、テキストエディタで表示することもできます。

nano ~/project/comparison_report_markdown.md

ファイルを表示した後は、nano を終了することを忘れないでください(Ctrl+X)。

Markdown などのさまざまな形式でレポートを生成することで、脆弱性情報を他の人と簡単に共有したり、既存のレポート作成ワークフローに組み込んだりすることができます。これは、セキュリティスキャンを開発およびデプロイパイプラインに組み込む上で重要なステップです。

まとめ

この実験では、trivy ツールを使用して 2 つの Docker イメージを比較する方法を学びました。まず、LabEx 環境に trivy をインストールしました。これには、trivy リポジトリを追加し、apt を使用してパッケージをインストールする作業が含まれていました。インストール後、Docker Hub から ubuntu イメージの 2 つの異なるバージョン、ubuntu:20.04ubuntu:22.04 を取得しました。最後に、基本的な trivy image --diff-image コマンドを実行して、これら 2 つのイメージを比較し、それらの脆弱性とパッケージの違いを分析しました。