1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

bomctl : SBOM Management tool

Last updated at Posted at 2024-09-17

本記事は急いで書いたので、間違いが多いですし、書き足りない箇所が多いです。あまりアップデートできてません。
個人メモ:書き足す部分

  • 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がGUACDependency-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部分が補えそうです。

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?