andrew/sbom
GitHub: andrew/sbom
一个Ruby库,用于解析、生成和验证SPDX与CycloneDX格式的软件物料清单(SBOM),支持数据丰富、合并和CLI操作。
Stars: 4 | Forks: 0
# SBOM
一个用于解析、生成和验证 SPDX 和 CycloneDX 格式的软件物料清单(SBOM)的 Ruby 库。
## 安装说明
添加到您的 Gemfile:
```
gem 'sbom'
```
或直接安装:
```
gem install sbom
```
## 使用方法
### 解析 SBOM
```
require 'sbom'
# 从文件解析(自动检测格式)
sbom = Sbom.parse_file("example.spdx.json")
# 从字符串解析
sbom = Sbom.parse_string(content, sbom_type: :cyclonedx)
# 解析的数据以哈希形式返回
sbom.packages.each do |pkg|
puts "#{pkg[:name]} @ #{pkg[:version]}"
puts " License: #{pkg[:license_concluded]}"
end
sbom.relationships.each do |rel|
puts "#{rel[:source_id]} --[#{rel[:type]}]--> #{rel[:target_id]}"
end
```
### 生成 SBOM
```
# 生成 SPDX JSON
generator = Sbom::Generator.new(sbom_type: :spdx, format: :json)
generator.generate("MyProject", { packages: packages_data })
puts generator.output
# 生成 CycloneDX
generator = Sbom::Generator.new(sbom_type: :cyclonedx)
generator.generate("MyProject", sbom_data)
File.write("sbom.cdx.json", generator.output)
# 生成带漏洞的 CycloneDX
data = {
packages: packages_data,
vulnerabilities: [
{
id: "CVE-2024-1234",
source: { name: "OSV", url: "https://osv.dev" },
ratings: [{ severity: "high", score: 8.1, method: "CVSSv31" }],
description: "A critical vulnerability",
affects: [{ ref: "pkg:npm/lodash@4.17.20" }],
published: "2024-01-15T00:00:00Z",
updated: "2024-01-20T12:00:00Z"
}
]
}
generator = Sbom::Generator.new(sbom_type: :cyclonedx)
generator.generate("MyProject", data)
```
### 验证 SBOM
```
result = Sbom.validate_file("example.cdx.json")
if result.valid?
puts "#{result.format}: version #{result.version}"
else
puts "Invalid: #{result.errors.join(', ')}"
end
# 或在无效时抛出异常
Sbom::Validator.validate_file!("example.cdx.json")
```
### 丰富 SBOM 数据
使用 [ecosyste.ms](https://ecosyste.ms) 的元数据丰富软件包:
```
# 丰富整个 SBOM
sbom = Sbom.parse_file("example.cdx.json")
enriched = Sbom.enrich(sbom)
# 或一步解析并丰富
enriched = Sbom.enrich_file("example.cdx.json")
```
丰富操作会添加:描述、首页、下载位置、许可证、仓库 URL、注册表 URL、文档 URL、供应商信息和安全公告。
### 合并 SBOM
将多个 SBOM 合并为一个:
```
# 从文件合并(默认按 PURL 去重)
merged = Sbom.merge_files(["app1.cdx.json", "app2.spdx.json"])
# 合并 SBOM 对象
merged = Sbom.merge([sbom1, sbom2, sbom3])
# 保留所有包,不去重
merged = Sbom.merge([sbom1, sbom2], dedupe: :none)
```
合并支持跨格式操作。软件包默认通过 PURL 进行去重。关联关系和许可证也会去重。
### 构建软件包
Package 类提供了用于构建软件包数据的对象接口:
```
package = Sbom::Data::Package.new
package.name = "rails"
package.version = "7.0.0"
package.license_concluded = "MIT"
package.add_checksum("SHA256", "abc123...")
# Go 模块在 go.sum 中使用 base64 编码的哈希 - 先转换为十六进制:
require "base64"
go_hash = "h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4="
hex = Base64.decode64(go_hash.sub(/^h1:/, "")).unpack1("H*")
package.add_checksum("SHA256", hex)
# 生成 PURL
package.generate_purl(type: "gem")
# => "pkg:gem/rails@7.0.0"
# 或设置现有 PURL
package.purl = "pkg:npm/%40angular/core@16.0.0"
# 访问解析的 PURL 组件
package.purl_type # => "npm"
package.purl_namespace # => "@angular"
package.purl_name # => "core"
package.purl_version # => "16.0.0"
# 转换为哈希以生成
package.to_h
```
## CLI
```
# 解析并显示 SBOM
sbom parse example.spdx.json
sbom parse example.cdx.json --format json
# 根据模式验证 SBOM
sbom validate example.spdx.json
# 格式间转换
sbom convert example.spdx.json --type cyclonedx --output example.cdx.json
# 生成新 SBOM
sbom generate --name MyProject --type spdx --format json
# 文档命令
sbom document outline example.cdx.json
sbom document info example.spdx.json
sbom document query example.cdx.json --package rails
sbom document query example.cdx.json --license MIT
# 使用 ecosyste.ms 数据丰富 SBOM
sbom enrich example.cdx.json
sbom enrich example.cdx.json --output enriched.json
cat example.cdx.json | sbom enrich -
# 合并多个 SBOM
sbom merge app1.cdx.json app2.spdx.json --output merged.json
sbom merge app1.json app2.json --no-dedupe
sbom merge app1.json app2.json --type cyclonedx
```
## 支持的格式
**SPDX**(版本 2.2、2.3):
- Tag-Value (.spdx)
- JSON (.spdx.json)
- YAML (.spdx.yaml, .spdx.yml)
- XML (.spdx.xml)
- RDF (.spdx.rdf)
**CycloneDX**(版本 1.4、1.5、1.6、1.7):
- JSON (.cdx.json, .bom.json)
- XML (.cdx.xml, .bom.xml)
## 相关库
- [purl](https://github.com/andrew/purl) - 包 URL(PURL)解析和生成
- [vers](https://github.com/andrew/vers) - 版本范围解析和匹配
## 开发说明
检出仓库后,运行 `bin/setup` 安装依赖项。然后运行 `rake test` 执行测试。
该项目使用 git 子模块管理官方 SPDX 和 CycloneDX 规范:
```
git submodule update --init --recursive
```
## 贡献指南
欢迎在 GitHub 上提交问题报告和拉取请求:https://github.com/andrew/sbom
标签:CycloneDX, Gem, Google Gemini, GPT, Homebrew安装, JSON, Ruby, Ruby库, SBOM, SPDX, 依赖清单, 依赖管理, 包管理, 开源软件合规, 漏洞管理, 知识库, 硬件无关, 组件分析, 跌倒检测, 软件供应链安全, 软件合规性, 软件物料清单, 远程方法调用