SBOMを作成してみる

はじめに

噂には聞いていたSBOMについて、実際には見たことが無かったので興味本位で環境構築してみようと思います。

SBOM(Software Bill of Materials)とは

ソフトウェアのコンポーネントや依存関係、ライセンスデータを一覧にしたものです。作成した製品等のソフトウェア・サプライチェーンについて把握しておくことで、資産管理やEOL、脆弱性対応などに活用します。
近頃はSBOMに関するサービスが提供されていたり、経済産業省などでも導入に関する資料が公開されています。

役割や利点については、こちらの記事などが分かりやすいかと思います。本記事では習うより触れてみたいという事で、実際作成して見てみます。

SBOMの作成

環境

OS:AlmaLinux9
※検証のため、ローカル環境に構築しています。

構成

Trivy
ファイルシステムやAWS、コンテナなどの脆弱性検知を行うツールです。SBOM作成にも対応しています。

SPDX
コンポーネント情報をSPDXフォーマットに沿って出力し、SBOM表を作成します。

Trivyのインストール

まずはTrivyのインストールしていきます。

$ cd /etc/yum.repos.d/

$ cat << EOF | sudo tee -a /etc/yum.repos.d/trivy.repo
[trivy]
name=Trivy repository
baseurl=https://aquasecurity.github.io/trivy-repo/rpm/releases/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://aquasecurity.github.io/trivy-repo/rpm/public.key
EOF
$ dnf -y install trivy

インストール後はTrivyのバージョンを確認します。

$ trivy version
SBOM表の作成

TrivyはSBOMの出力に対応しており、SPDXフォーマットでSBOM表を出力します。
今回はファイルシステム全体をスキャンし、JSONで保存してみます。

$ trivy fs / --format spdx-json --output test.json

作成されたJSONファイルを覗いてみると、フォーマットに沿ったコンポーネント情報が出力されています。

                :  
{
 "name": "XXXXXXX",

      "SPDXID": "SPDXRef-Package-XXXXXXXXX",
      "versionInfo": "XXXXXXXXX",
      "supplier": "Organization: AlmaLinux",
      "downloadLocation": "NONE",
      "filesAnalyzed": false,
      "checksums": [
        {
          "algorithm": "MD5",
          "checksumValue": "XXXXXXXXXXXXXXXXXXXXX"
        }
      ],
               :

               :
おまけ

おまけ

SBOMをJSONで出力できましたが、このままだといまいち掴みづらいかと思います。より依存関係を見やすくするため、JSON CrackというJSONをより視覚的に表示してくれるツールを導入してみます。

JSON Crackのインストール

こちらもローカル環境に構築します。まずは必要なファイルをリポジトリからクローンします。
※別途Node.jsやPnpmなどのインストールが必要な場合があります。

$ git clone https://github.com/AykutSarac/jsoncrack.com.git
Firewallの設定

現状の設定を確認し、8888(TCP)を追加します。

$ firewall-cmd --list-all
     :
ports: 1234/tcp ...
     :

$ firewall-cmd --add-port=8888/tcp --permanent

$ firewall-cmd --reload

再度Firewallのリストを出力し、8888/tcpが表示されていれば追加完了です。

$ firewall-cmd --list-all
     :
ports: 1234/tcp 8888/tcp ...
     :
JSON Crackサーバの立ち上げ

gitからクローンした際に、同時にDockerfileがインストールされています。今回はこのDokcerfileを利用してJSON Crackサーバを立ち上げます。
立ち上げ前後にdocker psなどを実行すると、コンテナイメージの起動が出来ているか確認が可能です。

$ cd jsoncrack.com
$ docker build -t jsoncrack --build-arg
$ docker compose build
$ docker compose up

compose upでプロセスが走り出したら、ブラウザで(http://localhost:3000)を開きます。以下のような画面が表示されます。


jsoncrack

「Go to Editor」をクリックし、作成したJSONファイルをアップすると、UMLのような見た目で依存関係を表示してくれます。

※無料版ではデータサイズの上限があります。