リネオブログ

Yocto よもやま話 第 10 回 「SBOM を生成してみた」

2023 年 04 月 12 日   Yocto Project よもやま話

目次

  1. SBOM って何 ?
  2. Yocto Project と SBOM について
  3. Yocto Projectで使ってみた
  4. バージョン3.3 以前で SBOM を作るには

今回のブログ記事は、予告を変更してリネオのセールス&マーケティング部の者が伊東の監修のもとで執筆したものを掲載します。「SBOM を生成してみた」と題して、Yocto Project を利用した生成物につけることができる SBOM について解説します。
YoctoProject で SBOM 対応を実施した Joshua Watt 氏は SBoM の表記を使用していますが、本ブログでは LinuxFoundation の刊行物で使用されている SBOM の表記を採用しています。

1. SBOM って何 ?

概要

SBoM は Software Bill Of Materials の略称で、日本語に翻訳すると「ソフトウェア部品表」になります。ソフトウェアアプリケーションなどのソフトウェア成果物を構築するために使用されるコンポーネントの一覧です。SBOM の利用方法は食品ラベルに似ています。アレルギーを引き起こす可能性のある食品を避けるために食品ラベルを参照するように、組織や個人は自分たちに害を及ぼす可能性のあるソフトウェアの使用を回避するために SBOM を参照することができます。

食品ラベルとの比較

米国および EU での規制

SBOM が注目を浴びるきっかけとなったのは、2021 年 5 月 12 日に発行された米国大統領令「Executive Order on Improving the Nation's Cybersecurity(国家のサイバーセキュリティの向上に関する大統領令)」でした。この中の第4章「ソフトウェア・サプライチェーン・セキュリティの強化」に SBOM が記載されています。

また、欧州委員会は 2022 年 9 月 15 日、サイバーレジリエンス法案(Cyber Resilience Act1)を公表しました。この中に、欧州で製品を販売する製造者は、脆弱性に関する報告窓口の情報や製造者が意図した製品の使用法、SBOM、そして適合宣言書などへのアクセス方法などを提供することが盛り込まれています。

SBOM 準拠のフォーマット

米国では前項で取り上げた 2021 年 5 月 12 日発行の大統領令に従い、同年 7 月 12 日に商務省国家電気通信情報局(NTIA)が SBOM の最小要素を定めた「The Minimum Elements For a Software Bill of Materials」(以下、最小要素)を公開しています。

  • Baseline Component 情報
  • Author Name (開発者)
  • Supplier Name (会社名)
  • Component Name (コンポーネント名)
  • Version String (バージョン)
  • Component Hash (コンポーネントのハッシュ値)
  • Unique Identifier (識別⼦)
  • Relationship (関係)

この Baseline Component 情報を含めるデータフォーマットには SPDX,CyconeDX,SWID などがあります。

SPDX について

SPDX は、Linux Foundation の傘下のプロジェクトです。SPDX を使って、ソフトウェアに関するコンポーネント、ライセンス、著作権、セキュリティ参照、その他のメタデータを表現することができます。

2010 年 2 月に Linux Foundation 傘下の FOSSBazaar で仕様策定が開始され、同年 8月に主要な OpenCompliance の一つとして発表されました。当初の目的は、ライセンスのコンプライアンスを改善することでした。
その後サプライチェーンの透明性やセキュリティなど、さらなる使用例を促進するために拡張され、2020 年 10 月の SPDX2.2.1 から ISO に即した発行のためにフォーマットの使用を転換しています。

SPDX ドキュメントはセクションで構成されますが、SPDX2.1 の仕様では以下のようなセクションが定められています。

Document Creation Information
(ドキュメント作成者)
ドキュメントを作成者やその作成方法、その他作成に関連する有用な情報の表記
Package Information
(パッケージ情報)
パッケージについての情報を提供します。生成者、ダウンロード URL,チェックサム、ライセンス概要など。
File Information
(ファイル情報)
特定のファイルに関する情報を表示します。ファイルの著作権(あれば)、ライセンス、チェックサム、コントリビューターなどの情報が含まれます。
Snippet Information
(スニペット情報)
ファイル内の範囲で関連するライセンス情報を定義するのに使用します。
Other Licensing Information
(その他のライセンス情報)
SPDX ライセンスリストにないライセンスを記述するのに用います。
Relationships
(リレーションシップ)
SPDX2.0 仕様で導入されました。SPDX ドキュメント同士がどのように関連しあっているかを表記します。
Annotations
(注釈)
ドキュメント内の様々な要素に対して人がつけたコメントです。ドキュメントのレビューなどに利用します。

SPDX v2.2 Document Contains

SPDX v2.2 ドキュメントの内容

Using SPDX - Software Package Data Exchange (SPDX) より引用

2. Yocto Project と SBOM について

Yocto Project では SBOM のサポートをバージョン 3.4 から開始しています。SBOM 情報に利用するライセンスの標準には Software Package Data Exchange(SPDX)を採用しています。

この SBOM のサポートを利用すると、一度行われた YoctoProject でプロジェクトのイメージの構築、一度確認された各ソフトウェアコンポーネントの全てのライセンス、一度適用された脆弱性の修正について、 OpenEmbedded ビルドシステムは使用したすべてのコンポーネンについて、そのライセンス、その依存関係、適用したその変更、修正した既知の脆弱性についての説明書きを作成することができます。説明書きは、SPDX 標準を利用して、ソフトウェア部品表(SBOM)の形式で生成されます。

3. Yocto Projectで使ってみた

※ 一部記述を訂正しました。(2024/7/10)

OpenEmbedded ビルドシステムは素のままでは SBOM を生成しません。生成させるためには、SPDX を有効にしなくてはなりません。
設定ファイルに create-spdx の継承を行わせるよう設定を入れる必要があります。

今回実際に試してみようということで、 設定にあたり、local.conf に以下の記述を追加しました。

# added for SBOM
# required. enable to generate spdx files.
INHERIT += "create-spdx"

# optional. if "1", output spdx files will be formatted.
SPDX_PRETTY = "1"

# optional. if "1", output spdx files includes [file-information section](https://spdx.github.io/spdx-spec/v2.3/file-information/).
SPDX_INCLUDE_SOURCES = "1"

# optional. if "1", bitbake will create source files archive for each package.
SPDX_ARCHIVE_SOURCES = "1"

# optional. if "1", bitbake will create output binary archive for each package.
SPDX_ARCHIVE_PACKAGED = "1"

以下記述部分の説明です。

まずは create-spdx クラスを継承します。

INHERIT += "create-spdx"

次は生成されたファイルを読みやすくするためのオプションです。

SPDX_PRETTY = "1"

ターゲットレシピで処理されるソースファイルの説明を追加するオプションです。

SPDX_INCLUDE_SOURCES ="1"

ソースファイル自体のアーカイブを追加するオプションです。

SPDX_ARCHIVE_SOURCES = "1"

生成されたターゲットパッケージのファイルの圧縮アーカイブを追加するオプションです。

SPDX_ARCHIVE_PACKAGED ="1"

この記述を加えた後、イメージを構築します。

$bitbake core-image-minimal

マニュアルには JSON 形式の SPDX 出力がビルドディレクトリ下の
/tmp/deploy/images/MACHINEにIMAGE-MACHINE.spdx.json ファイルとして出力される、とあります。

core-image-mnimal-qemu86-64.spdx.json がインデックスとして、また、JSON SPDX ファイルをすべて固めた圧縮ファイルとして core-image-minimal-qemux86-64.spdx.tar.zst ファイルが作成されました。

インデックスファイルの core-image-minimal-qemu86-64.spdx.json の冒頭が以下です。

1.で挙げた Document Creation Information (ドキュメント作成情報)に相当する部分です。

{
  "SPDXID": "SPDXRef-DOCUMENT",
  "creationInfo": {
    "comment": "This document was created by analyzing the source of the Yocto recipe during the build.",
    "created": "2023-03-17T08:25:03Z",
    "creators": [
      "Tool: OpenEmbedded Core create-spdx.bbclass",
      "Organization: OpenEmbedded ()",
      "Person: N/A ()"
    ],
    "licenseListVersion": "3.14"
  },
  "dataLicense": "CC0-1.0",

core-image-minimal-qemu86-64.spdx.json はインデックス情報のみですので、パッケージ情報は kernel-image-5.15.91-yocto-standard.spdx.json のものを例に挙げます。以下のようになっていました。

  "name": "kernel-image-5.15.91-yocto-standard",
  "packages": [
    {
      "SPDXID": "SPDXRef-Package-kernel-image-5.15.91-yocto-standard",
      "copyrightText": "NOASSERTION",
      "downloadLocation": "NOASSERTION",
      "licenseConcluded": "NOASSERTION",
      "licenseDeclared": "GPL-2.0-only",
      "licenseInfoFromFiles": [
        "NOASSERTION"
      ],
      "name": "kernel-image-5.15.91-yocto-standard",
      "packageFileName": "kernel-image-5.15.91-yocto-standard.tar.zst",
      "packageVerificationCode": {
        "packageVerificationCodeValue": "da39a3ee5e6b4b0d3255bfef95601890afd80709"
      },
      "supplier": "Organization: OpenEmbedded ()",
      "versionInfo": "5.15.91+gitAUTOINC+8df0d345ef_531238ba91"
    }
  ],

"licenseDeclared": "GPL-2.0-only",とあり、SPDX ライセンスリストに掲載されているライセンス形態のうち GPL-2.0-only を採用していることがわかります。

4. バージョン3.3 以前で SBOM を作るには

YoctoProject バージョン3.3以前では、YoctoProject 内で SBOM 準拠の出力を出すことは現状ではできません。なお、現在LTSとして、2024年4月までメンテナンスが行われるYocto3.1に関して、Joshua Watt氏のバックポートパッチが提出されており、早ければ2023/5/19リリース予定のYocto3.1.25から利用可能となります。

また、サードパーティで SBOM 出力を可能にするサービスを提供するところがあります。
例えば、リネオが取り扱っている Timesys Vigiles では、バージョン 3.3 以前の Yocto Project のプロジェクトからも SBOM を生成することができます。

Vigiles は YoctoProject 以外にも Buildroot、PetaLinux、Wind River Linux、PTXdist、OpenWrt、Timesys Factory を含むすべての Linux ビルドシステム統合をサポートし、正確な SBOM 生成を行っています。また厳選された脆弱性データベースに対する SBOM の自動スキャンにより、CVE レポートを作成します。

ソフトウェアの脆弱性を狙うサイバー攻撃は後を絶ちません。Linux の性質上、サプライチェーンの情報を収集しての脆弱性の検知と対策パッチの手当ては重要な課題となっています。SBOM の利用が Linux ベースの製品の安全性の確保に役立ちます。

次号予告

次回は 4 月末リリース予定の Yocto4.2(Mickledore)に関するリリース情報をお届けする予定です。

この記事の著者
執筆者
伊東 孝康

ウィンドウシステム X10 の時代からオープンソースに関わり、リネオでカーネル層からアプリケーション層まで幅広い組込みの開発を行う。
2020 年 10 月 Yocto Project Ambassador に就任

Yocto Project の勉強がしたい Yocto での問題を解決して欲しい お客様の Yocto 開発を支援するサービス群 Yoctoコンシェルジュ

組込みLinuxセキュリティ基礎講座
Vigiles サポート
Yocto Project よもやま話
Yocto よもやま話 第 14 回 「Yocto 4.3 Nanbield リリース」
Yocto よもやま話 第 14 回 「Yocto 4.3 Nanbield リリース」

2024 年 03 月 26 日 Yocto Project よもやま話

Yocto よもやま話 第 13 回 「Yocto Project の最新動向 2023 夏」
Yocto よもやま話 第 13 回 「Yocto Project の最新動向 2023 夏」

2023 年 07 月 25 日 Yocto Project よもやま話

Yocto よもやま話 第 12 回 「Yocto Project 始めます その 2」
Yocto よもやま話 第 12 回 「Yocto Project 始めます その 2」

2023 年 06 月 20 日 Yocto Project よもやま話

Linux 技術ネタ
RISC-Vについて学ぶ-後編
RISC-Vについて学ぶ-後編

2024 年 01 月 10 日 Linux 技術ネタ

RISC-Vについて学ぶ-前編
RISC-Vについて学ぶ-前編

2023 年 12 月 12 日 Linux 技術ネタ

イベントレポート
EdgeTech+ West 2024 出展レポート
EdgeTech+ West 2024 出展レポート

2024 年 07 月 26 日 イベントレポート

Advanced Technology Forum 2024 Summer 参加レポート
Advanced Technology Forum 2024 Summer 参加レポート

2024 年 07 月 09 日 イベントレポート

リクルート
新卒採用、絶賛募集中!
新卒採用、絶賛募集中!

2023 年 05 月 30 日 リクルート

国立大学オンライン研修レポート 2022
国立大学オンライン研修レポート 2022

2022 年 09 月 27 日 リクルート

信州リネオ便り
リネオに雪が積もりました
リネオに雪が積もりました

2024 年 11 月 29 日 信州リネオ便り

社内BBQを開催しました!
社内BBQを開催しました!

2024 年 09 月 25 日 信州リネオ便り

夏季休業明け、スイカを頂きました!
夏季休業明け、スイカを頂きました!

2024 年 08 月 20 日 信州リネオ便り

ソリューション統括部
シリコンバレー探検記 2019 ~番外編~
シリコンバレー探検記 2019 ~番外編~

2019 年 12 月 10 日 ソリューション統括部

シリコンバレー探検記 2019 ~後編~
シリコンバレー探検記 2019 ~後編~

2019 年 12 月 10 日 ソリューション統括部

シリコンバレー探検記 2019 ~前編~
シリコンバレー探検記 2019 ~前編~

2019 年 12 月 10 日 ソリューション統括部

マーケティング統括部
大成功決起大会!!(ET2019)
大成功決起大会!!(ET2019)

2019 年 12 月 13 日 マーケティング統括部

ESEC 2019 決起大会
ESEC 2019 決起大会

2019 年 04 月 25 日 マーケティング統括部

シリコンバレー探検記 その 2
シリコンバレー探検記 その 2

2018 年 12 月 18 日 マーケティング統括部