CycloneDX 파일의 라이센스 스캐닝

Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated
  • GitLab 15.9에서 도입됨 GitLab SaaS를 위해 license_scanning_sbom_scannerpackage_metadata_synchronization이라는 두 개의 플래그와 함께. 두 플래그 모두 기본적으로 비활성화되어 있습니다.
  • GitLab 16.4에서 일반 사용 가능. 기능 플래그 license_scanning_sbom_scannerpackage_metadata_synchronization이 제거되었습니다.
  • 이전의 라이센스 준수 분석기(License-Scanning.gitlab-ci.yml)는 GitLab 17.0에서 제거됨.
  • GitLab 17.5에서는 기능 플래그 license_scanning_with_sbom_licenses 뒤에 CycloneDX 보고서 아티팩트를 라이센스 정보의 데이터 소스로 사용할 수 있는 기능을 도입했습니다. 기본적으로 비활성화되어 있습니다.

사용 중인 라이센스를 탐지하기 위해 라이센스 준수는
의존성 스캐닝 CI 작업을 실행하고,
이 작업에 의해 생성된 CycloneDX 소프트웨어 자재 목록(SBOM)을 분석합니다.
이 스캐닝 방법은 SPDX 목록에 정의된 600개 이상의 서로 다른 유형의 라이센스를 구문 분석하고 식별할 수 있습니다.
서드파티 스캐너를 사용하여 의존성 목록을 생성할 수 있으며,
이 경우 CycloneDX 보고서 아티팩트를 우리의 지원 언어 중 하나용으로 생성하고
GitLab CycloneDX 속성 분류를 따라야 합니다.
다른 라이센스를 제공할 수 있는 능력은 에픽 10861에서 추적됩니다.

note
라이센스 스캐닝 기능은 외부 데이터베이스에 수집된 공개 패키지 메타데이터에 의존하며
GitLab 인스턴스와 자동으로 동기화됩니다. 이 데이터베이스는 미국에 호스팅된 다지역 Google Cloud Storage 버킷입니다.
스캔은 오직 GitLab 인스턴스 내에서 실행됩니다.
맥락 정보(예: 프로젝트 의존성 목록)는 외부 서비스에 전송되지 않습니다.

구성

CycloneDX 파일의 라이센스 스캐닝을 활성화하려면:

  • 의존성 스캐닝 템플릿 사용
    • 의존성 스캐닝을 활성화하고 그 전제 조건이 충족되도록 합니다.
    • GitLab self-managed에서만, 관리자 영역에서 동기화할 패키지 레지스트리 메타데이터를 선택할 수 있습니다. 이 데이터 동기화가 작동하려면 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 아니오
Scala sbt 아니오
Rust cargo 아니오
  1. Go 표준 라이브러리인 `stdlib`는 지원되지 않으며 `unknown` 라이센스가 표시됩니다. 이에 대한 지원은 이슈 480305에서 추적됩니다.

지원되는 파일과 버전은
의존성 스캐닝에서 지원하는 것입니다.

데이터 소스

지원되는 패키지에 대한 라이센스 정보는 아래 소스에서 가져옵니다. GitLab은 원본 데이터에 대해 추가 처리를 수행하며, 여기에는 변형을 표준 라이센스 이름에 매핑하는 과정이 포함됩니다.

패키지 관리자 소스
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 보고서 아티팩트를 라이센스 정보 데이터 출처로 사용하는 기능은 GitLab 17.5에서 기능 플래그 license_scanning_with_sbom_licenses 뒤에 도입되었습니다.

기능 플래그 license_scanning_with_sbom_licenses가 활성화되면, 라이센스 스캐닝은 사용 가능한 경우 CycloneDX JSON SBOM의 licenses 필드를 사용합니다. 라이센스 정보가 사용 불가능할 경우, 외부 라이센스 데이터베이스에서 가져온 라이센스 정보가 사용됩니다(현재 동작).

라이센스 정보는 유효한 SPDX 식별자 또는 라이센스 이름을 사용하여 제공할 수 있습니다. 그러나 SPDX License Expression을 사용한 라이센스 제공은 지원되지 않습니다.

라이센스 필드 형식에 대한 더 많은 정보는 CycloneDX 명세에서 확인할 수 있습니다.

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

문제 해결

CycloneDX 파일이 스캔되지 않고 결과가 없는 경우

CycloneDX 파일이 CycloneDX JSON 명세를 준수하는지 확인하십시오. 이 명세는 중복 항목을 허용하지 않습니다. 여러 SBOM 파일을 포함하는 프로젝트는 각 SBOM 파일을 개별 CI 보고서 아티팩트로 보고하거나, CI 파이프라인의 일환으로 SBOM이 병합될 경우 중복 항목이 제거되었는지 확인해야 합니다.

CycloneDX JSON 명세에 대해 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 검증에 실패하면, 예를 들어 중복 구성 요소가 있는 경우:

검증 실패: 다음 인덱스 쌍에서 중복 항목 발견: "(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에 의해 해결되었습니다. 그러나 귀하의 인스턴스가 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 라이선스가 기록됩니다. 이 라이선스는 이후 파이프라인이 실행될 때까지 표시되며, 이 시점에 또 다른 라이선스 조회가 이루어집니다. 조회가 의존성의 라이선스가 변경되었음을 확인하면, 새 라이선스가 그때 표시됩니다.