SBOMツール紹介 ~ CycloneDX Generator編 ~

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【5/21開催】Azure OpenAI ServiceによるRAG実装ガイドを公開しました
生成AIを活用したユースケースで最も一番熱いと言われているRAGの実装ガイドを公開しました。そのガイドの紹介をおこなうイベントです!!
https://tech-lab.connpass.com/event/315703/

はじめに

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

CycloneDX Generatorとは

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

環境

OS、ツールバージョン
Ubuntu22.4
cdxgen10.3.5

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

言語/プラットフォームパッケージ形式推移的な依存関係証拠
Node.jsnpm-shrinkwrap.json, package-lock.json, pnpm-lock.yaml, yarn.lock, rush.js, bower.json, .min.js.min.jsを除くYes
Javamaven (pom.xml [1]), gradle (build.gradle, .kts), scala (sbt), bazelMaven が利用できないかエラーのために pom.xml が手動で解析される場合を除くYes
Androidapk, aab
PHPcomposer.lockYesYes
Pythonpyproject.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
Gobinary, go.mod, go.sum, Gopkg.lockbinaryを除くYes
RubyGemfile.lock, gemspecGemfile.lockのみ
Rustbinary, Cargo.toml, Cargo.lockCargo.lockのみ
.Net.csproj, .vbproj, .fsproj, packages.config, project.assets.json [3], packages.lock.json, .nupkg, paket.lock, binaryproject.assets.json,、packages.lock.json,、paket.lockのみ
Dartpubspec.lock, pubspec.yamlpubspec.lockのみ
Haskellcabal.project.freezeYes
Elixirmix.lockYes
C/C++/Objective C/C++11conan.lock, conanfile.txt, *.cmake, CMakeLists.txt, meson.build, codebase without package managers!conan.lockのみ。バージョン番号なしのcmakeのベストエフォートベース。Yes
ClojureClojure CLI (deps.edn), Leiningen (project.clj)clojure cli または leiningen コマンドがないためにファイルが手動で解析される場合を除く
SwiftPackage.resolved, Package.swift (swiftpm)Yes
Docker / oci imageサポートされているすべての言語。プラグインを含む Linux OS パッケージ [4]ロックファイルに基づくベストエフォート型Yes
GitHub Actions.github/workflows/*.ymlN/AYes
Linuxサポートされているすべての言語。プラグインを含む Linux OS パッケージ [5]ロックファイルに基づくベストエフォート型Yes
WindowsAll supported languages. OS packages with best effort [5]ロックファイルに基づくベストエフォート型Yes
Jenkins Plugins.hpi filesYes
Helm Charts.yamlN/A
Skaffold.yamlN/A
kustomization.yamlN/A
Tekton tasks.yamlN/A
Kubernetes.yamlN/A
Maven Cache$HOME/.m2/repository/**/*.jarN/A
SBT Cache$HOME/.ivy2/cache/**/*.jarN/A
Gradle Cache$HOME/caches/modules-2/files-2.1/**/*.jarN/A
Helm Index$HOME/.cache/helm/repository/**/*.yamlN/A
Docker composedocker-compose*.yml. イメージもスキャンされます。N/A
DockerfileDockerfile イメージもスキャンされます。N/A
ContainerfileContainerfile. イメージもスキャンされます。N/A
Bitbucket Pipelinesbitbucket-pipelines.yml イメージとpipesもスキャンされます。N/A
Google CloudBuild configurationcloudbuild.yamlN/A
OpenAPIopenapi*.json, openapi*.yamlN/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ツールの使い方について投稿していこうと思います!

関連記事

アバター画像
About なーが 16 Articles
前職は.NETやPythonを用いた業務アプリケーション、プロトタイプAPI開発に従事。2023年中途入社。とりあえずやってみて、苦しんで覚える系エンジニア。AWS認定3冠(SAA、MLS、DAS)

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

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

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


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる