- 구성
- 지원되는 언어 및 패키지 관리자
- 데이터 소스
- 라이선스 표현식
- 감지된 라이선스를 기반으로 병합 요청 차단
- 오프라인 환경에서 실행
- CycloneDX 보고서를 라이선스 정보의 소스로 사용
- 문제 해결
CycloneDX 파일의 라이선스 스캔
- GitLab 15.9에 도입되었으며 GitLab SaaS에서 license_scanning_sbom_scanner
및
package_metadata_synchronization`이라는 두 개의 플래그가 기본으로 비활성화됨.- GitLab 16.4에서 일반 사용 가능. 기능 플래그
license_scanning_sbom_scanner
및package_metadata_synchronization
이 제거됨.- 레거시 License Compliance 분석기 (
License-Scanning.gitlab-ci.yml
)가 GitLab 17.0에서 삭제됨.- GitLab 17.5에서 특징 플래그
license_scanning_with_sbom_licenses
뒤의 라이선스 정보의 데이터 원천으로 CycloneDX 보고서 artifact를 사용하는 기능이 기본으로 비활성화됨.
라이선스 컴플라이언스는 사용 중인 라이선스를 감지하기 위해 의존성 스캔 CI 작업을 실행하고 해당 작업에서 생성된 CycloneDX Software Bill of Materials (SBOM)를 분석에 의존합니다. 이 스캔 방법은 SPDX 목록에 정의된 600가지 이상의 라이선스를 구문 분석하고 식별할 수 있습니다. 지원되는 언어 중 하나로 CycloneDX 보고서 artifact를 생성하는 제3자 스캐너를 사용할 수 있으며 GitLab CycloneDX 속성 체계를 따르도록 해야 합니다. 다른 라이선스를 제공하는 능력은 epic 10861으로 추적됩니다.
참고: 라이선스 스캐닝 기능은 외부 데이터베이스에서 수집한 공개적으로 사용 가능한 패키지 메타데이터에 의존하며 GitLab 인스턴스와 자동으로 동기화됩니다. 이 데이터베이스는 미국 내에서 호스팅되는 멀티 리전 Google Cloud Storage 버킷입니다. 스캔은 GitLab 인스턴스 내에서 독점적으로 실행됩니다. 문맥 정보(예: 프로젝트 종속성 목록)는 외부 서비스로 전송되지 않습니다.
구성
CycloneDX 파일의 라이선스 스캔을 활성화하려면:
- 의존성 스캔 템플릿 사용
- 의존성 스캔을 활성화하고 전제 조건이 충족되었는지 확인합니다.
- GitLab Self-managed에서만 GitLab 인스턴스의 Admin 영역에서 동기화할 패키지 레지스트리 메타데이터를 선택할 수 있습니다. 이 데이터 동기화가 작동하려면 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 | 아니요 | 예 |
-
`stdlib`와 같은 Go 표준 라이브러리는 지원되지 않으며 `unknown` 라이선스로 나타납니다. 이에 대한 지원은 [issue 480305](https://gitlab.com/gitlab-org/gitlab/-/issues/480305)으로 추적됩니다.
지원되는 파일 및 버전은 의존성 스캔에서 지원하는 파일과 버전과 동일합니다.
데이터 소스
지원되는 패키지의 라이선스 정보는 아래의 소스에서 얻습니다. GitLab은 원본 데이터에 대해 추가 처리를 수행하며, 이는 다양한 변형을 Canoncial 라이선스 이름으로 매핑하는 작업을 포함합니다.
라이선스 표현식
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 사이에 라이선스 스캔을 실행했을 경우 사용하지 않는 데이터를 제거하려 할 수 있습니다.
사용하지 않는 데이터를 제거하려면:
-
package_metadata_synchronization 기능 플래그를 현재 활성화되어 있는지 또는 예전에 활성화되었었는지 확인하고, 활성화되어 있다면 비활성화하십시오. 다음 명령을 사용하여 Rails 콘솔에서 다음 명령을 실행합니다.
Feature.enabled?(:package_metadata_synchronization) && Feature.disable(:package_metadata_synchronization)
-
데이터베이스에 폐기된 데이터가 있는지 확인하십시오.
PackageMetadata::PackageVersionLicense.count PackageMetadata::PackageVersion.count
-
데이터베이스에 폐기된 데이터가 있는 경우 다음 명령을 사용하여 삭제하십시오.
ActiveRecord::Base.connection.execute('SET statement_timeout TO 0') PackageMetadata::PackageVersionLicense.delete_all PackageMetadata::PackageVersion.delete_all
의존성 라이선스를 알 수 없음
오픈 소스 라이선스 정보는 데이터베이스에 저장되어 프로젝트의 종속성에 대한 라이선스를 해결하는 데 사용됩니다. 의존성의 라이선스는 데이터베이스에 해당 데이터가 아직 존재하지 않거나 이 데이터가 아직 사용 가능하지 않은 경우 unknown
로 나타날 수 있습니다.
의존성의 라이선스 조회는 파이프라인 완료 시에 수행되며, 따라서 해당 데이터가 그 때 사용할 수 없었다면 unknown
라이선스가 기록됩니다. 이 라이선스는 이후 파이프라인이 실행될 때까지 유지됩니다. 그때 다른 라이선스 조회가 이뤄지면, 그에 따라 새로운 라이선스가 표시됩니다.