软件供应链安全与 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-plugin或cyclonedx-maven-plugin在构建过程中生成 SBOM。 - Gradle:有第三方插件支持 CycloneDX。
- pip:使用
cyclonedx-bom工具扫描环境生成 CycloneDX 清单。 - Docker:
docker 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"