CycloneDX 파일의 라이선스 스캔

Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

라이선스 컴플라이언스는 사용 중인 라이선스를 감지하기 위해 의존성 스캔 CI 작업을 실행하고 해당 작업에서 생성된 CycloneDX Software Bill of Materials (SBOM)를 분석에 의존합니다. 이 스캔 방법은 SPDX 목록에 정의된 600가지 이상의 라이선스를 구문 분석하고 식별할 수 있습니다. 지원되는 언어 중 하나로 CycloneDX 보고서 artifact를 생성하는 제3자 스캐너를 사용할 수 있으며 GitLab CycloneDX 속성 체계를 따르도록 해야 합니다. 다른 라이선스를 제공하는 능력은 epic 10861으로 추적됩니다.

참고: 라이선스 스캐닝 기능은 외부 데이터베이스에서 수집한 공개적으로 사용 가능한 패키지 메타데이터에 의존하며 GitLab 인스턴스와 자동으로 동기화됩니다. 이 데이터베이스는 미국 내에서 호스팅되는 멀티 리전 Google Cloud Storage 버킷입니다. 스캔은 GitLab 인스턴스 내에서 독점적으로 실행됩니다. 문맥 정보(예: 프로젝트 종속성 목록)는 외부 서비스로 전송되지 않습니다.

구성

CycloneDX 파일의 라이선스 스캔을 활성화하려면:

지원되는 언어 및 패키지 관리자

다음 언어 및 패키지 관리자에 대해 라이선스 스캐닝이 지원됩니다:

언어 패키지 관리자 의존성 스캔 템플릿 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 아니요
Scala sbt 아니요
Rust cargo 아니요
  1. `stdlib`와 같은 Go 표준 라이브러리는 지원되지 않으며 `unknown` 라이선스로 나타납니다. 이에 대한 지원은 [issue 480305](https://gitlab.com/gitlab-org/gitlab/-/issues/480305)으로 추적됩니다.

지원되는 파일 및 버전은 의존성 스캔에서 지원하는 파일과 버전과 동일합니다.

데이터 소스

지원되는 패키지의 라이선스 정보는 아래의 소스에서 얻습니다. GitLab은 원본 데이터에 대해 추가 처리를 수행하며, 이는 다양한 변형을 Canoncial 라이선스 이름으로 매핑하는 작업을 포함합니다.

패키지 관리자 소스
Cargo https://deps.dev/
Conan https://github.com/conan-io/conan-center-index
Go https://index.golang.org/
Maven https://storage.googleapis.com/maven-central
npm https://deps.dev/
NuGet https://api.nuget.org/v3/catalog0/index.json
Packagist https://packagist.org/packages/list.json
PyPI https://warehouse.pypa.io/api-reference/bigquery-datasets.html
Rubygems https://rubygems.org/versions

라이선스 표현식

CycloneDX 파일의 라이선스 스캐닝은 복합 라이선스를 지원하지 않습니다. 이 기능 추가는 이슈 336878에서 추적됩니다.

감지된 라이선스를 기반으로 병합 요청 차단

사용자는 라이선스 승인 정책을 구성하여 감지된 라이선스를 기반으로 병합 요청에 대한 승인을 요청할 수 있습니다.

오프라인 환경에서 실행

인터넷을 통해 외부 리소스에 대한 액세스가 제한되거나 일시적인 환경에서 자체 관리 GitLab 인스턴스에서는 일부 조정이 필요하여 CycloneDX 보고서를 성공적으로 스캔할 수 있습니다. 자세한 정보는 오프라인 빠른 시작 가이드를 참조하십시오.

CycloneDX 보고서를 라이선스 정보의 소스로 사용

CI 보고서 Artifact를 라이선스 정보 데이터의 소스로 사용하는 기능은 GitLab 17.5에서 license_scanning_with_sbom_licenses 기능 플래그 뒤에 도입되었습니다.

licenses_scanning_with_sbom_licenses 기능 플래그가 활성화되면 License Scanning은 사용 가능한 경우 CycloneDX JSON SBOM의 licenses 필드를 사용합니다. 라이선스 정보가 사용 불가능한 경우에는 외부 라이선스 데이터베이스에서 가져온 라이선스 정보가 사용됩니다(현재의 동작). 라이선스 정보는 유효한 SPDX 식별자 또는 라이선스 이름을 사용하여 제공할 수 있습니다. 그러나 SPDX 라이선스 표현을 사용하여 라이선스를 제공하는 것은 지원되지 않습니다. 라이선스 필드 형식에 대한 추가 정보는 CycloneDX 사양에서 찾을 수 있습니다.

라이선스 필드를 제공하는 호환되는 CycloneDX SBOM 생성기는 CycloneDX Tool Center에서 찾을 수 있습니다.

문제 해결

CycloneDX 파일이 스캔되지 않고 결과를 제공하지 않는 경우

CycloneDX 파일이 CycloneDX JSON 사양을 준수하는지 확인하십시오. 이 사양은 중복 항목을 허용하지 않습니다. 여러 SBOM 파일을 포함하는 프로젝트는 각 SBOM 파일을 개별 CI 보고서 Artifact로 보고해야 하거나 CI 파이프라인의 일부로 SBOM을 병합하는 경우 중복 항목이 제거되도록 해야 합니다.

다음과 같이 CycloneDX SBOM 파일을 다음과 같이 유효성을 검사할 수 있습니다.

$ 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 유효성 검사에 실패한 경우, 예를 들어 중복 구성 요소가 있는 경우 다음과 같이 CI 템플릿을 업데이트하여 중복 구성 요소를 제거할 수 있습니다. 예를 들어, 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

사용되지 않는 라이선스 데이터 제거

라이선스 스캔 변경(15.9에서 출시)으로 인해 인스턴스에 대규모의 추가 디스크 공간이 필요했습니다. 이 문제는 Reduce package metadata table on-disk footprint epic에서 GitLab 16.3로 해결되었습니다. 그러나 인스턴스가 GitLab 15.9에서 16.3 사이에 라이선스 스캔을 실행했을 경우 사용하지 않는 데이터를 제거하려 할 수 있습니다.

사용하지 않는 데이터를 제거하려면:

  1. package_metadata_synchronization 기능 플래그를 현재 활성화되어 있는지 또는 예전에 활성화되었었는지 확인하고, 활성화되어 있다면 비활성화하십시오. 다음 명령을 사용하여 Rails 콘솔에서 다음 명령을 실행합니다.

    Feature.enabled?(:package_metadata_synchronization) && Feature.disable(:package_metadata_synchronization)
    
  2. 데이터베이스에 폐기된 데이터가 있는지 확인하십시오.

    PackageMetadata::PackageVersionLicense.count
    PackageMetadata::PackageVersion.count
    
  3. 데이터베이스에 폐기된 데이터가 있는 경우 다음 명령을 사용하여 삭제하십시오.

    ActiveRecord::Base.connection.execute('SET statement_timeout TO 0')
    PackageMetadata::PackageVersionLicense.delete_all
    PackageMetadata::PackageVersion.delete_all
    

의존성 라이선스를 알 수 없음

오픈 소스 라이선스 정보는 데이터베이스에 저장되어 프로젝트의 종속성에 대한 라이선스를 해결하는 데 사용됩니다. 의존성의 라이선스는 데이터베이스에 해당 데이터가 아직 존재하지 않거나 이 데이터가 아직 사용 가능하지 않은 경우 unknown로 나타날 수 있습니다.

의존성의 라이선스 조회는 파이프라인 완료 시에 수행되며, 따라서 해당 데이터가 그 때 사용할 수 없었다면 unknown 라이선스가 기록됩니다. 이 라이선스는 이후 파이프라인이 실행될 때까지 유지됩니다. 그때 다른 라이선스 조회가 이뤄지면, 그에 따라 새로운 라이선스가 표시됩니다.