はじめに
こんにちは!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ツールの使い方について投稿していこうと思います!