SBOMを作って適切なOSS管理を行うぞ！･･･でもSBOMって何だ？

[^1]:2023年2月28日
[^2]:多分調べ方が悪いだけです･･･。
[^3]:2021年12月時点
[^4]:こう解説を書いていてようやく気付くのですが、HITACHIががっつりSBOMに貢献しているんですね。

こんにちは。

最近流行の兆しを見せている用語こと __SBOM__ って一体何？と調べたところ、経産省が少し前 [^1] に手引きを出していたのでそれを噛み砕いた記事となっています。全部読む方は75ページあるので頑張ってください。

[SBOM（Software Bill of Materials）の導⼊に関する⼿引（仮称・案） - 経済産業省 商務情報政策局 サイバーセキュリティ課](https://www.meti.go.jp/shingikai/mono_info_service/sangyo_cyber/wg_seido/wg_bunyaodan/software/pdf/009_s01_00.pdf)

# SBOMって何？なぜ必要？
__Software Bill of Materials__ の略で、ソフトウェアコンポーネントやそれらの依存関係の情報も含めた機械処理が可能なリストです。

複数のOSSを組み込んでアプリを作るのは今や当然となっていますが、
__それぞれのOSSがどのライブラリを利用しているか？__ を把握できている人はほぼいないと思われます。

例えば先日log4jの脆弱性が見つかった際「ウチの製品には組み込んでないよ」と思っていたのに
__「製品が使っているOSSが使っているOSSが使っていた」__ なんてこともあるはず。

__それらの依存関係を指定のフォーマットに従って記述したドキュメント__ のことをSBOMと呼び、
SBOMを運用することで特定コンポーネントの脆弱性が発見されたときに、影響を受けるコンポーネントをすぐ特定することが可能になります。

## 概念イメージ
"私"は __ニンジン__ がめちゃくちゃに嫌いで、エキスすら口に入れたくありません。
さて、目の前のハンバーグを"私"は食べることができるでしょうか？

<details><summary>ハンバーグの材料</summary>

* ひき肉
* 玉ねぎ
* 油
* つなぎ
    * パン粉
    * 牛乳
    * 塩コショウ
    * 砂糖
    * ニンニク
* ソース
    * 醤油
    * ウスターソース
        * トマト
        * タマネギ
        * __ニンジン__ （あっ！！）
        * セロリ
        * リンゴ
    * ケチャップ
        * トマト
        * お酢
        * タマネギ

__答え：食べられない__
</details>

ひき肉や油までなら把握しているけれど、ソースの材料まで把握していないですよね？
それを把握できるフォーマットを使って組織を超えた管理をしていこうぜ、というものがSBOMです。

# SBOMの定義は？
それでは __SBOMの要件を満たすには何を記述するか？__ についてです。

## 最小要件
SBOMの要件として、以下の3つの観点を満たす必要があります。
* データフィールド（Data Fields）
* 自動化サポート（Automation Support）
* プラクティスとプロセス（Practices and Processes）

それぞれ解説します。

### データフィールド（Data Fields）
各コンポーネントに関する情報を明確化するために、以下の情報を含めます。
要するにコンポーネントを一意に特定するための情報です。
例えば「log4j2」と一口に言ってもサプライヤーがApacheかMicrosoftかNew Relicか分かりませんし、
バージョンが分からなければ対策のしようもありませんよね。

* サプライヤー名（Supplier Name）
* コンポーネント名（Component Name）
* コンポーネントのバージョン（Version of the Component）
* その他の一意な識別子（Other Unique Identifiers）
* 依存関係（Dependency Relationship）
* SBOM作成者（Author of SBOM Data）
* タイムスタンプ（Timestamp）

### 自動化サポート
SBOMの⾃動生成や可読性などの⾃動化をサポートするために、
__SPDX（Software Package Data Exchange）、SPDX-Lite、CycloneDX、SWIDタグ（SoftWare IDentificationタグ）__ などのフォーマットを用いて作成すること。
これらはあとで解説しますが、とりあえず代表的なSBOMフォーマットの呼称とだけ覚えておいてください。

### プラクティスとプロセス（Practices and Processes）
> SBOMを利活用する組織はSBOMの要求、生成、利用に関する以下の運用方法を定義すること。
* SBOMの作成頻度
ビルドやリリースがある度に新しくSBOMを作ってね
* SBOMの深さ
トップレベルだけじゃなくて間接的な依存関係も含めてね
* 既知の未知
依存関係グラフが不完全な場合「これ以上ない」のか「未知なので不完全」かと明確に記してね
* SBOMの共有（Destribution and Delivery）
適切なアクセス許可と役割が与えられた状態で、タイムリーに利用可能にしてね
* アクセス管理（Access Control）
SBOMの一部を非公開にしたい場合、適切なアクセス制限をしてね
* 誤りの許容（Accommodation of Mistakes）
発展途上の手法だから間違えても許してね☆

# 各フォーマットについて
## SPDX（Software Package Data Exchange）とは？

https://spdx.dev/

Linux Foundationが開発するSBOMフォーマットです。
> 特徴としてはスニペット、ファイル、パッケージ、コンテナ、OSディストリビューション等の幅広いソフトウェアをサポートしているほか、コンポーネントのライセンス情報を一意に特定するための識別子のリストが用意されていることが挙げられる。
> Tag-Value(txt)形式、RDF形式、xls形式、json形式、YAML形式、xml形式がサポートされている。

後述のCycloneDXではTag-Value、RDF、xls（xlsx）、YAMLがサポートされていないので、これらのフォーマットを用いる場合はSPDX採用ですね。

## SPDX-Liteとは？

https://openchain-project.github.io/OpenChain-JWG/subgroups/licensing/SPDX_Lite.html

OpenChain Japan Work Groud（WG）によって開発された日本発のフォーマットです。
SPDXをもっともっと簡単にして手作業で作れるように簡易化されました。
日本語ドキュメントも豊富なので、とりあえず感覚を掴みたい方はここからスタートするのが手っ取り早いと思います。
ただその特徴故にどうしても小規模向けです。大規模プロジェクトであればLiteは検討の余地もありません。

https://www.hitachi-solutions.co.jp/sbom/sp/blog/2021120102/

難しくないよ、やろうよ。

## CycloneDXとは？

https://cyclonedx.org/

OWASP Foundationが開発するSBOMフォーマットです。

> セキュリティに特化したSBOMフォーマットの標準を開発することを目標とし、～～～
> コンポーネントやライセンス、コピーライト等の情報が記載され、json形式、xml形式、Protocol Buffers形式がサポートされている。

SPDXではprotobuf形式がサポートされていないので、その場合はCycloneDX採用ですね。

## SWIDタグとは？

https://www.ibm.com/docs/ja/license-metric-tool?topic=concepts-support-isoiec-19770-2

ISOとIECによるソフトウェアの特定に関する国際規格です。

SPDXとCycloneDXがSBOMフォーマットの二大巨頭のようで、SWIDタグの資料は全然見つかりませんでした･･････。[^2]

## どれを選べばいいの？
* より詳細なライセンス情報を提供したい場合は __SPDX__
ライセンス一覧表、パッケージ依存関係といったライセンスデータを正式な表現として扱い、ライセンス情報の一貫性と明確さを確保します。

* とにかく手軽に作りたい場合は __SPDX-Lite__
他の3つはツールを利用して作ることが前提となっていますが、SPDX-Liteのみ手作業で作成できるほどの手軽さを持ちます。

* より詳細なセキュリティ情報を提供したい場合は __CycloneDX__
CycloneDXは対象とするソフトウェア以外にも、ソフトウェアに含まれる既知の脆弱性に関する情報、悪用可能性に関する情報を記述することも可能です。

* SPDX-Liteで間に合わない規模のプロジェクトだけど手軽に作りたい場合は __SWID__
他の2つと比べてデータ構造が単純なので、データの提供や処理がより簡単になっています。
逆に詳細な情報提供には不向きです。

# SBOMの最小要素に対する項目対比

ただただ記述が違うだけなのですが、普段SPDXを読んでいる人がCycloneDX読んだら混乱するだろうなと。

|データフィールド|SPDX|SPDX-Lite|CycloneDX|SWID|
|----|----|----|----|----|
|サプライヤー名|PackageSupplier|PackageSupplier|component/supplier/name|\<Entity><br>＠role(tagCreator)<br>＠name|
|コンポーネント名|PackageName|PackageName|component/name|\<SoftwareIdentity><br>＠name|
|コンポーネントバージョン|PackageVersion|PackageVersion|component/version|\<SoftwareIdentity><br>＠version|
|その他一意の識別子|DocumentNamespaceと<br>SPDXIDの組み合わせ<br>ExternalRef|SPDX Identifierと<br>SPDX Document Namespaceの組合せ<br>PackageSPDX Identifier|serialNumber<br>component/cpe|\<SoftwareIdentity><br>＠tagId|
|依存関係|Relationshit(DESCRIVES; CONTAINS)|-----|dependencies/dependency ref|\<Link><br>＠rel<br>＠href|
|SBOM作成者|Creator|Creator|metadata/authors/author/name|\<Entity><br>＠role(softwareCreator)<br>＠name|
|タイムスタンプ|Created|Created|metadata/timestamp|\<Meta><br>＠timestamp|

# SBOMを作るのに便利なツールは？

経産省の資料を見るだけでも __有償が6種類、無償が14種類__ 挙げられていますので、選定にも時間がかかります。
当記事はそこまで触れることはせず、ツール名の紹介にとどめておきます[^4] 。

リンクに関しては
・ツール名 - 開発者名（リンク先は公式ページ）
・解説ページ
の構成になっています。

## 有償ツール
1. [Black Duck - Synopsys, Inc.](https://www.synopsys.com/ja-jp/software-integrity/security-testing/software-composition-analysis.html)
　→　[OSS管理＆SBOM管理ツール Black Duck - HITACHI](https://www.hitachi-solutions.co.jp/blackduck/)

2. [FOSSA - FOSSA, Inc.](https://fossa.com/)
　→　[OSS管理＆SBOM管理ツール FOSSA - HITACHI](https://www.hitachi-solutions.co.jp/fossa/)

3. [Insignary Clarity - Insignary, Inc.](https://www.insignary.com/)
　→　[Insignary Clarity - HITACHI](https://www.hitachi-solutions.co.jp/clarity/)

4. [MEND SCA - WhiteSource Software, Inc.](https://www.mend.io/sca/)
　→　[Mend社のソフトウェアコンポジション解析ツール（旧名称：WhiteSource）](https://www.hitachi-solutions.co.jp/mend_sca/)

5. [Snyk - Snyk, Ltd.](https://snyk.io/)
読みはスニーク、無償版もあるそうです。[利用された方のQiita記事](https://qiita.com/kannkyo/items/913055157c9105d02926)がありました。

6. [yamory - 株式会社アシュアード](https://yamory.io/)

## 無償ツール
リンク先はGitHubです。
1. [Augur - CHAOSS](https://github.com/chaoss)
　
2. [Checkov - Bridgecrew, Inc.](https://github.com/bridgecrewio/checkov)
　→　[公式ページ](https://www.checkov.io/)
　
3. [Daggerboard - NewYork-Presbyterian Hospital](https://github.com/nyph-infosec/daggerboard)
　
4. [Dependency-Track - OWASP Foundation](https://github.com/DependencyTrack/dependency-track)
　→　[公式ページ](https://dependencytrack.org/)
　
5. [FOSSology - Linux Foundation](https://github.com/fossology/fossology)
　→　[公式ページ](https://www.fossology.org/)
　
6. [in-toto - Linux Foundation](https://github.com/in-toto)
　
7. [OSS Review Toolkit(ORT) - Linux Foundation](https://github.com/oss-review-toolkit)
　
8. [SBOM Tool - Microsoft Corporation](https://github.com/microsoft/sbom-tool)
　
9. [Scancode.io - nexB, Inc.](https://github.com/nexB/scancode.io/)
　→　[公式ページ](https://nexb.github.io/scancode.io-homepage/)
　
10. [Scancode Toolkit - nexB, Inc.](https://github.com/nexB/scancode-toolkit)
　→　[公式ページ](https://nexb.github.io/scancode.io-homepage/)
　
11. [SW360 - Eclipse Foundation](https://github.com/eclipse-sw360/sw360)
　→　[利用された方のQiita記事](https://qiita.com/K-Hama/items/1582b4e1bf248025eabb)
　
12. [SwiftBOM - CERT Coordination Center(CERT/CC)](https://github.com/CERTCC/SBOM)
　
13. [Syft & Grype - Anchore Enterprise](https://github.com/anchore/grype)
　→　[利用された方のQiita記事](https://qiita.com/ykmchd/items/65e60bb1cc64bca4698e)
　
14. [Trivy - Aqua Secutiry Software, Ltd.](https://github.com/aquasecurity/trivy)

# 最後に
くぅ疲。
もしかしたら特定の無償ツールに焦点を当てた記事を書くかもしれません。

# 参考リンク
* 経済産業省
[第9回 サイバー・フィジカル・セキュリティ確保に向けたソフトウェア管理手法等検討タスクフォース - 経済産業省](https://www.meti.go.jp/shingikai/mono_info_service/sangyo_cyber/wg_seido/wg_bunyaodan/software/009.html)
　
[SBOM（Software Bill of Materials）の導⼊に関する⼿引（仮称・案） - 経済産業省 商務情報政策局 サイバーセキュリティ課](https://www.meti.go.jp/shingikai/mono_info_service/sangyo_cyber/wg_seido/wg_bunyaodan/software/pdf/009_s01_00.pdf)

* HITACHI solutions
[株式会社日立ソリューションズ OSS活用コミュニティ - Qiita](https://qiita.com/organizations/hitachi-solutions-oss)
　
@d-morishita 
日立ソリューションズに所属されており[^3] 、特にSBOM周りの投稿が多い方です。
　
[SBOM：Software Bill Of Materialsとは？（フォーマット、ユースケース、ツールについて）](https://www.hitachi-solutions.co.jp/sbom/sp/blog/2021120105/)
　
[資料ダウンロード](https://www.hitachi-solutions.co.jp/sbom/sp/download/)

* その他参考にさせていただいた記事
[OSS管理のベストプラクティス＆OSS管理ツールの選び方 - Qiita](https://qiita.com/AyumiWatanabe/items/9b44e180bb2ac8a6eb77)
　
[OpenChain Project - Qiita](https://qiita.com/organizations/openchainproject)
深堀りしたい方はOpenChain Projectなども見ていくと良いかと思います。