docs community blog github
Edit

Bill of Materials

部品表(bill of materials)を使用すると、作成したコンテナイメージの使用する全ての依存ライブラリに関する情報をメタデータとして参照できます。

部品表(bill of materials)とは何か

部品表(BOM:bill of materials)とは、コンテナイメージやアプリケーションの依存対象に関する情報をメタデータとして公開する、業界標準の仕組みのことです。 メタデータは次のようなフィールドで構成されています。

  • version: 依存対象のバージョン
  • uri: コンパイル済みファイルへアクセスできる URI
  • checksum: CycloneDX が対応しているハッシュアルゴリズム(SHA-256 など)、および、依存対象に関するチェックサムの値
  • licenses: 依存対象の、SPDX 形式のライセンス
  • deprecation-date: 依存対象(のバージョン)が非推奨になる日時
  • source uri: 依存対象の上流の元データへアクセスできる URI
  • source checksum: CycloneDX が対応しているハッシュアルゴリズム(SHA-256 など)、および、依存対象の上流の元データに関するチェックサムの値
  • CPE: 共通するプラットフォームの一覧
  • pURL: パッケージの URL

BOM が役に立つ理由

BOM の情報は、主に、アプリケーションのセキュリティサプライチェインに含まれる依存対象を理解するのに役立ちます。

脆弱性スキャン

世の中には、BOM を入力として使用できるさまざまな脆弱性スキャンツールがあります。 例えば、Dependency TrackTrivy で脆弱性を発見できます。

主に脆弱性を特定するために使用するフィールドが CPE と pURL です。

CPEs

共通プラットフォーム一覧(CPE:common platform enumeration)は、NIST National Vulnerabilty Database で依存対象の特定のバージョンに関する脆弱性と修正パッチを検索できる標準的な記法です。

pURLs

pURL はベンダーやプロジェクトやエコシステムに依存しない、汎用的なパッケージ URL 表現 です。

コンプライアンスチェック

BOMのライセンス情報を使うと、アプリケーションの法律面のコンプライアンスを確認するのに便利です。 コンテナイメージに含まれるそれぞれの依存対象のライセンス情報を使いやすい形式で取得できます。

ライセンス

Paketo BOM のライセンス情報は、ライセンス検出ツールで収集したものです。 ソフトウェアにライセンス情報を含める方法は標準化されていないので、検出ツールは発見したライセンスに「信頼スコア」を割り当てます。 Paketo プロジェクトでは、重要なライセンス情報を取りこぼすリスクを回避するため、「信頼スコア」の値に関わらず、検出ツールが発見した 全てのライセンス情報 を BOM へ登録します。 そのため、詳細なコンプライアンスチェックをするときは、間違って発見した(偽陽性の)ライセンス情報を取り除かなければなりません。

Paketo BOM の出力形式

Buildpack は作成したコンテナイメージのメタデータに BOM を追加します。 Paketo Buildpack は次のような JSON 形式の情報を追加します。

{
  "name": <name of the dependency>,
  "metadata": {
    "checksum": {
      "algorithm": <CycloneDX-supported hash algorithm ('MD5', 'SHA-1', 'SHA-256', 'SHA-384', 'SHA-512', 'SHA3-256', 'SHA3-384', 'SHA3-512', 'BLAKE2b-256', 'BLAKE2b-384', 'BLAKE2b-512', 'BLAKE3')>,
      "hash": <hash of the dependency>
    },
    "cpe": <dependency/version specific common platform enumeration>,
    "deprecation-date": <date of package deprecation>,
    "licenses": <[list of all licensesn SPDX format]>,
    "purl": <dependency/version specific package URL>,
    "source": {
      "checksum": {
        "algorithm": <CycloneDX-supported hash algorithm ('MD5', 'SHA-1', 'SHA-256', 'SHA-384', 'SHA-512', 'SHA3-256', 'SHA3-384', 'SHA3-512', 'BLAKE2b-256', 'BLAKE2b-384', 'BLAKE2b-512', 'BLAKE3')>,
        "hash": <hash of the dependency>
      },
      "uri": <package upstream source URI>
    },
    "uri": "<compiled package URI>",
    "version": <dependency version>
  }
}

Paketo Buildpack は Buildpack言語モジュール という2種類の主要な BOM 要素を出力します。 ここでは、「部品表(Bill of Materials)へアクセスする」で作成したコンテナイメージの BOM についてそれぞれの内容を説明します。

Buildpack 要素

Buildpack 要素は、Paketo Buildpack が依存性管理ツールを 使わずに 直接インストールする依存対象に関する情報です。 具体的には、JVM や .NET Runtime、Node.js ランタイムなどが挙げられます。 Buildpack はこれらの依存対象を構築する途中で得られたメタデータを使用して要素を生成します。

Buildpack 要素に含まれるのは依存対象に関するバージョン、脆弱性識別子(CPE や pURL)、使用していると考えられるライセンス、元データおよびコンパイル済みデータのチェックサム、元データの情報、名前です。

次の例は、Paketo Node Engine buildpack のインストールする Node.js ランタイムに関する Buildpack 要素です。

{
  "name": "Node Engine",
  "metadata": {
    "checksum": {
      "algorithm": "SHA-256",
      "hash": "a50ee095f936b51fffe5c032a7377a156723145c1ab0291ccc882f04719f1b54"
    },
    "cpe": "cpe:2.3:a:nodejs:node.js:16.7.0:*:*:*:*:*:*:*",
    "deprecation-date": "2024-04-30T00:00:00Z",
    "licenses": [
      "0BSD",
      "Apache-2.0",
      "Artistic-2.0",
      "BSD-2-Clause",
      "BSD-3-Clause",
      "BSD-3-Clause-Clear",
      "CC0-1.0",
      "MIT",
      "MIT-0",
      "Unicode-TOU"
    ],
    "purl": "pkg:generic/node@v16.7.0?checksum=0c4a82acc5ae67744d56f2c97db54b859f2b3ef8e78deacfb8aed0ed4c7cb690&download_url=https://nodejs.org/dist/v16.7.0/node-v16.7.0.tar.gz",
    "source": {
      "checksum": {
        "algorithm": "SHA-256",
        "hash": "0c4a82acc5ae67744d56f2c97db54b859f2b3ef8e78deacfb8aed0ed4c7cb690"
      },
      "uri": "https://nodejs.org/dist/v16.7.0/node-v16.7.0.tar.gz"
    },
    "stacks": [
      "io.buildpacks.stacks.bionic"
    ],
    "uri": "https://deps.paketo.io/node/node_v16.7.0_linux_x64_bionic_a50ee095.tgz",
    "version": "16.7.0"
  },
  "buildpacks": {
    "id": "paketo-buildpacks/node-engine",
    "version": "1.2.3"
  }
}

言語モジュール要素

言語モジュール要素は、Paketo Buildpack が依存性管理ツールでインストールした依存対象の情報です(Node.js モジュールや Maven パッケージなど)。 Buildpack はインスト―ルしたそれぞれのパッケージに関するメタデータを収集して要素を生成します。

言語モジュール要素に含まれるのは依存対象に関するバージョン、脆弱性識別子(pURL)、使用していると考えられるライセンス、名前です。

次の例は、Node.js モジュールに関する言語モジュール要素です。

{
  "name": "httpdispatcher",
  "metadata": {
    "licenses": [
      "MIT"
    ],
    "purl": "pkg:npm/httpdispatcher@2.1.2",
    "version": "2.1.2"
  },
  "buildpack": {
    "id": "paketo-buildpacks/node-module-bom",
    "version": "1.2.3"
  }
}

注意:Paketo Buildpack の生成するメタデータは、業界標準のBOM形式と適合しない場合があります。業界標準の形式の中でも CycloneDXSPDX は、どちらも JSON 形式で表現できます。将来的にはどちらの形式にも対応する予定です。

Edit

Last modified: September 14, 2021