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, 依赖清单, 依赖管理, 包管理, 开源软件合规, 漏洞管理, 知识库, 硬件无关, 组件分析, 跌倒检测, 软件供应链安全, 软件合规性, 软件物料清单, 远程方法调用