CycloneDX 文件的许可证扫描
- Tier: 旗舰版
- Offering: JihuLab.com, 私有化部署
History
- 引入于极狐GitLab 15.9,使用名为 license_scanning_sbom_scanner 和 package_metadata_synchronization 的功能标志,默认禁用。
- 极狐GitLab 16.4 GA,功能标志 license_scanning_sbom_scanner 和 package_metadata_synchronization 被移除。
- 极狐GitLab 17.0 中,遗留的 License Compliance 分析器(License-Scanning.gitlab-ci.yml)被移除。
- 极狐GitLab 17.5 引入了通过功能标志 license_scanning_with_sbom_licenses(默认禁用)使用 CycloneDX 报告产物作为许可证信息数据源的能力。
- 极狐GitLab 17.6 默认启用通过 CycloneDX 报告产物作为许可证信息数据源的能力,功能标志 license_scanning_with_sbom_licenses 仍可用于禁用该功能。
- 极狐GitLab 17.8 中,功能标志 license_scanning_with_sbom_licenses 被移除。
要检测正在使用的许可证,许可证合规依赖于运行依赖扫描 CI 作业,并分析这些作业生成的 CycloneDX 软件物料清单 (SBOM)。这种扫描方法能够解析和识别超过 600 种不同类型的许可证,这些许可证在 SPDX 列表 中定义。第三方扫描器可以用于生成依赖项列表,只要它们生成 我们支持的语言 的 CycloneDX 报告产物,并遵循 极狐GitLab CycloneDX 属性分类。
许可证扫描功能依赖于公共可用的软件包元数据,这些元数据收集在一个外部数据库中,并自动与极狐GitLab 实例同步。此数据库是位于美国的多区域 Google 云存储桶。扫描完全在极狐GitLab 实例内执行。没有上下文信息(例如,项目依赖项列表)发送到外部服务。
配置
要启用 CycloneDX 文件的许可证扫描:
- 使用依赖扫描模板
- 启用依赖扫描,并确保满足其先决条件。
- 在极狐GitLab 私有化部署中,您可以在极狐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` 许可证。对这些的支持在 议题 480305 中进行跟踪。
支持的文件和版本是 依赖扫描 支持的那些。
数据来源
支持的软件包的许可证信息来自以下来源。极狐GitLab 对原始数据进行了额外处理,其中包括将变体映射到规范许可证名称。
许可证表达式
CycloneDX 文件的许可证扫描不支持组合许可证。
基于检测到的许可证阻止合并请求
用户可以通过配置 许可证批准策略 来要求基于检测到的许可证的合并请求批准。
在离线环境中运行
- Tier: 旗舰版
- Offering: 私有化部署
对于在环境中有限、受限或间歇性访问通过互联网的外部资源的实例,需进行一些调整才能成功扫描 CycloneDX 报告中的许可证。有关更多信息,请参阅离线 快速入门指南。
使用 CycloneDX 报告作为许可证信息来源
在极狐GitLab 17.5 中引入了使用 CI 报告产物作为许可证信息数据来源的能力,该功能在功能标志 license_scanning_with_sbom_licenses 后面,并在 17.6 中默认启用。在极狐GitLab 17.8 中,该功能标志 license_scanning_with_sbom_licenses 被移除。
许可证扫描使用 CycloneDX JSON SBOM 的 licenses 字段(如果可用)。如果许可证信息不可用,将使用从外部许可证数据库导入的许可证信息(当前行为)。许可证信息可以使用有效的 SPDX 标识符或许可证名称提供。但是,不支持使用 SPDX 许可证表达式提供许可证。
目前仅支持提供 SPDX 标识符的许可证。
故障排除
CycloneDX 文件未被扫描并且似乎没有提供结果
确保 CycloneDX 文件遵循 CycloneDX JSON 规范。此规范不允许重复条目。包含多个 SBOM 文件的项目应将每个 SBOM 文件报告为单独的 CI 报告产物,或者如果 SBOM 在 CI 流水线中合并,则应确保删除重复项。
您可以根据 CycloneDX JSON 规范 验证 CycloneDX SBOM 文件,如下所示:
shell$ 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 Validating JSON BOM... BOM validated successfully.
如果 JSON BOM 验证失败,例如,因为有重复的组件:
shellValidation failed: Found duplicates at the following index pairs: "(A, B), (C, D)" #/properties/components/uniqueItems
此问题可以通过更新 CI 模板来修复,使用 jq 从 gl-sbom-*.cdx.json 报告中删除重复的组件,方法是覆盖生成重复组件的作业定义。例如,以下从由 gemnasium-dependency_scanning 作业生成的 gl-sbom-gem-bundler.cdx.json 报告文件中删除重复组件:
yaml1include: 2 - template: Jobs/Dependency-Scanning.gitlab-ci.yml 3 4gemnasium-dependency_scanning: 5 after_script: 6 - apk update && apk add jq 7 - 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 中通过减少软件包元数据表的磁盘占用史诗解决。但如果您的实例在极狐GitLab 15.9 到 16.3 之间运行许可证扫描,您可能希望删除不需要的数据。
要删除不需要的数据:
-
检查 package_metadata_synchronization 功能标志当前是否启用,或者是否以前启用过,如果是,请禁用它。使用 Rails 控制台 执行以下命令。
rubyFeature.enabled?(:package_metadata_synchronization) && Feature.disable(:package_metadata_synchronization)
-
检查数据库中是否有弃用的数据:
rubyPackageMetadata::PackageVersionLicense.count PackageMetadata::PackageVersion.count
-
如果数据库中有弃用的数据,通过按顺序运行以下命令来删除它:
rubyActiveRecord::Base.connection.execute('SET statement_timeout TO 0') PackageMetadata::PackageVersionLicense.delete_all PackageMetadata::PackageVersion.delete_all
依赖项许可证未知
开源许可证信息存储在数据库中,并用于解析项目依赖项的许可证。如果许可证信息不存在或该数据尚未在数据库中可用,则依赖项的许可证可能显示为 unknown。
依赖项许可证的查找在流水线完成时进行,因此如果此数据在当时不可用,则记录 unknown 许可证。直到执行后续流水线时才会显示此许可证,此时会进行另一次许可证查找。如果查找确认依赖项的许可证已更改,则在此时显示新许可证。