SBOM软件物料清单生成指南,基于极狐GitLab的自动化产出

极狐GitLab
2026年11月10日
9080
分享:

SBOM软件物料清单生成指南,基于极狐GitLab的自动化产出

SBOM(软件物料清单)是一份记录软件所有组件、依赖及其来源与版本的结构化清单,是软件供应链安全治理、漏洞响应与交付合规的基础数据。

客户要求你交付一份 SBOM,或者采购方的安全问卷里白纸黑字写着"请提供软件物料清单",你打开仓库翻了一眼:三百多个依赖,横跨五门语言,锁文件格式各不相同。手写?不现实。这活儿本来就该由流水线自动干完——极狐GitLab 的依赖扫描已经把它做成了开箱即用的能力,一条 include 就能让每条流水线产出符合 CycloneDX 标准的 SBOM。

一、SBOM 为什么成了交付硬指标

SBOM 的价值不在"生成"这个动作,而在它成为下游一切治理工作的数据底座:漏洞比对、许可证审查、恶意软件包识别、交付物存档,全都建立在一份准确的组件清单之上。没有 SBOM,上面这些动作都只能靠人肉翻依赖表。

极狐GitLab 对此的官方定位很明确:依赖扫描的长期方向就是 SBOM。官方文档中写道,"将依赖扫描分析器在您的流水线中生成的 CycloneDX SBOM 产物与 GitLab 安全公告数据库进行比对扫描。这是新项目的推荐方法,也是极狐GitLab 中依赖扫描的长期方向。"

目前流水线里有四种依赖扫描方法,各有分工:

方法

状态

触发方式

适用场景

使用 SBOM 的依赖扫描

正式发布

流水线

新项目、以 SBOM 为先的工作流

持续依赖扫描

正式发布

安全公告数据库更新

无需重跑流水线即可捕获新披露漏洞

使用 Gemnasium 的依赖扫描

已弃用(17.9 起,计划 20.0 移除)

流水线

等待迁移的现有项目

分析依赖的行为(Libbehave)

实验

流水线

检测恶意软件包行为

一句话结论:新项目直接上 SBOM 方法,老项目尽早把 Gemnasium 迁移掉——按官方迁移指南的节奏,20.0 版本就要移除了。

二、一条 include 产出标准 SBOM

在 .gitlab-ci.yml 中加入官方 v2 模板,是开启 SBOM 自动产出的最小改动:

include:
  - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml

运行后流水线会产出两类产物:每个检测到的锁文件对应一份 CycloneDX SBOM,命名规则为 gl-sbom-<包类型>-<包管理器>.cdx.json,生成在锁文件同目录;外加一份汇总的依赖扫描报告 gl-dependency-scanning-report.json。SBOM 通过 cyclonedx 报告类型上传,作为作业产物保留。

几个写配置前值得知道的默认行为,全部出自官方 SBOM 依赖扫描文档:

  • 模板默认在合并请求流水线中运行(AST_ENABLE_MR_PIPELINES 默认为 "true"),不使用合并请求流水线的项目应显式设为 "false",避免流水线翻倍;

  • 扫描范围为根目录及其直接子目录(DS_MAX_DEPTH 默认 2),开发与测试依赖默认包含(DS_INCLUDE_DEV_DEPENDENCIES 默认 "true");

  • 找不到受支持的锁文件时作业照样成功并输出警告,可用 DS_SKIP_IF_NO_SUPPORTED_FILES: "true" 改为直接跳过;

  • SBOM API 使用默认 CI_JOB_TOKEN 认证,手动覆盖该变量会直接吃 403 Forbidden。

支持的语言覆盖面足够主流团队用:Java(Maven/Gradle)、Go、Python(pip/poetry/uv/pipenv)、JavaScript(npm/pnpm/yarn/Bun)、Ruby、PHP、Rust、C#(NuGet)等均在列,完整对照表见官方文档。

三、SBOM 生成之后,流水线之外还在持续工作

SBOM 产出的真正意义在于:它会被注册进极狐GitLab,成为持续漏洞扫描(CVS)的数据源。官方文档的表述是:持续依赖扫描"每当 GitLab 安全公告数据库更新时,持续重新扫描默认分支最近一次成功流水线中的 SBOM 组件,因此新披露的漏洞无需重新运行流水线即可显现。"

维度

流水线内扫描

持续漏洞扫描(CVS)

执行方式

CI/CD 流水线作业

后台作业(Sidekiq)

触发时机

代码提交/合并请求

安全公告发布后自动

产物

CycloneDX SBOM + 扫描报告

不生成报告产物,直接更新漏洞报告

公告范围

全量比对

仅考虑过去 14 天内发布的公告

两者的关系不是替代,而是接力:流水线负责生成最新清单,CVS 负责在不占流水线资源的前提下盯梢新公告。前提只有一条——默认分支上至少跑过一次依赖扫描,SBOM 注册过组件即可。

四、私有化部署的两个前置检查

私有化部署的团队在开启前有两件事必须核对,否则会出现"扫描跑完但漏洞识别不了"的尴尬:

  1. 软件包元数据同步:所有待扫描 PURL 类型的软件包元数据必须在实例中同步,路径为管理区域 > 设置 > 安全与合规 > 许可证合规,选择要同步的软件包仓库元数据,且需允许实例到 storage.googleapis.com 的出站流量,离线实例另有专门说明;

  2. Runner 执行器:需带 docker 或 kubernetes 执行器的 Runner,扫描作业跑在容器里。

另外注意容量层面的边界:SBOM 扫描 API 有"每个项目每条流水线每小时 50 次"的软性限流,超额扫描会被降级处理,monorepo 等高流量项目可能感知到扫描时长变长,此限流不可配置(详见安全与合规设置文档)。

FAQ

Q1:SBOM 产物是什么格式,能直接给到外部交付吗?

产物为 CycloneDX 格式的 JSON 文件(gl-sbom-*.cdx.json),符合 CycloneDX 规范 1.4、1.5 或 1.6 版本。第三方生成的 SBOM 只要符合相同规范及极狐GitLab 的 CycloneDX 属性分类法,也可以导入使用。

Q2:流水线跑完后没有生成 SBOM 文件,最常见的原因是什么?

项目根目录及其直接子目录(默认深度 2)内没有受支持的锁文件。检查锁文件是否提交、语言是否在支持列表内;若确实无需扫描,可设置 DS_SKIP_IF_NO_SUPPORTED_FILES: "true" 让作业显式跳过。

Q3:旧项目用 Gemnasium 的依赖扫描,需要立刻迁移吗?

建议尽快。该分析器在极狐GitLab 17.9 中已弃用,计划在 20.0 中移除,官方提供了迁移指南。新项目则无需犹豫,直接使用 Dependency-Scanning.v2.gitlab-ci.yml 模板。

结语

SBOM 不是又一个新概念,而是软件供应链治理的"资产负债表"。与其在交付前突击手拼一份清单,不如让流水线每次构建顺手产出来——一条 include 的成本,换漏洞响应、许可证审查、交付合规三条线的自动化底座。

想在自己的项目里跑通第一条 SBOM 流水线?免费试用极狐GitLab,或前往文档中心查看依赖扫描完整配置说明;拿不准私有化部署方案的,可以预约一次产品演示。