はじめに
この実験では、docker scout sbom コマンドを使用して Docker イメージのソフトウェアビルオブマテリアル(SBOM: Software Bill of Materials)を生成し、表示する方法を学びます。まず、JSON 形式で基本的な SBOM を生成して表示します。これにより、イメージ内のソフトウェアコンポーネントの詳細なリストが得られます。
基本的な SBOM を生成した後、SBOM 内に見つかったパッケージの、より人間が読みやすいリストを表示する方法を探ります。また、このパッケージリストをタイプでフィルタリングする方法も学び、特定のカテゴリのコンポーネントに焦点を当てることができます。最後に、生成した SBOM をファイルに書き込んで、後で使用または分析する方法を練習します。この実験を通じて、docker scout sbom を活用して Docker イメージの構成を理解するための基本的なスキルを身につけることができます。
JSON 形式で基本的な SBOM を生成し表示する
このステップでは、Docker イメージの基本的なソフトウェアビルオブマテリアル(SBOM: Software Bill of Materials)を生成し、JSON 形式で表示する方法を学びます。SBOM は、ソフトウェアコンポーネントを構成する要素の正式なリストです。ソフトウェアの荷積書のようなもので、使用されているすべてのサードパーティコンポーネント、ライブラリ、依存関係を詳細に記載しています。SBOM を生成することは、ソフトウェアのセキュリティ状態とライセンス遵守を理解するために重要です。
SBOM の生成には syft ツールを使用します。syft は、コンテナイメージやファイルシステムから SBOM を生成するためのコマンドラインツール兼ライブラリです。
まず、このデモンストレーションに使用するシンプルな Docker イメージを取得しましょう。軽量な Linux ディストリビューションである alpine:latest イメージを使用します。
docker pull alpine:latest
イメージが取得され、ダウンロードされていることを示す出力が表示されるはずです。
Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
イメージが用意できたので、SBOM を生成することができます。syft コマンドをイメージ名とともに使用し、出力形式を JSON と指定します。
syft alpine:latest -o json
このコマンドは、alpine:latest イメージを分析し、SBOM を JSON 形式で直接ターミナルに出力します。出力は、イメージ内で見つかったパッケージに関する情報(名前、バージョン、ライセンス、タイプなど)を含む大きな JSON オブジェクトになります。
出力をスクロールして、SBOM にリストされているさまざまなコンポーネントを確認することができます。この基本的な JSON 出力は、イメージ内のソフトウェアコンポーネントの包括的なビューを提供します。
SBOM 内のパッケージリストを表示する
前のステップでは、JSON 形式で詳細な SBOM を生成しました。JSON 出力は包括的ですが、ターミナルで直接読むのは難しい場合があります。このステップでは、Docker イメージ内に見つかったパッケージの、より人間が読みやすいリストを表示する方法を学びます。
syft は、スキャンして理解しやすいシンプルなテーブル形式を提供しています。この形式で SBOM を生成するには、-o table オプションを使用できます。
syft alpine:latest -o table
このコマンドは、alpine:latest イメージを再度分析しますが、今回は SBOM をテーブルとして出力します。テーブルには通常、NAME、VERSION、TYPE、LOCATIONS などの列が含まれます。
以下のような出力が表示されるはずです。
✔ Loaded image
✔ Analyzed image
├── apk
│ ├── busybox
│ ├── alpine-baselayout
│ ├── alpine-keys
│ ├── apk-tools
│ ├── zlib
│ ├── libcrypto1.1
│ ├── libssl1.1
│ ├── musl
│ ├── musl-utils
│ ├── scanelf
│ ├── ssl_certs
│ └── zlib
└── filesystem
└── etc/os-release
このテーブル形式を使用すると、イメージにインストールされているパッケージの名前とバージョンをすぐに確認することがはるかに容易になります。これは、イメージの内容を素早く概観するのに特に役立ちます。
パッケージリストをタイプでフィルタリングする
前のステップでは、SBOM をテーブルとして表示しました。これは JSON 出力よりも読みやすくなっています。しかし、時には特定のタイプのパッケージのみに関心がある場合があります。たとえば、オペレーティングシステムのパッケージやアプリケーションの依存関係のみを表示したい場合があります。
syft では、--package-type オプションを使用して、パッケージリストをタイプでフィルタリングすることができます。出力に含める 1 つまたは複数のパッケージタイプを指定できます。一般的なパッケージタイプには、apk、deb、rpm、gem、npm、pip、go-module などがあります。alpine:latest イメージの主なパッケージタイプは apk です。
SBOM をフィルタリングして、apk タイプのパッケージのみを表示してみましょう。
syft alpine:latest -o table --package-type apk
このコマンドは、SBOM をテーブル形式で生成しますが、パッケージタイプが apk のエントリのみを含めます。
前のステップのテーブルと同様の出力が表示されるはずですが、イメージに他のパッケージタイプが存在する場合は、エントリが少なくなる可能性があります(ただし、alpine のような最小限のイメージでは、apk が主なタイプです)。
✔ Loaded image
✔ Analyzed image
├── apk
│ ├── busybox
│ ├── alpine-baselayout
│ ├── alpine-keys
│ ├── apk-tools
│ ├── zlib
│ ├── libcrypto1.1
│ ├── libssl1.1
│ ├── musl
│ ├── musl-utils
│ ├── scanelf
│ ├── ssl_certs
│ └── zlib
このフィルタリング機能は、コンテナイメージ内の特定のレイヤーや依存関係のタイプに焦点を当てる必要がある場合に非常に便利です。
SBOM をファイルに書き込む
前のステップでは、SBOM を様々な形式でターミナルに直接表示しました。これはすぐに確認するのに便利ですが、SBOM をさらに処理、分析、または共有するために、ファイルに保存する必要があることが多いです。
syft では、-o オプションに続けて希望する形式を指定し、ファイルへのリダイレクトを行うことで、SBOM 出力をファイルに書き込むことができます。SBOM を JSON、SPDX、CycloneDX などの様々な形式で出力することができます。JSON は一般的で汎用性の高い形式です。
JSON 形式で SBOM を生成し、現在のディレクトリ (~/project) に alpine_sbom.json という名前のファイルに保存してみましょう。
syft alpine:latest -o json > alpine_sbom.json
このコマンドは、alpine:latest イメージの SBOM を JSON 形式で生成し、出力を alpine_sbom.json ファイルにリダイレクトします。今回はターミナルに JSON 出力は表示されません。
ファイルが作成され、SBOM データが含まれていることを確認するには、ls コマンドで現在のディレクトリ内のファイルを一覧表示し、cat コマンドでファイルの内容を表示することができます。
ls
ファイルの一覧に alpine_sbom.json が表示されるはずです。
alpine_sbom.json
では、ファイルの内容を表示してみましょう。
cat alpine_sbom.json
最初のステップで見た JSON 形式の SBOM 出力が表示されるはずですが、今回は alpine_sbom.json ファイルに保存されています。
SBOM をファイルに保存することは、SBOM 生成を CI/CD パイプラインに統合する場合や、他の人と SBOM を共有する場合の標準的な方法です。
まとめ
この実験では、syft ツールを使用して Docker イメージの基本的なソフトウェアビルオブマテリアルズ (SBOM) を生成し、表示する方法を学びました。まず、alpine:latest イメージを取得し、syft alpine:latest -o json コマンドを使用して、JSON 形式で SBOM を生成し表示しました。これにより、イメージ内のソフトウェアコンポーネントの詳細なリストが得られます。
次に、SBOM からより人間が読みやすいパッケージリストを表示する方法、パッケージタイプでこのリストをフィルタリングする方法を調べ、最後に生成した SBOM を後で使用または分析するためにファイルに書き込む方法を学びました。これらの手順は、Docker イメージの構成を理解するための syft の基本的な機能を示しています。



