CycloneDXファイルのライセンススキャン

  • GitLab SaaSのGitLab 15.9で導入さ れ、 license_scanning_sbom_scannerpackage_metadata_synchronizationという2つのフラグがあります。どちらのフラグもデフォルトでは無効になっており、この機能を使うには両方のフラグを有効にする必要があります。
  • GitLab 15.10 for GitLab SaaSで有効になりました。
  • GitLab 15.10でセルフマネージドGitLabに導入されました license_scanning_sbom_scannerpackage_metadata_synchronizationという2つのフラグがあり、この機能を使うにはどちらも有効にしておく必要があります。ライセンスデータベースを最初にインポートする際にパフォーマンスに負荷がかかるため、フラグはデフォルトでは無効になっています。パフォーマンスを改善するための作業は、イシュー397670で追跡されています。
  • GitLab 15.11でセルフマネージドGitLabで有効になりました。

フラグ:レガシーのライセンスコンプライアンスアナライザーはGitLab 15.9で非推奨となり、GitLab 16.3で削除されました。ライセンスコンプライアンスのためにGitLabを使い続けるには、CI/CDパイプラインからLicense Complianceテンプレートを削除し、Dependency Scanningテンプレートを追加してください。Dependency Scanningテンプレートは必要なライセンス情報を収集することができるようになったので、License Complianceジョブを別途実行する必要はなくなりました。License Compliance CI/CD テンプレートは、license_scanning_sbom_scanner およびpackage_metadata_synchronization フラグがインスタンスに対して有効になっていること、およびインスタンスがライセンススキャンの新しい方法をサポートするバージョンにアップグレードされていることを確認する前に削除しないでください。Dependency Scanner を大規模で迅速に使用するには、グループレベルでスキャン実行ポリ シーを設定し、グループ内のすべてのプロジェクトに対して SBOM ベースのライセンス スキャンを実施します。その後、CI/CD 設定からJobs/License-Scanning.gitlab-ci.yml テンプレートのインクルードを削除できます。レガシー ライセンス コンプライアンス機能を引き続き使用する場合は、LICENSE_MANAGEMENT_VERSION CI 変数を4に設定します。この変数は、プロジェクトグループ、またはインスタンスレベルで設定できます。この設定変更により、パイプラインでライセンス スキャン レポートのアーティ ファクトを生成するために、既存のバージョンの License Compliance を引き続き使用できるようになります。ただし、レガシー ライセンス スキャン サポートはコードベースから削除されるため、このレガシー アナライザーに切り替えると、License Compliance の他の機能が期待どおりに動作しなくなるため、この方法は推奨されません。さらに、このレガシー アナライザーのバグや脆弱性は修正されません。

使用中のライセンスを検出するために、License Complianceは依存関係スキャンCIジョブを実行し、これらのジョブによって生成されたCycloneDXソフトウェア部品表(SBOM) を分析します。他のサードパーティスキャナも、サポートされている言語の依存関係のリストを含むCycloneDXファイルを生成する限り、使用することができます。このスキャン方法では、SPDXリストで定義されている500種類以上のライセンスを解析し、識別することができます。SPDX リストにないライセンスは「不明」としてレポーターされます。ライセンス情報は、デュアルライセンスのパッケージや、複数の異なるライセンスが適用されるパッケージからも抽出できます。

ライセンススキャンの有効化

前提条件:

  • GitLabセルフマネージドの場合のみ、GitLabインスタンスのAdmin AreaでGitLab License Databaseとの同期を有効にします。GitLab SaaSの場合、このステップはすでに完了しています。
  • Dependency Scanningを有効にし、その前提条件が満たされていることを確認します。

.gitlab-ci.yml ファイルから、非推奨の行Jobs/License-Scanning.gitlab-ci.yml がある場合はそれを削除します。

サポートされる言語とパッケージマネージャ

ライセンススキャンは以下の言語とパッケージマネージャに対応しています:

対応言語パッケージマネージャ
.NETNuGet
C#
CConan
C++
GoGo
JavaGradle
Maven
JavaScriptとTypeScriptnpm
pnpm
ヤーン
PHPComposer
Pythonセットアップツール
ピップ
Pipenv
Rubyバンドラー
Scalasbt

サポートされているファイルとバージョンは、依存関係スキャンでサポートされているものです。

ライセンス表現

GitLabは複合ライセンスのサポートに制限があります。ライセンスコンプライアンスは複数のライセンスを読み込むことができますが、AND 演算子を用いて常にそれらを組み合わせて考えます。例えば、依存関係に2つのライセンスがあり、そのうちの1つが許可され、もう1つがプロジェクトポリシーによって拒否された場合、GitLabは複合ライセンスを_拒否された_ものとして評価します。他のライセンス式演算子(ORWITHなど)をサポートする機能は、このエピックで追跡されます。

検出されたライセンスに基づくマージリクエストのブロック

ユーザーは、ライセンス承認ポリシーを設定することにより、検出されたライセンスに基づいてマージリクエストの承認を要求できます。

オフライン環境での実行

インターネットを通じた外部リソースへのアクセスが制限されている、制限されている、または断続的な環境にあるセルフマネージドGitLabインスタンスでは、CycloneDXレポートのライセンススキャンを成功させるためにいくつかの調整が必要です。詳細については、オフラインクイックスタートガイドを参照してください。

トラブルシューティング

CycloneDXファイルがスキャンされず、結果が得られないようです。

CycloneDXファイルがCycloneDX JSON仕様に準拠していることを確認してください。この仕様では、エントリーの重複を許可していません。複数のSBOMファイルを含むプロジェクトでは、各SBOMファイルを個別のCIレポートアーティファクトとして報告するか、SBOMがCIパイプラインの一部としてマージされる場合に重複が削除されるようにする必要があります。

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

このイシューは、重複コンポーネントを生成するジョブ定義をオーバーライドして、gl-sbom-*.cdx.json レポートから重複コンポーネントを削除するjq を使用するように 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