软件供应链安全与 SBOM 清单

FreeGuideOnline 最新 2026-07-01

json { "SPDXID" : "SPDXRef-Package", "name" : "mylibrary", "versionInfo" : "1.0.0", "supplier" : "Person: John Doe", "downloadLocation" : "https://example.com/pkg", "licenseConcluded" : "MIT" }


### 3.2 CycloneDX(OWASP CycloneDX)

**CycloneDX** 是从 OWASP 社区生长起来的轻量级 SBOM 标准,专注于安全风险分析,支持硬件、软件、云服务 BOM。

- **格式**:主要为 JSON 和 XML。
- **特色**:原生支持漏洞风险评分(CVSS)、VEX(漏洞可利用性交换)信息、服务组件。
- **适合场景**:以漏洞管理为核心的安全团队;DevOps 管道中快速生成 SBOM 并送入扫描器。
- **示例结构**:
```xml
<bom xmlns="http://cyclonedx.org/schema/bom/1.4">
  <component type="library" name="openssl" version="1.1.1k">
    <hashes>
      <hash alg="SHA-256">abc123def...</hash>
    </hashes>
    <purl>pkg:generic/openssl@1.1.1k</purl>
  </component>
</bom>

3.3 SWID(Software Identification Tags)

SWID 是 ISO/IEC 19770-2 标准,主要被大型软件厂商用在商业现成软件(COTS)中,用于资产管理和授权跟踪,安全用途较少。它基于 XML,结构更偏向 IT 资产管理。

  • 优势:与大量企业资产管理工具兼容。
  • 局限:对开源依赖和嵌套关系的表达能力较弱,较少用于全面的供应链安全。

简要对比速查表:

特性 SPDX CycloneDX SWID
发起者 Linux 基金会 OWASP ISO
主要用途 许可证合规 漏洞与安全分析 IT 资产管理
依赖关系表达 优秀 优秀 一般
漏洞数据 通过外部链接 内嵌支持 不支持
易用性 较为复杂 轻量,DevOps 友好 厂商支持较好

建议:多数组织会同时使用 SPDX 和 CycloneDX,合规部门用 SPDX,安全团队用 CycloneDX,不必二选一。


第四章:如何生成和消费 SBOM?

4.1 内置生成工具

许多包管理工具和构建系统已内建 SBOM 生成能力:

  • npm (8.x+):使用 npm sbom --sbom-format=spdx 生成 SPDX 格式清单。
  • Maven:通过 spdx-maven-plugincyclonedx-maven-plugin 在构建过程中生成 SBOM。
  • Gradle:有第三方插件支持 CycloneDX。
  • pip:使用 cyclonedx-bom 工具扫描环境生成 CycloneDX 清单。
  • Dockerdocker sbom <image> 命令直接对容器镜像生成 SPDX 或 CycloneDX 格式的 BOM。

生成示例(Docker):

docker sbom --format spdx-json myimage:latest > sbom.spdx.json

4.2 开源 SBOM 生成工具

  • Syft(由 Anchore 开发):极速生成容器镜像、文件系统、二进制文件的软件清单,输出 CycloneDX/SPDX。非常推荐用于 CI 流水线。
  • Tern:专为容器镜像设计的检验工具,能逐层分析生成详细的依赖报告。
  • SPDX SBOM Generator:来自 SPDX 社区的命令行工具,适合多种语言项目。
  • OWASP Dependency-Track:不仅仅生成,更是一个完整的 SBOM 分析平台,可消费 SBOM 并持续监控漏洞。

4.3 在 CI/CD 中自动化

一个典型的自动 SBOM 生成与上传流程(以 GitHub Actions 为例):

- name: Generate SBOM
  uses: anchore/sbom-action@v0
  with:
    format: cyclonedx-json
    output-file: sbom.json

- name: Upload SBOM to Dependency-Track
  run: |
    curl -X POST "http://dtrack-api/api/v1/bom" \
      -H "Content-Type: multipart/form-data" \
      -F "autoCreate=true" \
      -F "projectName=${{ env.PROJECT }}" \
      -F "bom=@sbom.json"