🛡️
OSSでSBOM管理ダッシュボードを作った - JVN連携・経産省ガイドライン自己チェック対応
はじめに
SBOMHub というOSSを作りました。
一言で言うと: Syft/Trivy/cdxgenで生成したSBOMを放り込むと、脆弱性を追跡してくれるダッシュボード。
なぜ作ったか
困っていたこと
-
SBOMは生成できるけど、どこに置く?
- Syftでsbom.json作った。で、これどうする?
- GitHubに置く?S3?ローカル?
-
複数プロジェクトの脆弱性を把握したい
- 「うちの全システムにLog4jある?」って聞かれても即答できない
- 各プロジェクトのpackage.jsonを目grepするのはつらい
-
経産省の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版も用意しました。
| プラン | 価格 | プロジェクト | ユーザー |
|---|---|---|---|
| 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だと普通にやると数時間かかる。
対策:
- Redisでキャッシュ(TTL 24時間)
- バルクAPI活用(cpematch endpoint)
- 並行リクエスト数の制御
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お待ちしています。
特に以下のフィードバックが欲しいです:
- 「この機能がないと使えない」
- 「このUIが分かりにくい」
- 「経産省ガイドラインのこの項目に対応してほしい」
リンク
- GitHub: https://github.com/youichi-uda/sbomhub
- CLI: https://github.com/youichi-uda/sbomhub-cli
- SaaS版: https://sbomhub.app
- ライセンス: AGPL-3.0
Discussion