C++ Docker イメージに対するサプライチェーンセキュリティ

前提条件

  • git クライアント を持っていること。 本節における例では、コマンドラインベースの git クライアントを用いることにします。 クライアントはどのようなものでも利用可能です。
  • Docker Desktop がインストールされていること。 イメージのプルと保存のため containerd を有効化する必要があります (チェックボックスの Settings > General にあります)。 Docker Desktop ではなく Docker Engine を利用する場合であれば以下です。
    • Docker SBOM CLI プラグイン がインストール済であること。 Docker Engine に対してこれをインストールするには以下のコマンドを実行します。

      $ curl -sSfL https://raw.githubusercontent.com/docker/sbom-cli-plugin/main/install.sh | sh -s --
    • Docker Scout CLI プラグイン がインストール済であること。 Docker Engine に対してこれをインストールするには以下のコマンドを実行します。

      $ curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --
    • Docker Engine において containerd の有効化 を行っていること。

概要

本節では Docker SBOM CLI プラグインを利用して C++ Docker イメージから SBOM (Software Bill of Materials; ソフトウエア部品表) の抽出方法を示します。 SBOM はソフトウェアパッケージ内にあるコンポーネントすべてを一覧表示するものです。 そこにはバージョン情報やライセンスなどが含まれます。 SBOM を利用することで、利用するソフトウェアの出どころを追跡することができ、所属する組織のセキュリティやライセンス規則に準拠しているかどうかを確認することができます。

SBOM の生成

ここで利用する Docker イメージは、 C++ アプリケーションに対してのマルチステージビルドの生成 においてビルドしたものです。 イメージをまだビルドしていない場合は、上のガイドの手順に従ってイメージをビルドしてください。 このイメージの名前は hello です。 hello イメージに対して SBOM を生成するには以下のコマンドを実行します。

$ docker sbom hello

コマンドを実行すると "No packages discovered" (パッケージが見つかりません) と出力されます。 最終イメージがスクラッチイメージなので、パッケージを何も持っていないからです。 Docker Scout を使ってもう一度以下を実行します。

$ docker scout sbom --format=list hello

このコマンドの出力も同様となるはずです。

SBOM 証明書の生成

SBOM はビルドプロセスにおいて生成可能であり、その際にイメージに「アタッチ」することができます。 これを SBOM 証明書 (SBOM attestation) と呼びます。 hello イメージに対しての SBOM 証明書を生成するには、まず Dockerfile を以下のように修正します。

ARG BUILDKIT_SBOM_SCAN_STAGE=true

FROM ubuntu:latest AS build

RUN apt-get update && apt-get install -y build-essential

WORKDIR /app

COPY hello.cpp .

RUN g++ -o hello hello.cpp -static

# --------------------
FROM scratch

COPY --from=build /app/hello /hello

CMD ["/hello"]

第 1 行めの ARG BUILDKIT_SBOM_SCAN_STAGE=true は、ビルドステージにおいて SBOM スキャンを有効にするものです。 そこで以下のコマンドを実行してイメージをビルドします。

$ docker buildx build --sbom=true -t hello:sbom .

コマンド実行によってイメージがビルドされ、SBOM 証明書も生成されます。 SBOM がアタッチされたことを確認するため、以下のコマンドを実行します。

$ docker scout sbom --format=list hello:sbom

なお単純な docker sbom コマンド実行では、SBOM 証明書はロードされません。

まとめ

本節では C++ Docker イメージのビルドプロセスにおいて SBOM 証明書を生成する方法について学びました。 普通のイメージスキャンを行うだけでは、スクラッチイメージから SBOM を生成することはできません。