こんばんは。
SPDXと言うものに触れる機会があったのですが、聞いた時点では食べ物かどうかも分からなかったので調べて軽くまとめました。
SPDXとは
The Software Package Data Exchangeの略語で、直訳すると ソフトウェア パッケージ データ交換 です。
ハァ?
公式ページなどを読んでみたところ、 ライセンスや依存関係について明確に識別するためのフォーマットの一つ と言うことが分かりました。 いかがでしたか?
先日、log4jの脆弱性が発見された際のクソデカ影響範囲はご存じかと思いますが「そもそもウチのプロジェクトは使ってるのか?」と言う調査を行った方もいらっしゃるかもしれません。
で、面倒な手間をかけていると対策にも時間がかかってしゃーないからいい感じに管理しようぜ、
という プロジェクト及びそのフォーマット を指してSPDXと呼ぶそうです。
公式が提供しているツール類を調べてみよう
何はともあれ 公式GitHub 。
全部で54リポジトリ(除く13Public Archive)ありました。
Starsが多く、今回自分が使う言語であるJavaに関係ありそうなプロジェクトであるtools-javaが見つかったので詳しく見てみます。
中身を見てみよう(tools-java)
GitHub
Maven Repository
Maven Central
※投稿日現在の最新バージョンは v1.1.6
GitHubの説明によると Spdx-Java-Library を使用した SPDX コマンド ライン ツール とのことでした。
まずはMaven Central > 1.1.6 > Dependenciesで依存関係を見てみましょう。
色々入っていますが、SPDX公式の依存関係だけ抜き出すとこれらを使っているみたいです(GitHubに見つからなかったものはMaven Repositoryのリンク)
- java-spdx-library
- spdx-rdf-store
- spdx-jackson-store
- xmlschema-core
- spdx-spreadsheet-store
- spdx-tagvalue-store
- json-schema-validator
tools-javaを使ってみよう
さて、依存関係を確認して満足したので次は実際に動かしてみましょう。
とりあえずGitHubからspdx-examplesと共にcloneします。
$ git clone git@github.com:spdx/tools-java.git
$ git clone git@github.com:spdx/spdx-examples.git
tools-javaはMavenプロジェクトなので、Mavenをインストールして(インストール方法は省略)依存関係を解消します。
$ mvn install
~~~~~~中略~~~~~~
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 59.855 s
[INFO] Finished at: 2023-04-21T00:01:16+09:00
[INFO] ------------------------------------------------------------------------
これでtarget/tools-java-1.1.6-jar-with-dependencies.jarが生成されましたので、実行してみましょう。
$ C:\pleiades\workspace\tools-java\target>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 509C-4ED5 です
C:\pleiades\workspace\tools-java\target のディレクトリ
2023/04/23 23:56 <DIR> .
2023/04/23 23:56 <DIR> ..
2023/04/23 14:55 <DIR> apidocs
2023/04/23 14:54 <DIR> classes
2023/04/23 14:55 <DIR> javadoc-bundle-options
2023/04/23 14:55 <DIR> maven-archiver
2023/04/23 14:54 <DIR> maven-status
2023/04/23 14:55 <DIR> site
2023/04/23 14:55 <DIR> surefire-reports
2023/04/23 14:54 <DIR> test-classes
2023/04/23 14:55 53,434,220 tools-java-1.1.6-jar-with-dependencies.jar
2023/04/23 14:55 416,143 tools-java-1.1.6-javadoc.jar
2023/04/23 14:55 120,155 tools-java-1.1.6-sources.jar
2023/04/23 14:55 169,196 tools-java-1.1.6.jar
4 個のファイル 54,139,714 バイト
10 個のディレクトリ 236,821,012,480 バイトの空き領域
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>java -jar tools-java-1.1.6-jar-with-dependencies.jar Convert ../testResources/SPDXTagExample-v2.3.spdx TagToRDF.rdf
WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>
C:\pleiades\workspace\tools-java\target>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 509C-4ED5 です
C:\pleiades\workspace\tools-java\target のディレクトリ
2023/04/24 00:00 <DIR> .
2023/04/24 00:00 <DIR> ..
2023/04/23 14:55 <DIR> apidocs
2023/04/23 14:54 <DIR> classes
2023/04/23 14:55 <DIR> javadoc-bundle-options
2023/04/23 14:55 <DIR> maven-archiver
2023/04/23 14:54 <DIR> maven-status
2023/04/23 14:55 <DIR> site
2023/04/23 14:55 <DIR> surefire-reports
2023/04/24 00:00 344,329 TagToRDF.rdf
2023/04/23 14:54 <DIR> test-classes
2023/04/23 14:55 53,434,220 tools-java-1.1.6-jar-with-dependencies.jar
2023/04/23 14:55 416,143 tools-java-1.1.6-javadoc.jar
2023/04/23 14:55 120,155 tools-java-1.1.6-sources.jar
2023/04/23 14:55 169,196 tools-java-1.1.6.jar
5 個のファイル 54,484,043 バイト
10 個のディレクトリ 236,820,484,096 バイトの空き領域
TagToRDF.rdfが無事作成されましたので比較してみましょう。
左が変換前、右が変換後です。
確かにTag:Value → RDF変換が行われているようですね。
README.mdを読む感じConvert以外にもVerifyやSPDXViewerも使えるようですので、時間がある時にまた試してみようと思います。
最後に
ソースコードからSBOMを起こす方法は存在しているのでしょうか。有識者の方からのお知らせをお待ちしております。
SPDX Liteを手作業で作成してツールでSPDX形式に加工、その後必要な部分を手作業で入力する感じ・・・?
と思ったらMicrosoftの提供するReview Toolkitやsbom-toolなるものもあるようです。こちらもいずれ時間作ってやってみようかと。
参考サイト
pdfは直リンクしか見つかりませんでした・・・。