はじめに こんにちは!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ツールの使い方について投稿していこうと思います! 関連記事 SBOM解説: SBOMのメリットと導入の流れ SBOMツールをカテゴリー分けしてみた SBOMの仕様:CycloneDX(CDX)・SPDX SBOMツール紹介 ~ Dependency-Track編 ~ SBOMツール紹介 ~ bom: The SBOM Multitool編 ~ SBOMツール紹介 ~ FOSSology編 ~ ご覧いただきありがとうございます! この投稿はお役に立ちましたか? 役に立った 役に立たなかった 0人がこの投稿は役に立ったと言っています。 The post SBOMツール紹介 ~ CycloneDX Generator編 ~ first appeared on SIOS Tech. Lab .