📦

Visual StudioアプリでSBOMを自動生成する ― SPDX形式をバッチで簡単作成

に公開

1. はじめに

近年、ソフトウェア・サプライチェーンの透明性確保が求められ、SBOM(Software Bill of Materials) の導入が進んでいます。
特に、2021年のLog4j脆弱性以降、国内外で「自分たちの製品にどんなOSSやライブラリが入っているか」を把握する重要性が増しています。

しかし本記事は、そうした社会的な流れとは少し違い、**「ソフトウェアの構成をお客様に説明できる資料として」**という個人的なニーズからSBOMの生成を試してみた経験がスタートでした。

この記事では、Visual StudioアプリでSBOMをワンコマンド生成し、公開前に不要な情報を除いて安心して配布できる方法をご紹介します。


2. 前提条件

sbom-tool のインストール

SBOM を生成するには、Microsoft製のOSSツール「sbom-tool」 をインストールします。

インストール方法は2種類ありますが、本記事では「.NET Tool」での導入を推奨します。

.NET Tool としてインストール(推奨)

dotnet tool install --global Microsoft.Sbom.DotNetTool
  • Visual Studio をインストール済みであれば、通常は dotnet コマンドにすでにパスが通っています。
  • そのため、追加のパス設定不要で、すぐに sbom-tool コマンドが使える点がメリットです。

Winget でインストール(参考)

winget install Microsoft.SbomTool

こちらも簡単に導入できますが、どこにインストールされたかが分かりにくく、パスを設定するディレクトリが分かりませんでした
そのため、安定して利用できる .NET Tool 経由を推奨します。

動作確認

以下のコマンドでインストールした**「sbom-tool」**のバージョンが確認できます。

sbom-tool --version

.NET SDK

  • .NET 8 アプリの場合 → .NET 8 SDK をインストール済みであること
  • .NET Framework 4.7.2 アプリの場合 → Visual StudioでReleaseビルド済みであること

3. .NET 8(Blazorアプリ等)向け:公開用バッチ

以下のバッチファイルをプロジェクト直下に配置し、プロジェクトを発行した後、実行する場合の例です。
プログラムの発行先が異なる場合は調整してください。

%~dp0 はバッチファイルのあるディレクトリを指すので、絶対パスを使わずに相対的に動作します。

@echo off
setlocal
:: ============================================================================
:: Public Example: SBOM generation for .NET 8 publish output (Windows)
:: Requirements:
::   - Microsoft sbom-tool installed (dotnet tool install --global Microsoft.Sbom.DotNetTool)
::   - .NET 8 SDK installed (for dotnet publish)
:: ============================================================================

set "PACKAGE_NAME=SampleApp"
set "PACKAGE_SUPPLIER=Example Corp."
set /p PACKAGE_VERSION="Enter version (e.g., 1.2.3): "

set "BUILD_DROP_PATH=%~dp0bin\Release\net8.0\publish"
set "OUTPUT_PATH=%~dp0"

dotnet publish "%~dp0" -c Release -o "%BUILD_DROP_PATH%"

if not exist "%BUILD_DROP_PATH%" (
  echo Publish folder not found: "%BUILD_DROP_PATH%"
  exit /b 1
)

:: 不要ファイルを削除
:: - 開発用設定 (appsettings.Development.json) は製品パッケージには含めない
:: - デバッグシンボル (*.pdb, *.pgd) もインストーラには不要なので削除
del /f /q "%BUILD_DROP_PATH%\appsettings.Development.json" 2>nul
del /f /q "%BUILD_DROP_PATH%\*.pdb" 2>nul

sbom-tool generate ^
  -b "%BUILD_DROP_PATH%" ^
  -m "%OUTPUT_PATH%" ^
  -pn "%PACKAGE_NAME%" ^
  -pv "%PACKAGE_VERSION%" ^
  -ps "%PACKAGE_SUPPLIER%"

echo Done. SPDX JSON is in the _manifest folder under OUTPUT_PATH.
endlocal
pause

4. .NET Framework 4.7.2 向け:公開用バッチ

こちらは Release ビルド済みの成果物に対して SBOM を生成します。

@echo off
setlocal
:: ============================================================================
:: Public Example: SBOM generation for .NET Framework 4.7.2 app (Windows)
:: Requirements:
::   - Microsoft sbom-tool installed (dotnet tool install --global Microsoft.Sbom.DotNetTool)
::   - App already built in Release configuration
:: ============================================================================

set "PACKAGE_NAME=SampleWinForms472"
set "PACKAGE_SUPPLIER=Example Corp."
set /p PACKAGE_VERSION="Enter version (e.g., 1.2.3): "

set "APP_EXE_DIR=%~dp0src\App\bin\Release\"
set "OUTPUT_PATH=%~dp0"

if not exist "%APP_EXE_DIR%" (
  echo Build output not found: "%APP_EXE_DIR%"
  exit /b 1
)

:: 不要ファイルを削除
:: - デバッグシンボル (*.pdb) はインストーラに含めない
:: - XMLドキュメント (*.xml) も不要なので削除
del /f /q "%APP_EXE_DIR%\*.pdb" 2>nul
del /f /q "%APP_EXE_DIR%\*.xml" 2>nul

sbom-tool generate ^
  -b "%APP_EXE_DIR%" ^
  -m "%OUTPUT_PATH%" ^
  -pn "%PACKAGE_NAME%" ^
  -pv "%PACKAGE_VERSION%" ^
  -ps "%PACKAGE_SUPPLIER%"

echo Done. SPDX JSON is in the _manifest folder under OUTPUT_PATH.
endlocal
pause

5. 公開用チェックリスト

生成した SBOM を公開する場合は、以下を確認してください。

  • PACKAGE_NAME / PACKAGE_SUPPLIER公開向けの名称に変更
    • 特に PACKAGE_SUPPLIER は SPDX の creators.Organization に反映されます
    • 公開時は「Example Corp.」などダミー値にするのがおすすめです
  • 絶対パスや社内サーバ名が含まれていないか
  • _manifest フォルダに SPDX JSON が生成されていること

6. まとめ

  • sbom-tool を使えば、Visual Studioで作成したアプリでも簡単にSBOMを生成可能
  • バッチ化すれば、誰でもワンコマンドでSBOMを作れるようになり、再現性が高まる
  • 公開前には、PACKAGE_SUPPLIER を公開用に調整してから共有するのが安全

今後は CI/CD パイプラインに組み込み、毎リリースごとにSBOMを自動生成する運用に拡張するのが理想です。


参考リンク

Discussion