InfoGrab Docs

CycloneDX 파일의 라이선스 스캔

요약

사용 중인 라이선스를 감지하기 위해 라이선스 준수는 의존성 스캔 작업을 실행하고 해당 작업에서 생성된 CycloneDX SBOM(Software Bill of Materials)을 분석합니다. 라이선스 스캔 기능은 외부 데이터베이스에서 수집된 공개적으로 사용 가능한 패키지 메타데이터를 기반으로 하며 GitLab 인스턴스와 자동으로 동기화됩니다.

히스토리
  • GitLab 15.9에서 GitLab.com용으로 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에서 라이선스 정보의 데이터 소스로 CycloneDX 보고서 아티팩트 사용 지원 도입. 이 기능은 기능 플래그 license_scanning_with_sbom_licenses 뒤에 출시되었으며 기본적으로 비활성화.
  • GitLab 17.6에서 라이선스 정보의 데이터 소스로 CycloneDX 보고서 아티팩트 사용이 기본적으로 활성화. 필요한 경우 기능을 비활성화하기 위해 기능 플래그 license_scanning_with_sbom_licenses가 여전히 존재.
  • GitLab 17.8에서 기능 플래그 license_scanning_with_sbom_licenses 제거.

사용 중인 라이선스를 감지하기 위해 라이선스 준수는 의존성 스캔 작업을 실행하고 해당 작업에서 생성된 CycloneDX SBOM(Software Bill of Materials)을 분석합니다. 이 스캔 방법은 SPDX 목록에 정의된 600가지 이상의 다양한 라이선스 유형을 파싱하고 식별할 수 있습니다. 서드파티 스캐너를 사용하여 의존성 목록을 생성할 수 있습니다. 단, 지원 언어에 대한 CycloneDX 보고서 아티팩트를 생성하고 GitLab CycloneDX 속성 분류법을 따라야 합니다. 다른 라이선스를 제공하는 기능은 에픽 10861에서 추적됩니다.

Note

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

구성#

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

  • 의존성 스캔 템플릿 사용
  • 또는 해당 패키지 레지스트리에 대한 CI/CD 컴포넌트를 사용하세요.

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

히스토리
  • GitLab 17.9에서 Swift 지원 도입.
  • GitLab 18.10에서 Dart 지원 도입.

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

언어 패키지 관리자 의존성 스캔 템플릿 CI/CD 컴포넌트
.NET NuGet 아니요
C# 아니요
C Conan 아니요
C++ 아니요
Dart pub 아니요
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 아니요

각주:

  1. stdlib와 같은 Go 표준 라이브러리는 지원되지 않으며 unknown 라이선스로 표시됩니다. 이에 대한 지원은 이슈 480305에서 추적됩니다.

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

데이터 소스#

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

라이선스 표현식#

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

감지된 라이선스를 기반으로 머지 리퀘스트 차단#

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

오프라인 환경에서 실행#

인터넷을 통한 외부 리소스에 대한 접근이 제한적, 제한된 또는 불규칙한 환경의 인스턴스의 경우 CycloneDX 보고서를 라이선스에 대해 성공적으로 스캔하려면 몇 가지 조정이 필요합니다. 자세한 내용은 오프라인 빠른 시작 가이드를 참조하세요.

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

히스토리
  • GitLab 17.5에서 license_scanning_with_sbom_licenses라는 플래그와 함께 도입. 기본적으로 비활성화.
  • GitLab 17.6에서 GitLab.com, GitLab Self-Managed, GitLab Dedicated에서 활성화.
  • GitLab 17.8에서 일반 공개. 기능 플래그 license_scanning_with_sbom_licenses 제거.

라이선스 스캔은 사용 가능한 경우 CycloneDX JSON SBOM의 licenses 필드를 사용합니다. 라이선스 정보를 사용할 수 없는 경우 외부 라이선스 데이터베이스에서 가져온 라이선스 정보가 사용됩니다(현재 동작). 라이선스 정보는 유효한 SPDX 식별자 또는 라이선스 이름을 사용하여 제공할 수 있습니다. 그러나 SPDX 라이선스 표현식을 사용한 라이선스 제공은 지원되지 않습니다. 라이선스 필드 형식에 대한 자세한 내용은 CycloneDX 명세에서 확인할 수 있습니다.

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

현재는 SPDX 식별자를 제공하는 라이선스만 지원됩니다. SPDX 라이선스 이외로 이 기능을 확장하는 것은 이슈 505677에서 추적됩니다.

라이선스 정보 소스 구성#

히스토리

두 소스 모두 사용 가능한 경우 사용할 라이선스 정보 소스를 선택하세요.

프로젝트에 대한 기본 라이선스 정보 소스를 구성하려면:

  1. 상단 바에서 Search or go to를 선택하고 프로젝트를 찾으세요.
  2. 왼쪽 사이드바에서 Secure > Security configuration을 선택하세요.
  3. License information source 섹션에서 다음 중 하나를 선택하세요:
    • SBOM (기본값) - CycloneDX 보고서의 라이선스 정보를 사용합니다.
      • 스캐너는 /gl-sbom-*.cdx.json의 프로젝트에 있는 보고서에서 라이선스 정보를 읽습니다.
      • 라이선스를 덮어쓰려면 이 파일에서 직접 라이선스 데이터를 업데이트하세요.
    • PMDB - 외부 라이선스 데이터베이스의 라이선스 정보를 사용합니다.

트러블슈팅#

CycloneDX 파일이 스캔되지 않고 결과를 제공하지 않음#

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

다음과 같이 CycloneDX SBOM 파일을 CycloneDX JSON specification에 대해 유효성을 검사할 수 있습니다:

$ 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 유효성 검사에 실패하는 경우:

Validation failed: Found duplicates at the following index pairs: "(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에서 Reduce package metadata table on-disk footprint 에픽에 의해 해결되었습니다. 그러나 인스턴스가 GitLab 15.9와 16.3 사이에 라이선스 스캔을 실행하고 있었다면 불필요한 데이터를 제거할 수 있습니다.

불필요한 데이터를 제거하려면:

  1. package_metadata_synchronization 기능 플래그가 현재 또는 이전에 활성화되었는지 확인하고 활성화된 경우 비활성화하세요. Rails 콘솔을 사용하여 다음 명령을 실행하세요.

    Feature.enabled?(:package_metadata_synchronization) && Feature.disable(:package_metadata_synchronization)
    
  2. 데이터베이스에 Deprecated 데이터가 있는지 확인하세요:

    PackageMetadata::PackageVersionLicense.count
    PackageMetadata::PackageVersion.count
    
  3. 데이터베이스에 Deprecated 데이터가 있으면 순서대로 다음 명령을 실행하여 제거하세요:

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

CycloneDX SBOM에 대해 취약성 스캔 결과가 없음#

CycloneDX 파일이 라이선스에 대해 스캔되지만 취약성 스캔 결과가 없는 경우, 커스텀 또는 병합된 CycloneDX SBOM에 대해 취약성 스캔 결과가 없음을 참조하세요.

의존성 라이선스가 알 수 없음#

오픈 소스 라이선스 정보는 데이터베이스에 저장되어 프로젝트의 의존성에 대한 라이선스를 확인하는 데 사용됩니다. 라이선스 정보가 존재하지 않거나 데이터베이스에서 아직 사용 가능하지 않은 경우 의존성의 라이선스가 unknown으로 표시될 수 있습니다.

의존성의 라이선스 조회는 파이프라인 완료 시 이루어지므로 해당 시점에 이 데이터를 사용할 수 없었다면 unknown 라이선스가 기록됩니다. 이 라이선스는 후속 파이프라인이 실행되어 다시 라이선스 조회가 이루어질 때까지 표시됩니다. 조회를 통해 의존성의 라이선스가 변경된 것이 확인되면 이 시점에 새 라이선스가 표시됩니다.

CycloneDX 파일의 라이선스 스캔

Tier: Ultimate
Offering: GitLab Self-Managed
원문 보기
요약

사용 중인 라이선스를 감지하기 위해 라이선스 준수는 의존성 스캔 작업을 실행하고 해당 작업에서 생성된 CycloneDX SBOM(Software Bill of Materials)을 분석합니다. 라이선스 스캔 기능은 외부 데이터베이스에서 수집된 공개적으로 사용 가능한 패키지 메타데이터를 기반으로 하며 GitLab 인스턴스와 자동으로 동기화됩니다.

히스토리
  • GitLab 15.9에서 GitLab.com용으로 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에서 라이선스 정보의 데이터 소스로 CycloneDX 보고서 아티팩트 사용 지원 도입. 이 기능은 기능 플래그 license_scanning_with_sbom_licenses 뒤에 출시되었으며 기본적으로 비활성화.
  • GitLab 17.6에서 라이선스 정보의 데이터 소스로 CycloneDX 보고서 아티팩트 사용이 기본적으로 활성화. 필요한 경우 기능을 비활성화하기 위해 기능 플래그 license_scanning_with_sbom_licenses가 여전히 존재.
  • GitLab 17.8에서 기능 플래그 license_scanning_with_sbom_licenses 제거.

사용 중인 라이선스를 감지하기 위해 라이선스 준수는 의존성 스캔 작업을 실행하고 해당 작업에서 생성된 CycloneDX SBOM(Software Bill of Materials)을 분석합니다. 이 스캔 방법은 SPDX 목록에 정의된 600가지 이상의 다양한 라이선스 유형을 파싱하고 식별할 수 있습니다. 서드파티 스캐너를 사용하여 의존성 목록을 생성할 수 있습니다. 단, 지원 언어에 대한 CycloneDX 보고서 아티팩트를 생성하고 GitLab CycloneDX 속성 분류법을 따라야 합니다. 다른 라이선스를 제공하는 기능은 에픽 10861에서 추적됩니다.

Note

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

구성#

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

  • 의존성 스캔 템플릿 사용
  • 또는 해당 패키지 레지스트리에 대한 CI/CD 컴포넌트를 사용하세요.

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

히스토리
  • GitLab 17.9에서 Swift 지원 도입.
  • GitLab 18.10에서 Dart 지원 도입.

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

언어 패키지 관리자 의존성 스캔 템플릿 CI/CD 컴포넌트
.NET NuGet 아니요
C# 아니요
C Conan 아니요
C++ 아니요
Dart pub 아니요
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 아니요

각주:

  1. stdlib와 같은 Go 표준 라이브러리는 지원되지 않으며 unknown 라이선스로 표시됩니다. 이에 대한 지원은 이슈 480305에서 추적됩니다.

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

데이터 소스#

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

라이선스 표현식#

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

감지된 라이선스를 기반으로 머지 리퀘스트 차단#

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

오프라인 환경에서 실행#

인터넷을 통한 외부 리소스에 대한 접근이 제한적, 제한된 또는 불규칙한 환경의 인스턴스의 경우 CycloneDX 보고서를 라이선스에 대해 성공적으로 스캔하려면 몇 가지 조정이 필요합니다. 자세한 내용은 오프라인 빠른 시작 가이드를 참조하세요.

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

히스토리
  • GitLab 17.5에서 license_scanning_with_sbom_licenses라는 플래그와 함께 도입. 기본적으로 비활성화.
  • GitLab 17.6에서 GitLab.com, GitLab Self-Managed, GitLab Dedicated에서 활성화.
  • GitLab 17.8에서 일반 공개. 기능 플래그 license_scanning_with_sbom_licenses 제거.

라이선스 스캔은 사용 가능한 경우 CycloneDX JSON SBOM의 licenses 필드를 사용합니다. 라이선스 정보를 사용할 수 없는 경우 외부 라이선스 데이터베이스에서 가져온 라이선스 정보가 사용됩니다(현재 동작). 라이선스 정보는 유효한 SPDX 식별자 또는 라이선스 이름을 사용하여 제공할 수 있습니다. 그러나 SPDX 라이선스 표현식을 사용한 라이선스 제공은 지원되지 않습니다. 라이선스 필드 형식에 대한 자세한 내용은 CycloneDX 명세에서 확인할 수 있습니다.

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

현재는 SPDX 식별자를 제공하는 라이선스만 지원됩니다. SPDX 라이선스 이외로 이 기능을 확장하는 것은 이슈 505677에서 추적됩니다.

라이선스 정보 소스 구성#

히스토리

두 소스 모두 사용 가능한 경우 사용할 라이선스 정보 소스를 선택하세요.

프로젝트에 대한 기본 라이선스 정보 소스를 구성하려면:

  1. 상단 바에서 Search or go to를 선택하고 프로젝트를 찾으세요.
  2. 왼쪽 사이드바에서 Secure > Security configuration을 선택하세요.
  3. License information source 섹션에서 다음 중 하나를 선택하세요:
    • SBOM (기본값) - CycloneDX 보고서의 라이선스 정보를 사용합니다.
      • 스캐너는 /gl-sbom-*.cdx.json의 프로젝트에 있는 보고서에서 라이선스 정보를 읽습니다.
      • 라이선스를 덮어쓰려면 이 파일에서 직접 라이선스 데이터를 업데이트하세요.
    • PMDB - 외부 라이선스 데이터베이스의 라이선스 정보를 사용합니다.

트러블슈팅#

CycloneDX 파일이 스캔되지 않고 결과를 제공하지 않음#

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

다음과 같이 CycloneDX SBOM 파일을 CycloneDX JSON specification에 대해 유효성을 검사할 수 있습니다:

$ 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 유효성 검사에 실패하는 경우:

Validation failed: Found duplicates at the following index pairs: "(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에서 Reduce package metadata table on-disk footprint 에픽에 의해 해결되었습니다. 그러나 인스턴스가 GitLab 15.9와 16.3 사이에 라이선스 스캔을 실행하고 있었다면 불필요한 데이터를 제거할 수 있습니다.

불필요한 데이터를 제거하려면:

  1. package_metadata_synchronization 기능 플래그가 현재 또는 이전에 활성화되었는지 확인하고 활성화된 경우 비활성화하세요. Rails 콘솔을 사용하여 다음 명령을 실행하세요.

    Feature.enabled?(:package_metadata_synchronization) && Feature.disable(:package_metadata_synchronization)
    
  2. 데이터베이스에 Deprecated 데이터가 있는지 확인하세요:

    PackageMetadata::PackageVersionLicense.count
    PackageMetadata::PackageVersion.count
    
  3. 데이터베이스에 Deprecated 데이터가 있으면 순서대로 다음 명령을 실행하여 제거하세요:

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

CycloneDX SBOM에 대해 취약성 스캔 결과가 없음#

CycloneDX 파일이 라이선스에 대해 스캔되지만 취약성 스캔 결과가 없는 경우, 커스텀 또는 병합된 CycloneDX SBOM에 대해 취약성 스캔 결과가 없음을 참조하세요.

의존성 라이선스가 알 수 없음#

오픈 소스 라이선스 정보는 데이터베이스에 저장되어 프로젝트의 의존성에 대한 라이선스를 확인하는 데 사용됩니다. 라이선스 정보가 존재하지 않거나 데이터베이스에서 아직 사용 가능하지 않은 경우 의존성의 라이선스가 unknown으로 표시될 수 있습니다.

의존성의 라이선스 조회는 파이프라인 완료 시 이루어지므로 해당 시점에 이 데이터를 사용할 수 없었다면 unknown 라이선스가 기록됩니다. 이 라이선스는 후속 파이프라인이 실행되어 다시 라이선스 조회가 이루어질 때까지 표시됩니다. 조회를 통해 의존성의 라이선스가 변경된 것이 확인되면 이 시점에 새 라이선스가 표시됩니다.