🛡️

OSSでSBOM管理ダッシュボードを作った - JVN連携・経産省ガイドライン自己チェック対応

に公開

はじめに

SBOMHub というOSSを作りました。

https://github.com/youichi-uda/sbomhub

一言で言うと: Syft/Trivy/cdxgenで生成したSBOMを放り込むと、脆弱性を追跡してくれるダッシュボード。

なぜ作ったか

困っていたこと

  1. SBOMは生成できるけど、どこに置く?

    • Syftでsbom.json作った。で、これどうする?
    • GitHubに置く?S3?ローカル?
  2. 複数プロジェクトの脆弱性を把握したい

    • 「うちの全システムにLog4jある?」って聞かれても即答できない
    • 各プロジェクトのpackage.jsonを目grepするのはつらい
  3. 経産省のSBOMガイドライン対応

    • 監査で「SBOMどうなってますか?」と聞かれる
    • 「Syftで生成してます」だけでは足りない

既存ツールの問題

Dependency-Trackは良いツールだが:

  • JVN非対応(日本固有の脆弱性情報が漏れる)
  • 日本語UI非対応
  • SPDXサポートがv4で削除された

ないなら作るか、と思った。

できること

30秒で試す

curl -fsSL https://raw.githubusercontent.com/youichi-uda/sbomhub/main/docker-compose.yml -o docker-compose.yml
docker compose up -d
# http://localhost:3000 を開く

主な機能

機能 説明
SBOM取り込み CycloneDX / SPDX JSON対応
脆弱性照合 NVD + JVN + IPA の三連携
EPSS 悪用可能性スコアで優先度付け
VEX 「この脆弱性はうちでは影響なし」を記録
ライセンス GPL禁止、みたいなポリシー設定
コンプライアンス 経産省ガイドライン対応状況の自己チェック
通知 Slack/Discordに脆弱性アラート
CI/CD GitHub Actionsでmainマージ時に自動アップロード

アーキテクチャ

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Next.js   │────▶│   Go API    │────▶│ PostgreSQL  │
│   :3000     │     │   :8080     │     │  + Redis    │
└─────────────┘     └─────────────┘     └─────────────┘

                    ┌──────┴──────┐
                    ▼             ▼
              ┌─────────┐   ┌─────────┐
              │   NVD   │   │   JVN   │
              │   API   │   │   API   │
              └─────────┘   └─────────┘

技術スタック

レイヤー 選定理由
Go (Echo) 並行処理が楽、シングルバイナリ配布
Next.js 16 (App Router) RSCでパフォーマンス向上
shadcn/ui コピペで使える、カスタマイズしやすい
PostgreSQL RLSでマルチテナント対応しやすい
Redis NVD APIレートリミット対策のキャッシュ

CLI: sbomhub-cli

SBOM生成ツール(Syft等)を持っている人向けのCLI。

# インストール
go install github.com/youichi-uda/sbomhub-cli/cmd/sbomhub@latest

# ログイン
sbomhub login --api-key YOUR_KEY --url https://sbomhub.app

# スキャン&アップロード(Syft/Trivy/cdxgenを自動検出)
sbomhub scan .

# CI/CD向け(Critical検出でexit 1)
sbomhub scan . --project my-app --fail-on critical

GitHub Actionsでの使い方:

- name: Install CLI
  run: curl -fsSL https://sbomhub.app/install.sh | sh

- name: Scan
  run: sbomhub scan . --project ${{ github.repository }} --fail-on critical
  env:
    SBOMHUB_API_KEY: ${{ secrets.SBOMHUB_API_KEY }}

MCP Server: AIと連携

MCPに対応しました。 Claude DesktopやCursorから自然言語でSBOM情報にアクセスできます。

設定

claude_desktop_config.json
{
  "mcpServers": {
    "sbomhub": {
      "command": "npx",
      "args": ["-y", "@sbomhub/mcp-server"],
      "env": {
        "SBOMHUB_API_KEY": "your-api-key"
      }
    }
  }
}

使用例

自分: 「CVE-2024-XXXX がどのプロジェクトに影響あるか教えて」

Claude: [sbomhub_search_cve を実行]
「以下の3プロジェクトで影響を受けています:
- project-a (lodash 4.17.20)
- project-b (lodash 4.17.19)
- project-c (lodash 4.17.18)

対応としては lodash を 4.17.21 以上にアップデートしてください。」

これは便利。

SaaS版

セルフホストが面倒な人向けにSaaS版も用意しました。

https://sbomhub.app

プラン 価格 プロジェクト ユーザー
Free 無料 2 1
Starter ¥2,500/月 5 3
Pro ¥8,000/月 無制限 10
Team ¥20,000/月 無制限 30

セルフホストはAGPL-3.0で完全無料。

他ツールとの比較

正直に書く。

SBOMHub Dependency-Track
SBOM管理
JVN対応 ×
日本語UI ×
SPDX × (v4で削除)
成熟度 △ 新しい ○ 実績あり
コミュニティ △ これから ○ 大きい

Dependency-Trackの方が成熟しているのは事実。ただ、日本市場向けの機能(JVN連携、経産省ガイドライン対応)が必要な場合はSBOMHubが選択肢になる。

実装の工夫

NVD APIのレートリミット対策

NVD APIは30秒あたり5リクエストの制限がある。1000コンポーネントのSBOMだと普通にやると数時間かかる。

対策:

  1. Redisでキャッシュ(TTL 24時間)
  2. バルクAPI活用(cpematch endpoint)
  3. 並行リクエスト数の制御

Row-Level Security (RLS) によるマルチテナント

PostgreSQLのRLSで「別組織のデータは絶対見えない」を実現。

CREATE POLICY tenant_isolation ON projects
  FOR ALL
  USING (tenant_id = current_setting('app.current_tenant')::uuid);

アプリ側でバグっても、DB層でブロックされる。

EPSSスコアの活用

CVSSスコアだけだと「Critical多すぎて全部対応無理」問題がある。

EPSS(Exploit Prediction Scoring System)は「今後30日で実際に悪用される確率」を示すので、現実的な優先度付けができる。

今後の予定

  • LDAP/OIDC認証(セルフホスト向け)
  • Microsoft Teams通知
  • 経産省レポート完全準拠フォーマット

おわりに

Star / Issue / PRお待ちしています。

https://github.com/youichi-uda/sbomhub

特に以下のフィードバックが欲しいです:

  • 「この機能がないと使えない」
  • 「このUIが分かりにくい」
  • 「経産省ガイドラインのこの項目に対応してほしい」

リンク

Discussion