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이 제거되었습니다.
note
기존의 라이선스 컴플라이언스 분석기는 GitLab 15.9에서 사용 중지되었으며, GitLab 16.3에서 제거되었습니다. 라이선스 컴플라이언스를 계속 사용하려면 CI/CD 파이프라인에서 라이선스 컴플라이언스 템플릿을 제거하고, Dependency Scanning 템플릿을 추가하세요. 의존성 스캐닝 템플릿은 이제 필요한 라이선스 정보를 수집할 수 있으므로 별도의 라이선스 컴플라이언스 작업을 실행할 필요가 없습니다. 새로운 라이선스 스캔 방법을 지원하는 버전으로 업그레이드된 것을 확인하기 전에 라이선스 컴플라이언스 CI/CD 템플릿을 제거하지 마세요. 대규모로 의존성 스캐너를 빠르게 사용하려면 그룹 수준에서 스캔 실행 정책을 설정하여 그룹의 모든 프로젝트에 대해 SBOM 기반 라이선스 스캔을 강제로 적용할 수 있습니다. 그런 다음 CI/CD 구성에서 Jobs/License-Scanning.gitlab-ci.yml 템플릿을 제거할 수 있습니다. 기존의 라이선스 컴플라이언스 기능을 계속 사용하려면 LICENSE_MANAGEMENT_VERSION CI 변수를 4로 설정할 수 있습니다. 이 변수는 프로젝트, 그룹 또는 인스턴스 수준에서 설정할 수 있습니다.

라이선스 컴플라이언스는 사용 중인 라이선스를 감지하려면 의존성 스캐닝 CI 작업을 실행하고, 해당 작업에서 생성된 CycloneDX Software Bill of Materials (SBOM)을 분석합니다. 이 스캔 방법은 SPDX 디렉터리에 정의된 500종 이상의 다양한 라이선스를 구문 분석하고 식별할 수 있습니다. 지원되는 언어로 CycloneDX 속성 분류를 따르는 지원되는 언어에 대한 CycloneDX 보고서 아티팩트를 생성하는 서드파티 스캐너를 사용할 수 있습니다. CI 보고서 아티팩트를 라이선스 정보의 데이터 소스로 사용하거나, SPDX 디렉터리에 없는 라이선스는 “알 수 없음”으로 보고됩니다. 기타 라이선스를 제공하는 기능은 epic 10861에서 추적될 예정입니다.

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

구성

CycloneDX 파일의 라이선스 스캔을 활성화하려면 다음 작업을 수행하세요:

  • 의존성 스캐닝을 사용하고 전제 조건이 충족되었는지 확인합니다.
  • GitLab Self-managed인 경우, GitLab 인스턴스의 관리 영역에서 동기화할 패키지 레지스트리 메타데이터를 선택할 수 있습니다. 이 데이터 동기화가 작동하려면 GitLab 인스턴스에서 storage.googleapis.com 도메인으로의 아웃바운드 네트워크 트래픽을 허용해야 합니다. 네트워크 연결이 제한되거나 연결이 없는 경우 추가 지침을 위해 오프라인 환경에서 실행하는 문서 섹션을 참조하세요.

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

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

언어 패키지 관리자
.NET NuGet
C#
C Conan
C++
Go Go
Java Gradle
Maven
JavaScript 및 TypeScript npm
pnpm
yarn
PHP Composer
Python setuptools
pip
Pipenv
Poetry
Ruby Bundler
Scala sbt

의존성 스캐닝이 지원하는 파일 및 버전을 지원합니다.

라이선스 표현

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

감지된 라이선스를 기반으로 Merge Request 차단

사용자는 라이선스 승인 정책을 구성하여 Merge Request에 대한 승인을 요구할 수 있습니다.

오프라인 환경에서 실행

제한적인, 제한된 또는 일시적인 인터넷 리소스 액세스를 통해 환경에서 작동하는 Self-managed GitLab 인스턴스의 경우 일부 조정이 필요하며, 라이선스를 성공적으로 스캔하려면 CycloneDX 보고서를 위해 오프라인 빠른 시작 가이드를 참조하십시오.

문제 해결

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

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

다음과 같이 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 템플릿을 업데이트하여 gl-sbom-*.cdx.json 보고서에서 중복 컴포넌트를 제거하기 위해 jq를 사용하여 해결할 수 있습니다. 예를 들어, 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 사이에 라이선스 스캐닝을 실행했다면 시스템에서 불필요한 데이터를 제거하려고 할 수 있습니다.

불필요한 데이터를 제거하려면 다음 단계를 수행하세요:

  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