SBOMツール紹介 ~ CycloneDX Generator編 ~

はじめに

こんにちは!PS SLのなーがです。前回は「SBOMツール紹介 ~ bom: The SBOM Multitool編 ~」について書きましたが、今回はBOMツールの一つである「CycloneDX Generator」を使ってSBOMを作成する方法について解説します。SBOMについてよく分からないという方は、まずこちらの記事を読んでみてください。

CycloneDX Generatorとは

  • ほとんどのSBOMツールは単純なバーコードスキャナのようなもので、簡単なアプリケーションの場合深く検査することなくコンポーネントのリストだけを作成する
  • 言語またはパッケージマニフェストごとにSBOMを生成する従来の技術は、エンタープライズ環境では機能しないか、コンプライアンスと自動解析の両方に必要な信頼性が低い
  • CycloneDX Generatorはユーザーフレンドリーで正確かつ様々な多くの言語とパッケージマネージャーをサポートしたCycloneDX形式の部品表(BOM)を作成するCLIツール、ライブラリ、REPL、およびサーバーとして開発された

環境

OS、ツール バージョン
Ubuntu 22.4
cdxgen 10.3.5

サポートされている言語とパッケージ形式

言語/プラットフォーム パッケージ形式 推移的な依存関係 証拠
Node.js npm-shrinkwrap.json, package-lock.json, pnpm-lock.yaml, yarn.lock, rush.js, bower.json, .min.js .min.jsを除く Yes
Java maven (pom.xml [1]), gradle (build.gradle, .kts), scala (sbt), bazel Maven が利用できないかエラーのために pom.xml が手動で解析される場合を除く Yes
Android apk, aab
PHP composer.lock Yes Yes
Python pyproject.toml, setup.py, requirements.txt [2], Pipfile.lock, poetry.lock, pdm.lock, bdist_wheel, .whl, .egg-info 自動でpip install/freezeします。無効化されれている場合はPipfile.lockとpoetry.lockのみ Yes
Go binary, go.mod, go.sum, Gopkg.lock binaryを除く Yes
Ruby Gemfile.lock, gemspec Gemfile.lockのみ
Rust binary, Cargo.toml, Cargo.lock Cargo.lockのみ
.Net .csproj, .vbproj, .fsproj, packages.config, project.assets.json [3], packages.lock.json, .nupkg, paket.lock, binary project.assets.json,、packages.lock.json,、paket.lockのみ
Dart pubspec.lock, pubspec.yaml pubspec.lockのみ
Haskell cabal.project.freeze Yes
Elixir mix.lock Yes
C/C++/Objective C/C++11 conan.lock, conanfile.txt, *.cmake, CMakeLists.txt, meson.build, codebase without package managers! conan.lockのみ。バージョン番号なしのcmakeのベストエフォートベース。 Yes
Clojure Clojure CLI (deps.edn), Leiningen (project.clj) clojure cli または leiningen コマンドがないためにファイルが手動で解析される場合を除く
Swift Package.resolved, Package.swift (swiftpm) Yes
Docker / oci image サポートされているすべての言語。プラグインを含む Linux OS パッケージ [4] ロックファイルに基づくベストエフォート型 Yes
GitHub Actions .github/workflows/*.yml N/A Yes
Linux サポートされているすべての言語。プラグインを含む Linux OS パッケージ [5] ロックファイルに基づくベストエフォート型 Yes
Windows All supported languages. OS packages with best effort [5] ロックファイルに基づくベストエフォート型 Yes
Jenkins Plugins .hpi files Yes
Helm Charts .yaml N/A
Skaffold .yaml N/A
kustomization .yaml N/A
Tekton tasks .yaml N/A
Kubernetes .yaml N/A
Maven Cache $HOME/.m2/repository/**/*.jar N/A
SBT Cache $HOME/.ivy2/cache/**/*.jar N/A
Gradle Cache $HOME/caches/modules-2/files-2.1/**/*.jar N/A
Helm Index $HOME/.cache/helm/repository/**/*.yaml N/A
Docker compose docker-compose*.yml. イメージもスキャンされます。 N/A
Dockerfile Dockerfile イメージもスキャンされます。 N/A
Containerfile Containerfile. イメージもスキャンされます。 N/A
Bitbucket Pipelines bitbucket-pipelines.yml イメージとpipesもスキャンされます。 N/A
Google CloudBuild configuration cloudbuild.yaml N/A
OpenAPI openapi*.json, openapi*.yaml N/A

脚注:

  • [1] – マルチモジュール アプリケーションの場合、BOM ファイルには、パッケージ化された war ファイルまたは Ear ファイルに含まれていないコンポーネントが含まれる可能性があります。
  • [2] – 精度を向上させるためにピップフリーズが自動的に実行されます。仮想環境が必要です。
  • [3] – dotnet または nuget の復元を実行して project.assets.json を生成します。このファイルがないと、cdxgen には間接的な依存関係が含まれません。
  • [4] – プラグインに関するセクションを参照
  • [5] – osquery を利用しています。プラグインのセクションを参照してください

走査対象

JavaでWebアプリケーションを作成する際に使用されるTomcatを対象とします。

セットアップ

コンテナイメージを使用

SBOMを作成したいディレクトリでコンテナイメージを実行します。

docker run --rm -v /tmp:/tmp -v $(pwd):/app:rw -t ghcr.io/cyclonedx/cdxgen -r /app -o /app/bom.json

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.5",
  "serialNumber": "urn:uuid:78c22561-855e-4816-94e4-a0f8cfda4876",
  "version": 1,
  "metadata": {
    "timestamp": "2024-04-11T09:29:16.559Z",
    "tools": [
      {
        "vendor": "cyclonedx",
        "name": "cdxgen",
        "version": "10.3.5"
      }
    ],
    "authors": [
      {
        "name": "OWASP Foundation"
      }
    ],
    "component": {
      "group": "org.apache.tomcat",
    }
    ...
  }
}

インストール

npm install -g @cyclonedx/cdxgen

 Homebrewを使用している場合は、下記のコマンドでインストールできます。

brew install cdxgen

バージョンを確認します。

cdxgen -v

インストールされていることが確認できました。

SBOM作成

実際にSBOMを作成します。デフォルトでは「bom.json」として生成されます。

cdxgen

上記のコマンドでもSBOMを生成出来ますが、TomcatはJavaのプロジェクトなのでオプションで指定します。この場合、Maven、Gradle、または sbt を自動的に検出し、それに応じて bom をビルドしてくれるようです。また、出力ファイル名も指定します。

cdxgen -t java -o bom-tomcat.json
{
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "serialNumber": "urn:uuid:718baa3f-3d7c-4f12-be31-8609c4c80bed",
  "version": 1,
  "metadata": {
    "timestamp": "2024-04-12T02:56:34.800Z",
    "tools": [
      {
        "vendor": "cyclonedx",
        "name": "cdxgen",
        "version": "10.3.5"
      }
    ],
    "authors": [
      {
        "name": "OWASP Foundation"
      }
    ],
    "component": {
      "group": "org.apache.tomcat",
    }
    ...
  }
}

仕様バージョンの指定したい場合は、引数「–spec-version」を使用してバージョン番号を渡します。現バージョンのcdxgenで使用されるデフォルトの仕様は 1.5なので、ここではバージョン1.4を指定します。

cdxgen -o bom-1_4.json --spec-version 1.4
{
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "serialNumber": "urn:uuid:0398f42d-760c-4d60-b443-62fff1e0571c",
  "version": 1,
  "metadata": {
    "timestamp": "2024-04-12T05:06:15.027Z",
    "tools": [
      {
        "vendor": "cyclonedx",
        "name": "cdxgen",
        "version": "10.3.5"
      }
    ],
    "authors": [
      {
        "name": "OWASP Foundation"
      }
    ],
    "component": {
      "group": "org.apache.tomcat",
    }
    ...
  }
}   

その他のオプションについては、こちらを参照してください。

また、C または Python 用の SBOM を生成するには、Java >= 21 が必要なので、インストールしてから実行してください。

SBOMサーバー

引数「–server」を使用することで、サーバーモードで実行できます。デフォルトでは9090をListenしていますが、引数「–server-port」でポートを指定できます。

cdxgen --server --server-port 8888

コンテナイメージでは、以下のように指定します。

docker run --rm -v /tmp:/tmp -p 9090:9090 -v $(pwd):/app:rw -t ghcr.io/cyclonedx/cdxgen -r /app --server --server-host 0.0.0.0

その他のオプションについては、こちらを参照してください。

また、サーバーへのアクセスはCurlコマンドまたはPostman等のツールを使用してアクセスします。

稼働状況の確認

health エンドポイントを使用して、SBOM サーバーが稼働しているかどうかを確認します。

curl "http://127.0.0.1:8888/health"

ローカルリポジトリのスキャン

sbomエンドポイントにクエリパラメータでローカルリポジトリへの絶対パスを指定します。

curl "http://127.0.0.1:8888/sbom?path=XXXXX/tomcat&type=java"

Gitリポジトリのスキャン

sbomエンドポイントにクエリパラメータでリモートリポジトリへのパスとtypeを指定します。

curl "http://127.0.0.1:8888/sbom?url=https://github.com/apache/tomcat.git&type=java"

認証情報が必要な場合は、下記のように指定します。

curl "http://127.0.0.1:8888/sbom?url=https://<access_token>@github.com/XXXXX/YYYYY.git&..."
curl "http://127.0.0.1:8888/sbom?url=https://<username>:<password>@bitbucket.org/XXXXX/YYYYY.git&..."

また、引数を指定することで、POSTによるスキャンを行うこともできます。

curl -H "Content-Type: application/json" http://localhost:8888/sbom -XPOST -d $'{"url": "https://github.com/apache/tomcat.git", "type": "java"}'

Docker

リポジトリをCloneしてDockerによる実行もできます。

git clone https://github.com/CycloneDX/cdxgen.git
docker compose up

sbomエンドポイントにクエリパラメータでリモートリポジトリへのパスとtypeを指定して、SBOMを作成してみます。

その他

このツールはSBOM以外のCycloneDX形式のBOMを出力する機能がありますが、今回はSBOMを作成することが目的なので、他BOMの作成については省略します。興味のある方はこちらを参考にして作成してみてください。

さいごに

今回はSBOMツールの一つである「CycloneDX Generator」について解説しました。前回の調査した「bom: The SBOM Multitool」はまだ開発途中で機能も少なかったですが、今回のツールはCycloneDX コミュニティが作成しているだけあって多くの機能を備えているかつ活発に開発・リリースが行われていました。これからも様々なSBOMツールの使い方について投稿していこうと思います!

関連記事

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です