bomctl : SBOM Management tool

本記事は急いで書いたので、間違いが多いですし、書き足りない箇所が多いです。あまりアップデートできてません。
個人メモ：書き足す部分
- dbのスキーマ
- ほかのコマンドの説明
- エクスポートされたSBOMの情報について

SBOMを生成し、分析する無償ツールは数多く存在していますが、生成したSBOMやそのデータを管理する仕組みを持つツールは少ないのが現状です。
生成したSBOMやソフトウェアコンポーネントを管理していくことはとても難しく、多くの課題があります：
- 状況によっては、チームごと、ビルドやデプロイなどのタイミングごと、環境ごと、リポジトリ、ブランチごと、製品やレイヤーごと(OSS、商用品、自社製品、OS)にSBOMを分類し、複数のSBOMを管理していかなければならない
- SPDXやCycloneDXなどSBOMフォーマットが一意に定まっておらず、複数のフォーマットに対応しなければいけない
- 各SBOM生成ツールごとに表記ゆれが存在するため、異なるツールで生成したSBOMを互換的に取り扱う仕組みが必要
- SBOMの可読性が低く、人手による確認が難しい
- コンポーネント情報が大量に存在し、目的の情報にすぐにアクセスすることが難しい

このような困難な課題を解決する手段自体がビジネスでは差分となっていくため、SBOM・コンポーネント管理ツールは有償化の傾向にあります。例えば、SBOM生成ツールSyftや脆弱性検知ツールGrypeをOSSとして提供しているAnchore社は、それらのデータ管理サービスを[Anchore Enterprise](https://anchore.com/platform/)という有償ツールとして提供しています。
無償で提供されており、使えそうな無償ツールは現状では少ないため、これからは、SBOMを管理していく仕組みを備えたOSSが期待されています。




そんな中、今回提案されたのが本記事で紹介する[Bomctl](https://github.com/bomctl/bomctl) というSBOMを管理するためのOSSです。[Secure Open Source Software Summit 2023](https://openssf.org/press-release/2023/09/13/openssf-gathers-us-government-and-industry-leaders-at-secure-open-source-software-summit-2023/)で議論された課題に取り組むため、[Security Tooling Working Group](https://github.com/ossf/wg-security-tooling)によって開発されました。こちらはOpenSSFのプロジェクトになっています。

- [GitHub - bomctl/bomctl: Format agnostic SBOM tooling](https://github.com/bomctl/bomctl/tree/main)

- [Simplify SBOM Management for Developers: Introducing Bomctl](https://openssf.org/blog/2024/09/05/simplify-sbom-management-for-developers-introducing-bomctl/)

## 目次
- [Related Work](#related-work)
- [Bomctlの解説](#bomctlの解説)
  - [Bomctlの仕組み](#bomctlの仕組み)
  - [将来性](#将来性)
  - [Bomctlを使ってみる](#bomctlを使ってみる)
- [参考文献](#参考文献)


## Related Work
Bomctlよりも前に、先行的にSBOMやソフトウェアコンポーネント管理を行うOSSは既に存在しており、有名なOSSが[GUAC](https://github.com/guacsec/guac)と[Dependency-Track](https://dependencytrack.org/)です。

また、個人開発では、[sbom-manager](https://github.com/anthonyharrison/sbom-manager)というPython製のツールがシンプルなSBOM管理を行うことができます。このツールは以前紹介した[sbomdiff](https://github.com/anthonyharrison/sbomdiff)の作成者である、[anthonyharrison](https://github.com/anthonyharrison)さんによって個人開発されているOSSです。今回紹介するbomctlはsbom-managerというツールに結構似ていました。

- [SBOM差分検知ツール：sbomdiffの使い方説明 \#Python \- Qiita](https://qiita.com/ichijouji/items/296c93b4887b803219ba)



## Bomctlの解説
### Bomctlの仕組み
bomctlの仕組みは、以下の図のように`/home/user/.cache/bomctl`ディレクトリ配下にsqliteベースのdbファイル`bomctl.db`を作成し、SBOMをそこへインポートする仕組みのようです。SBOMのコンテンツをdbファイルへエンコードする際は、[protbom](https://github.com/protobom/protobom)と呼ばれるOSSのパッケージを利用し、[protocol buffers](https://protobuf.dev/getting-started/)形式でエンコードを行います。したがって、dbファイル内では、SPDXやCyclonedxなどの形式に依存せず、SBOMファイルのデータを管理することができるようです。
またdbファイル内に格納されたSBOMは、SBOM形式やファイル形式を指定して、エクスポートすることが可能です。
**bomctlが対応しているSBOMフォーマットとエンコーディングの組み合わせを以下の星取表にまとめました：**

| フォーマット | JSON対応 | XML対応 |対応バージョン|
| --- | --- | --- |---|
| **SPDX** | 〇 | × |2.2, 2.3|
| **CycloneDX** | 〇 | 〇 |1.0から1.5|

```mermaid
sequenceDiagram
    participant CLI bomctl
    participant Cache (bomctl.db)

    CLI bomctl->>Cache (bomctl.db): bomctl import sbom <br> SBOMをインポート 
    Cache (bomctl.db)->>Cache (bomctl.db):SBOMの中身を<br>dbファイルに登録 
        CLI bomctl->>+Cache (bomctl.db): bomctl export SBOM-ID <br> SBOMをエクスポートをリクエスト
    Cache (bomctl.db)-->>-CLI bomctl:SBOMをエクスポート

```

### 将来性
bomctlでは現在、以下の機能がサポートされています：
- `fetch`: HTTPS、OCI、Gitなどいくつかのプロトコルを使用してSBOMファイルを取得し、キャッシュに保存する
- `import`: local file systemに存在するSBOMをキャッシュに保存できる
- `list`: キャッシュに存在するSBOMのリストを出力する
- `export`: キャッシュ内のデータをフォーマットを指定し、SBOMとして出力する
- `merge`: 指定したSBOMをマージする

将来的には、SBOMの差分を取ったり、SBOMを分けたりする機能が開発されるそうです：
- `diff`（差分）:
    - コンポーネントおよびその依存関係間の差分を生成
    - コンポーネントのプロパティの差分を生成
    - 機械可読および人間可読な形式での差分を作成
- enrich（情報の付加）
    - Transparency Exchange APIを使用して、SBOMコンポーネントに追加データを付加
- redact（編集）
- split（分割）
    - purlタイプやコンポーネント識別子に基づいて複数のファイルに分割。
- trim（不要部分の削除）
    - purlタイプやコンポーネント識別子に基づいて、SBOMをトリミングする



### Bomctlを使ってみる
まずは、syftでSBOMを作ります。用意するSBOMはなんでもよいです。
```bash
syft dir:/dataset/python_data/poetry/ -o cyclonedx-json@1.5=poetry_sbom_bomctl.json
```

先ほど生成したSBOMをbomctlでインポートします。
```
bomctl import poetry_sbom_bomctl.json
```
登録したSBOMのリストを見てみます。`urn:uuid:addc873c-0d2b-43fc-93de-76549666b079`が登録したSBOMのIDです。
```bash
bomctl list

                        ID                        │ Version  │ # Nodes
──────────────────────────────────────────────────┼──────────┼──────────
 urn:uuid:addc873c-0d2b-43fc-93de-76549666b079    │    1     │    5
```
次にSBOMをエクスポートしてみます。
```bash
$ bomctl export -e json -f cyclonedx -o ./test_bomctl.json urn:uuid:addc873c-0d2b-43fc-93de-76549666b079
INFO  export: Exporting document sbomID=urn:uuid:addc873c-0d2b-43fc-93de-76549666b079
```

結構シンプルで使いやすいですね。これで、GUACやDependency-Trackと連携ができると、UI部分が補えそうです。


## 参考文献
- [GitHub - bomctl/bomctl: Format agnostic SBOM tooling](https://github.com/bomctl/bomctl/tree/main)

- [Simplify SBOM Management for Developers: Introducing Bomctl](https://openssf.org/blog/2024/09/05/simplify-sbom-management-for-developers-introducing-bomctl/)