本記事は急いで書いたので、間違いが多いですし、書き足りない箇所が多いです。あまりアップデートできてません。
個人メモ:書き足す部分
- dbのスキーマ
- ほかのコマンドの説明
- エクスポートされたSBOMの情報について
SBOMを生成し、分析する無償ツールは数多く存在していますが、生成したSBOMやそのデータを管理する仕組みを持つツールは少ないのが現状です。
生成したSBOMやソフトウェアコンポーネントを管理していくことはとても難しく、多くの課題があります:
- 状況によっては、チームごと、ビルドやデプロイなどのタイミングごと、環境ごと、リポジトリ、ブランチごと、製品やレイヤーごと(OSS、商用品、自社製品、OS)にSBOMを分類し、複数のSBOMを管理していかなければならない
- SPDXやCycloneDXなどSBOMフォーマットが一意に定まっておらず、複数のフォーマットに対応しなければいけない
- 各SBOM生成ツールごとに表記ゆれが存在するため、異なるツールで生成したSBOMを互換的に取り扱う仕組みが必要
- SBOMの可読性が低く、人手による確認が難しい
- コンポーネント情報が大量に存在し、目的の情報にすぐにアクセスすることが難しい
このような困難な課題を解決する手段自体がビジネスでは差分となっていくため、SBOM・コンポーネント管理ツールは有償化の傾向にあります。例えば、SBOM生成ツールSyftや脆弱性検知ツールGrypeをOSSとして提供しているAnchore社は、それらのデータ管理サービスをAnchore Enterpriseという有償ツールとして提供しています。
無償で提供されており、使えそうな無償ツールは現状では少ないため、これからは、SBOMを管理していく仕組みを備えたOSSが期待されています。
そんな中、今回提案されたのが本記事で紹介するBomctl というSBOMを管理するためのOSSです。Secure Open Source Software Summit 2023で議論された課題に取り組むため、Security Tooling Working Groupによって開発されました。こちらはOpenSSFのプロジェクトになっています。
目次
Related Work
Bomctlよりも前に、先行的にSBOMやソフトウェアコンポーネント管理を行うOSSは既に存在しており、有名なOSSがGUACとDependency-Trackです。
また、個人開発では、sbom-managerというPython製のツールがシンプルなSBOM管理を行うことができます。このツールは以前紹介したsbomdiffの作成者である、anthonyharrisonさんによって個人開発されているOSSです。今回紹介するbomctlはsbom-managerというツールに結構似ていました。
Bomctlの解説
Bomctlの仕組み
bomctlの仕組みは、以下の図のように/home/user/.cache/bomctl
ディレクトリ配下にsqliteベースのdbファイルbomctl.db
を作成し、SBOMをそこへインポートする仕組みのようです。SBOMのコンテンツをdbファイルへエンコードする際は、protbomと呼ばれるOSSのパッケージを利用し、protocol buffers形式でエンコードを行います。したがって、dbファイル内では、SPDXやCyclonedxなどの形式に依存せず、SBOMファイルのデータを管理することができるようです。
またdbファイル内に格納されたSBOMは、SBOM形式やファイル形式を指定して、エクスポートすることが可能です。
bomctlが対応しているSBOMフォーマットとエンコーディングの組み合わせを以下の星取表にまとめました:
フォーマット | JSON対応 | XML対応 | 対応バージョン |
---|---|---|---|
SPDX | 〇 | × | 2.2, 2.3 |
CycloneDX | 〇 | 〇 | 1.0から1.5 |
将来性
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はなんでもよいです。
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です。
bomctl list
ID │ Version │ # Nodes
──────────────────────────────────────────────────┼──────────┼──────────
urn:uuid:addc873c-0d2b-43fc-93de-76549666b079 │ 1 │ 5
次にSBOMをエクスポートしてみます。
$ 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部分が補えそうです。