CycloneDX 파일의 라이선스 스캔

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

라이선스 컴플라이언스는 사용 중인 라이선스를 탐지하기 위해 의존성 스캐닝 CI 작업을 실행하고 해당 작업에 의해 생성된 CycloneDX 소프트웨어 부품 목록(SBOM)을 분석하는 데 의존합니다. 이 스캔 방법은 SPDX 목록에 정의된 500가지 이상의 다양한 유형의 라이선스를 구문 분석하고 식별할 수 있습니다. 제3자 스캐너를 사용하여 종속성 목록을 생성할 수 있지만 해당 스캐너는 지원되는 언어 중 하나에 대한 CycloneDX 보고서 아티팩트를 생성하고 GitLab CycloneDX 속성 분류법을 준수해야 합니다. 아직은 CI 보고서 아티팩트를 라이선스 정보의 원본으로 사용하거나 SPDX 목록에 없는 라이선스는 “알 수 없음”으로 보고할 수 없습니다. 다른 라이선스를 제공할 수 있는 능력은 epic 10861에서 추적됩니다.

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

구성

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

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

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

언어 패키지 관리자
.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

지원되는 파일 및 버전은 Dependency Scanning에서 지원되는 파일 및 버전과 동일합니다.

라이선스 표현

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

감지된 라이선스에 기반한 병합 요청 차단

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

오프라인 환경에서 실행하기

제한된, 제한적인 또는 간헐적인 인터넷 외부 리소스에 액세스할 수 있는 환경에서 자체 관리 GitLab 인스턴스를 실행하는 경우, CycloneDX 보고서를 성공적으로 스캔하려면 몇 가지 조정이 필요합니다. 자세한 정보는 오프라인 빠른 시작 가이드를 참조하세요.

문제 해결

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에서 릴리스됨)으로는 인스턴스에 추가적인 디스크 공간이 필요했습니다. 이 문제는 디스크 공간 풋프린트를 줄이기 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