13 个不稳定版本

0.9.1 2024年7月9日
0.8.4 2023年7月13日
0.7.2 2023年7月10日
0.6.0 2023年7月10日
0.3.1 2023年7月4日

#58 in 命令行工具

Download history 309/week @ 2024-05-04 361/week @ 2024-05-11 277/week @ 2024-05-18 280/week @ 2024-05-25 410/week @ 2024-06-01 406/week @ 2024-06-08 272/week @ 2024-06-15 336/week @ 2024-06-22 527/week @ 2024-06-29 738/week @ 2024-07-06 341/week @ 2024-07-13 367/week @ 2024-07-20 255/week @ 2024-07-27 177/week @ 2024-08-03 353/week @ 2024-08-10 411/week @ 2024-08-17

1,251 每月下载量

MIT 许可证

150KB
895

Workflow Status

cargo-sbom

此包提供了一个命令行工具,用于为 Cargo / Rust 工作空间创建软件物料清单(SBOM)。它支持 SPDX 和 CycloneDX 输出。

最新文档可在此处找到。

SBOM 或软件物料清单是一个行业标准术语,用于追踪和维护软件的供应链安全。

安装

cargo-sbom 可以通过 cargo 安装

cargo install cargo-sbom

通过 cargo-binstall

cargo binstall cargo-sbom

或直接从 Github Releases 下载

# make sure to adjust the target and version (you may also want to pin to a specific version)
curl -sSL https://github.com/psastras/sbom-rs/releases/download/cargo-sbom-latest/cargo-sbom-x86_64-unknown-linux-gnu -o cargo-sbom

使用方法

对于大多数情况,只需在 cargo 工作空间中运行 cd 并运行 cargo sbom

--帮助

Create software bill of materials (SBOM) for Rust

Usage: cargo sbom [OPTIONS]

Options:
      --cargo-package <CARGO_PACKAGE>
          The specific package (in a Cargo workspace) to generate an SBOM for. If not specified this is all packages in the workspace.
      --output-format <OUTPUT_FORMAT>
          The SBOM output format. [default: spdx_json_2_3] [possible values: spdx_json_2_3, cyclone_dx_json_1_4]
      --project-directory <PROJECT_DIRECTORY>
          The directory to the Cargo project. [default: .]
  -h, --help
          Print help
  -V, --version
          Print version

示例

为 Cargo 项目创建 SPDX SBOM

在 shell 中

$ cargo sbom
{
  "SPDXID": "SPDXRef-DOCUMENT",
  "creationInfo": {
    "created": "2023-07-04T12:38:15.211Z",
    "creators": [
      "Tool: cargo-sbom-v0.9.1"
    ]
  },
  "dataLicense": "CC0-1.0",
  "documentNamespace": "https://docs.rs/cargo_sbom/spdxdocs/cargo-sbom-0.9.1-9cae390a-4b46-457c-95b9-e59a5e62b57d",
  "files": [
    {
  <rest of output omitted>

在 Github Actions 中创建 CycloneDx SBOM

在 Github Actions 工作流中

jobs:
  sbom:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: psastras/sbom-rs/actions/install-cargo-sbom@cargo-sbom-latest
    - name: Run cargo-sbom
      run: cargo-sbom --output-format=cyclone_dx_json_1_4

检查依赖项与开源漏洞数据库 (OSV) 的兼容性

假设已安装 osv-scanner(见 https://osv.dev/

$ cargo-sbom > sbom.spdx.json
$ osv-scanner --sbom=sbom.spdx.json
Scanned sbom.json as SPDX SBOM and found 91 packages
╭─────────────────────────────────────┬──────┬───────────┬─────────┬─────────┬───────────╮
 OSV URL                             │ CVSS │ ECOSYSTEM │ PACKAGE │ VERSION │ SOURCE    │
├─────────────────────────────────────┼──────┼───────────┼─────────┼─────────┼───────────┤
 https://osv.dev/GHSA-wcg3-cvx6-7396 │ 6.2, │ crates.io │ time    │ 0.1.45  │ sbom.json │
 https://osv.dev/RUSTSEC-2020-0071   │ 6.2  │           │         │         │           │
╰─────────────────────────────────────┴──────┴───────────┴─────────┴─────────┴───────────╯

更多示例可以通过浏览 示例部分 获得。

支持的 SBOM 功能

SPDX

SPDX 字段
SPDXID 设置为 "SPDXRef-Document"
creationInfo.created 设置为当前时间
creationInfo.creators 设置为 "Tool: cargo-sbom-v(工具版本)"
dataLicense 设置为 "CC0-1.0"
documentNamespace 设置为 "https://spdx.org/spdxdocs/(crate-name)-(uuidv4)"
files 从 Cargo.toml 的目标名称解析
name 设置为项目文件夹名称
packages 设置为从 cargo-metadata 解析的依赖项
packages.SPDXID 写作 "SPDXRef-Package-(crate 名称)-(crate 版本)"
packages.description 从 Cargo.toml 的 "description" 字段读取
packages.downloadLocation cargo metadata 读取(通常为 "registry+https://github.com/rust-lang/crates.io-index")
packages.externalRefs 如果 packages.downloadLocation 是 crates.io,则写入为格式化的包 URL 字符串
packages.homepage 从 Cargo.toml 的 "homepage" 字段读取
packages.licenseConcluded 从 Cargo.toml 的 "license" 字段解析为符合 SPDX 标准的许可证标识符
packages.licenseDeclared 从 Cargo.toml 的 "license" 字段读取
packages.name 从 Cargo.toml 的 "name" 字段读取
relationships 设置为从 cargo-metadata 解析的依赖关系
relationships.relationshipType 设置为从 cargo-metadata 解析的依赖关系
relationships.spdxElementId 设置为从 cargo-metadata 解析的依赖关系源
relationships.relatedSpdxElement 设置为从 cargo-metadata 解析的依赖关系目标

CycloneDx

CycloneDx 字段
bomFormat 设置为 "CycloneDX"
serialNumber 设置为 "urn:uuid:(uuidv4)"
specVersion 设置为 1.4
version 设置为 1
metadata
metadata.component 从根工作空间解析
metadata.component.name 设置为根工作空间文件夹名称
metadata.component.type 设置为 "application"
metadata.component.components 设置为 cargo 工作空间包组件的每个组件
components 设置为从 cargo-metadata 解析的组件
components.author 从 Cargo.toml 的 "authors" 字段读取
components.bom-ref 设置为 "CycloneDxRef-Component-(crate-name)-(crate-version)"
components.description 从 Cargo.toml 的 "description" 字段读取
components.licenses 从 Cargo.toml 的 "license" 字段解析为符合 SPDX 标准的许可证标识符
components.name 从 Cargo.toml 的 "name" 字段读取
components.purl 如果下载位置是 crates.io,则写入为格式化的包 URL 字符串
components.type 从 cargo-metadata 集装箱类型读取
components.version 从 Cargo.toml 的 "version" 字段读取
dependencies 设置为从 cargo-metadata 解析的依赖关系
dependencies.ref 设置为源依赖引用 id 字符串
dependencies.dependsOnn 设置为目标依赖引用 id 字符串

许可证:MIT

依赖项

~8.5MB
~133K SLoC