「docker sbom」を使ってDockerイメージのパッケージをインデックスする方法
ソフトウェア供給チェーンのセキュリティは、高プロファイルの依存に基づく攻撃を受けて話題になっています。ソフトウェアアーティファクトのSBOMを作成することで、弱点を特定し、依存するパッケージの数を減らすことができます。
新しいDocker機能は、SBOM生成のサポートを統合します。
dockerCLI。これにより、ビルドに伴ってSBOMを生成し、それをイメージの消費者に配布することができます。
「docker sbom」コマンド
新しい docker sbom コマンドは、Docker Desktop バージョン 4.7.0 以降にバンドルされています。このコマンドを Linux 上の Docker Engine インストールに追加するには、次のようにインストールしてください。
docker-sbom
GitHubからのプラグイン:
curl -sSfL https://raw.githubusercontent.com/docker/sbom-cli-plugin/main/install.sh | sh -s --インストールが成功したか確認するには、次のコマンドを実行してください:
docker sbom
Usage: docker sbom [OPTIONS] COMMAND
View the packaged-based Software Bill Of Materials (SBOM) for an image.
...
今、Dockerイメージのタグをコマンドに渡すことでSBOMを生成できるようになりました:
docker sbom nginx:latest
Syft v0.43.0
✔ Pulled image
✔ Loaded image
✔ Parsed image
✔ Cataloged packages [143 packages]
NAME VERSION TYPE
adduser 3.118 deb
apt 2.2.4 deb
base-files 11.1+deb11u3 deb
base-passwd 3.5.51 deb
bash 5.1-2+b3 deb
bsdutils 1:2.36.1-8+deb11u1 deb
...
CLIは、指定されたイメージがシステムに存在しない場合、それを取得します。イメージの内容はインデックス化され、パッケージリストがターミナルに表示されます。
Dockerは内部で、人気のあるSyft SBOMジェネレーターを使用してイメージをスキャンおよびインデックス化します。コマンドを使用するたびにアクティブなSyftのバージョンが表示されます。その出力は、スタンドアロンのSyftインストールで生成されるものと一致します。
Syft は、オペレーティングシステムパッケージやプログラミング言語の依存関係を特定することができます。検出された各パッケージのタイプは、その名前と正確なバージョンの横にコマンドの出力に表示されます。この情報を使用して、コンテナイメージを正確に監査し、それらが依存しているソフトウェアを発見することができます。重大な脆弱性が報告された場合、イメージの SBOM を参照して、影響を受けているかどうかを迅速に確認できます。
出力のカスタマイズ
出力はデフォルトで人間が読みやすい表として表示されます。これは、画像と一緒に配布したり、ドキュメントの一部として使用したりするのに最適です。
Syftのバージョンと進行報告を含む行を取り除くには、--quietフラグを追加することができます。--outputを使用してレポートをターミナルウィンドウではなくファイルに書き込むことができます。これら二つのオプションを組み合わせることで、パッケージリストデータを簡単に保存できます。
docker sbom --output sbom.txt --quiet nginx:latestいくつかの代替出力形式は、--format フラグを介して利用可能です。text バリアントは、行ベースのレイアウトを使用した別の人間が読めるオプションです。
docker sbom --format text --quiet nginx:latest
Layer: 0
Digest: sha256:9c1b6dd6c1e6be9fdd2b1987783824670d3b0dd7ae8ad6f57dc3cea5739ac71e
Size: 80400891
MediaType: application/vnd.docker.image.rootfs.diff.tar.gzip
...
Version: 3.118
Type: deb
Found by: dpkgdb-cataloger
Version: 2.2.4
Type: deb
Found by: dpkgdb-cataloger
この[Image]セクションは、スキャンされた画像内のすべてのレイヤーの詳細を列挙します。次のセクションでは、検出されたパッケージをリストし、ネストされたプロパティとしてそのタイプとバージョンを提供します。
他にもいくつかのフォーマットがサポートされており、それぞれは--formatフラグを使って有効化できます。これらは、サードパーティツールを使ってプログラム的にSBOMデータを使用したい場合により良い選択肢です。
syft-json- SyftのネイティブJSON形式でレポートを出力します。cyclonedx-xml/cyclonedx-json- CycloneDX標準に準拠したレポートをXMLまたはJSON形式で作成します。このSBOM標準はOWASPによって推進されています。github-0-json- GitHub互換のレポート形式です。spdx-tag-value/spdx-json- Linux Foundation によって定義された SBOM を表現するための SPDX 標準と互換性があります。
スキャンは通常、画像のファイルシステム内のすべてを確認します。時々、特定のディレクトリを除外して、出力に特定のパッケージが表示されないようにしたい場合があります。--excludeフラグにグロブ式を渡して、特定のパスをフィルタリングすることができます。これを使用して、画像のオペレーティングシステム層に属するパッケージではなく、アプリケーションに関連するパッケージのみをインデックスすることができます。
docker sbom --exclude /var nginx:latest時折、現在のプラットフォームとは異なるアーキテクチャのために構築されたイメージをスキャンする必要があるかもしれません。--platformフラグを使用して、linuxやarm64などの異なるマルチアーキバリアントを選択してください:
docker sbom --platform arm64 nginx:latestこれにより、物理的なハードウェアデバイスを切り替えることなく、他のプラットフォームのために作成した画像をインデックスすることができます。
ユースケース
より多くの開発者がSBOMの利点を認識し始めています。SBOMは過剰に長い依存関係リストを強調し、脅威への曝露を減少させるための剪定の機会を提供します。ソフトウェアの消費者にとって、SBOMは新しいプロジェクトがもたらすリスクを評価する際にますます重要なツールとなっています。主要な組織や政府機関から委託されたソフトウェアにとって、SBOMは必要な成果物となる可能性が高いです。
SBOMを取得すると、そのデータは自動化ツールと連携してセキュリティ問題をさらに特定するために使用できます。例えば、docker sbomの出力を直接Grypeに渡して、イメージ内のパッケージに関連するCVEを特定できます:
docker sbom --format syft-json nginx:latest | grypeSBOMの生成は、以前はSyftのような新しいツールの導入に依存していました。これにより、発見可能性が低下し、SBOMはアーティファクトに内在するものではなく、追加機能として存在することになります。Docker CLIにSBOMを統合することによって、より多くの開発者がソフトウェアライフサイクル全体でレポートを作成できるようになります。
docker sbomの現在の実装は実験的であり、範囲が限られています。将来的には、SBOMデータがイメージのビルドプロセスの一部としてキャプチャされる可能性があります。docker sbomはこの情報を表示することになり、オンデマンドスキャンを実行するのではなくなります。
SBOMをdocker buildに統合することで、コンテナツールチェーンの一等級のコンポーネントとなり、すべてのイメージがそのライフサイクルを通じてSBOMを伴うことが保証されます。イメージをレジストリに保存すると、対応するSBOMも含まれ、たとえレジストリホストがエアギャップであっても、アクティブなスキャンを実行できなくても問題ありません。ただし、この機能はまだ実現には少し時間がかかります。今日のバージョンのdocker sbomは、コンテナイメージのSBOMを簡単に生成できる強力なツールであり続けています。
要約
docker sbom コマンドを使用すると、スタンドアロンツールをインストールすることなくDockerイメージのSBOMを生成できます。Docker CLIはSyftと統合されており、イメージのファイルシステムに存在するパッケージのインデックスを生成するオンデマンドスキャンを提供します。
Docker Desktop v4.7.0にアップデートするか、Linux上のDocker EngineにSBOMプラグインをインストールすることで、今日からdocker sbomを使用開始できます。画像をビルドするたびにSBOMを生成することで、問題化する前に依存関係の膨張を特定して対処するのに役立ちます。alpineのような最小限のベースイメージに切り替えたり、未使用のプログラミング言語の依存関係を削除することで、画像内のパッケージ数を減少させることが多くの場合可能です。
