CycloneDX 文件的许可证扫描
- 层级:Ultimate
- 提供:GitLab.com, GitLab Self-Managed, GitLab Dedicated
为了检测正在使用的许可证,许可证合规性依赖于运行 依赖项扫描 CI 作业, 并分析这些作业生成的 CycloneDX 软件物料清单 (SBOM)。 这种扫描方法能够解析和识别 SPDX 列表 中定义的 600 多种不同类型的许可证。 只要第三方扫描工具能够为我们支持的语言之一生成 CycloneDX 报告工件,并遵循 GitLab CycloneDX 属性分类法,就可以使用它们来生成依赖项列表。 提供其他许可证的能力在 epic 10861 中进行跟踪。
许可证扫描功能依赖于在外部数据库中收集并自动与 GitLab 实例同步的公开可用包元数据。 该数据库是一个托管在美国的多区域 Google Cloud Storage 存储桶。 扫描完全在 GitLab 实例内执行。 不会将任何上下文信息(例如项目依赖项列表)发送到外部服务。
配置
要启用 CycloneDX 文件的许可证扫描:
- 使用依赖项扫描模板
- 启用 依赖项扫描 并确保满足其先决条件。
- 在 GitLab Self-Managed 上,您可以在 GitLab 实例的管理员区域选择要同步的包注册表元数据。要使此数据同步正常工作,您必须允许从您的 GitLab 实例到域
storage.googleapis.com的出站网络流量。如果您有有限的或没有网络连接,请参阅文档部分在离线环境中运行以获取更多指导。
- 或使用适用于相应包注册表的 CI/CD 组件。
支持的语言和包管理器
许可证扫描支持以下语言和包管理器:
| 语言 | 包管理器 | 依赖项扫描模板 | CI/CD 组件 |
|---|---|---|---|
| .NET | NuGet | 是 | 否 |
| C# | 是 | 否 | |
| C | Conan | 是 | 否 |
| C++ | 是 | 否 | |
| Go1 | Go | 是 | 否 |
| Java | Gradle | 是 | 否 |
| Maven | 是 | 否 | |
| Android | 是 | 是 | |
| JavaScript 和 TypeScript | npm | 是 | 否 |
| pnpm | 是 | 否 | |
| yarn | 是 | 否 | |
| PHP | Composer | 是 | 否 |
| Python | setuptools | 是 | 否 |
| pip | 是 | 否 | |
| Pipenv | 是 | 否 | |
| Poetry | 是 | 否 | |
| Ruby | Bundler | 是 | 否 |
| Rust | cargo | 否 | 是 |
| Scala | sbt | 是 | 否 |
| Swift | sbt | 是 | 否 |
-
Go 标准库(如 `stdlib`)不受支持,并将显示为 `unknown` 许可证。 对这些的支持在 issue 480305 中进行跟踪。
支持的文件和版本是 依赖项扫描 支持的。
数据源
支持包的许可证信息从以下来源获取。GitLab 对原始数据进行额外处理,包括将变体映射到标准许可证名称。
许可证表达式
CycloneDX 文件的许可证扫描不支持 复合许可证。 添加此功能在 issue 336878 中进行跟踪。
基于检测到的许可证阻止合并请求
用户可以通过配置 许可证审批策略 来要求对基于检测到的许可证的合并请求进行审批。
在离线环境中运行
- 层级:Ultimate
- 提供:GitLab Self-Managed
对于在通过互联网对外部资源访问有限、受限或间歇性访问的环境中运行的实例,需要一些调整才能成功扫描 CycloneDX 报告以获取许可证信息。有关更多信息,请参阅离线快速入门指南。
使用 CycloneDX 报告作为许可证信息来源
使用 CI 报告工件作为许可证信息数据源的功能在 GitLab 17.5 中引入,位于功能标志 license_scanning_with_sbom_licenses 后面,并在 17.6 中默认启用。
在 GitLab 17.8 中,功能标志 license_scanning_with_sbom_licenses 已移除。
许可证扫描使用 CycloneDX JSON SBOM 中的 licenses 字段(如果可用)。如果许可证信息不可用,将使用从外部许可证数据库导入的许可证信息(当前行为)。 许可证信息可以使用有效的 SPDX 标识符或许可证名称提供。但是,不支持使用 SPDX 许可证表达式提供许可证。 有关许可证字段格式的更多信息,请参阅 CycloneDX 规范。
提供 licenses 字段的兼容 CycloneDX SBOM 生成器可以在 CycloneDX 工具中心 中找到。
目前仅支持提供 SPDX 标识符的许可证。将此功能扩展到 SPDX 许可证之外在 issue 505677 中进行跟踪。
配置许可证信息来源
引入 于 GitLab 18.3。
您可以在项目的安全配置中配置许可证信息的首选来源:
- 在左侧边栏,选择 搜索或转到 并找到您的项目。
- 选择 安全 > 安全配置。
- 在 许可证信息来源 部分,选择以下之一:
- SBOM(默认)- 使用来自 CycloneDX 报告的许可证信息
- PMDB - 使用来自外部许可证数据库的许可证信息
此设置决定了当同时存在 CycloneDX 许可证数据和外部许可证数据库信息时,GitLab 优先使用哪个来源。
故障排除
CycloneDX 文件未被扫描且似乎没有提供结果
确保 CycloneDX 文件符合 CycloneDX JSON 规范。该规范不允许重复条目。包含多个 SBOM 文件的项目应将每个 SBOM 文件作为单独的 CI 报告工件提交,或者确保在将 SBOM 合并作为 CI 管道的一部分时删除重复项。
您可以按照以下方式验证 CycloneDX SBOM 文件是否符合 CycloneDX JSON 规范:
$ docker run -it --rm -v "$PWD:/my-cyclonedx-sboms" -w /my-cyclonedx-sboms cyclonedx/cyclonedx-cli:latest cyclonedx validate --input-version v1_4 --input-file gl-sbom-all.cdx.json
验证 JSON BOM...
BOM 验证成功。如果 JSON BOM 验证失败,例如因为存在重复组件:
验证失败:在以下索引对中发现重复项:"(A, B), (C, D)"
#/properties/components/uniqueItems可以通过更新 CI 模板使用 jq 来移除 gl-sbom-*.cdx.json 报告中的重复组件来修复此问题,方法是覆盖生成重复组件的作业定义。例如,以下内容从 gemnasium-dependency_scanning 作业生成的 gl-sbom-gem-bundler.cdx.json 报告文件中移除重复组件:
include:
- template: Jobs/Dependency-Scanning.gitlab-ci.yml
gemnasium-dependency_scanning:
after_script:
- apk update && apk add jq
- jq '.components |= unique' gl-sbom-gem-bundler.cdx.json > tmp.json && mv tmp.json gl-sbom-gem-bundler.cdx.json删除未使用的许可证数据
许可证扫描更改(在 GitLab 15.9 中发布)需要在实例上有大量可用磁盘空间。这个问题在 GitLab 16.3 中通过 减少包元数据表磁盘占用空间 epic 得以解决。但如果您的实例在 GitLab 15.9 和 16.3 之间运行了许可证扫描,您可能需要删除不需要的数据。
要删除不需要的数据:
-
检查 package_metadata_synchronization 功能标志当前是否已启用,或者之前是否已启用,如果已启用,请禁用它。使用 Rails 控制台 执行以下命令。
Feature.enabled?(:package_metadata_synchronization) && Feature.disable(:package_metadata_synchronization) -
检查数据库中是否有已弃用的数据:
PackageMetadata::PackageVersionLicense.count PackageMetadata::PackageVersion.count -
如果数据库中有已弃用的数据,请按顺序运行以下命令将其删除:
ActiveRecord::Base.connection.execute('SET statement_timeout TO 0') PackageMetadata::PackageVersionLicense.delete_all PackageMetadata::PackageVersion.delete_all
依赖项许可证未知
开源许可证信息存储在数据库中,用于解析项目依赖项的许可证。如果许可证信息不存在或该数据尚未在数据库中可用,则依赖项的许可证可能显示为 unknown。
依赖项许可证的查找在管道完成时进行,因此如果当时此数据不可用,则会记录 unknown 许可证。此许可证会一直显示,直到执行后续管道,届时会进行另一次许可证查找。如果查找确认依赖项的许可证已更改,则会显示新的许可证。