正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。
ドキュメントに関する現在のご利用体験についてお聞かせください。アンケートにご協力ください。

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

  • プラン: Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

使用中のライセンスを検出するために、ライセンスコンプライアンスは、依存関係スキャンジョブの実行と、それらのジョブによって生成されるCycloneDXソフトウェア部品表(SBOM)の解析に依存しています。このスキャン方法は、SPDXリストで定義されているように、600種類以上の異なるライセンスタイプを解析および識別できます。サードパーティのスキャナーは、サポート言語向けのCycloneDXレポートアーティファクトを生成し、GitLab CycloneDXのプロパティ分類に従う限り、依存関係のリストを生成するために使用できます。他のライセンスを提供する機能は、エピック10861で追跡されています。

ライセンススキャン機能は、外部データベースで収集され、GitLabインスタンスと自動的に同期される公開パッケージメタデータに依存しています。このデータベースは、米国でホストされているマルチリージョンのGoogle Cloud Storageバケットです。スキャンはGitLabインスタンス内でのみ実行されます。コンテキスト情報(例: プロジェクトの依存関係のリスト)は、外部サービスには送信されません。

設定

CycloneDXファイルのライセンススキャンを有効にするには、次の手順を実行します:

  • 依存関係スキャンテンプレートを使用する
    • 依存関係スキャンを有効にし、その前提条件が満たされていることを確認します。
    • GitLab Self-Managedでは、GitLabインスタンスの管理者エリアでパッケージレジストリメタデータを同期するように選択できます。このデータ同期を機能させるには、お使いのGitLabインスタンスからstorage.googleapis.comおよびpmdb-dist-svc.runway.gitlab.netドメインへの送信ネットワークトラフィックを許可する必要があります。ネットワーク接続が制限されているか、まったくない場合の詳細なガイダンスについては、ドキュメントセクションのオフライン環境で実行するを参照してください。
  • または、該当するパッケージレジストリにはCI/CDコンポーネントを使用します。

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

ライセンススキャンは、以下の言語とパッケージマネージャーでサポートされています:

言語パッケージマネージャー依存関係スキャンテンプレートCI/CDコンポーネント
.NETNuGetはいいいえ
C#はいいいえ
CConanはいいいえ
C++はいいいえ
Dartpubはいいいえ
Go1Goはいいいえ
JavaGradleはいいいえ
Mavenはいいいえ
Androidはいはい
JavaScriptとTypeScriptnpmはいいいえ
pnpmはいいいえ
yarnはいいいえ
PHPComposerはいいいえ
Pythonsetuptoolsはいいいえ
pipはいいいえ
Pipenvはいいいえ
Poetryはいいいえ
RubyBundlerはいいいえ
Rustcargoいいえはい
Scalasbtはいいいえ
Swiftsbtはいいいえ

脚注:

  1. Goの標準ライブラリ(stdlibなど)はサポートされておらず、unknownのライセンスとして表示されます。これらに対するサポートは、イシュー480305で追跡されています。

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

データソース

サポートされているパッケージのライセンス情報は、以下のソースから取得されます。GitLabは元のデータに追加の処理を行います。これには、バリエーションを標準的なライセンス名にマッピングすることが含まれます。

ライセンス式

GitLabは、カスタムの非SPDXライセンス用のLicenseRef-[NAME]構文を含め、CycloneDX SBOMのexpressionフィールドからSPDXのライセンス表現を読み取ります。コンポーネントのSBOMエントリにexpressionが含まれている場合、GitLabは完全な表現を保存および評価します。CycloneDX SBOMにライセンス情報が含まれていない場合、GitLabはライセンス表現をサポートするPMDBライセンスデータとコンポーネントを照合します。

ライセンス表現はライセンス承認ポリシーでサポートされています。ポリシーがコンポーネントの表現の用語として表示されるライセンスをターゲットとする場合、ポリシーは完全な表現に対して正しく評価されます。

検出されたライセンスに基づいてマージリクエストをブロックする

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

オフライン環境で実行する

  • プラン: Ultimate
  • 提供形態: GitLab Self-Managed

インターネット経由で外部リソースへのアクセスが制限されている、または不安定な環境にあるインスタンスでは、ライセンスのCycloneDXレポートを正常にスキャンするためにいくつかの調整が必要です。詳細については、オフラインのクイックスタートガイドを参照してください。

CycloneDXレポートをライセンス情報のソースとして使用する

ライセンススキャンは、利用可能な場合にCycloneDX JSON SBOMのライセンスフィールドを使用します。ライセンス情報が利用できない場合は、外部ライセンスデータベースからインポートされたライセンス情報が使用されます。ライセンス情報は、有効なSPDX識別子、ライセンス名、またはSPDXライセンス表現を使用して提供できます。ライセンスフィールドのフォーマットに関する詳細情報は、CycloneDX仕様にあります。

ライセンスフィールドを提供する互換性のあるCycloneDX SBOMジェネレーターは、CycloneDX Tool Centerにあります。

ライセンス情報元を構成する

どちらも利用可能な場合に、使用するライセンス情報元を選択します。

プロジェクトの推奨されるライセンス情報元を構成するには:

  1. 上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。
  2. 左側のサイドバーで、セキュリティ > セキュリティ設定を選択します。
  3. ライセンス情報元セクションで、いずれかを選択します:
    • SBOM(デフォルト)- CycloneDXレポートからライセンス情報を使用します。
      • スキャナーは、/gl-sbom-*.cdx.jsonにあるプロジェクト内のレポートからライセンス情報を読み取ります。
      • ライセンスを上書きするには、このファイル内のライセンスデータを直接更新してください。
    • PMDB - 外部ライセンスデータベースからライセンス情報を使用します。

CycloneDXファイルのライセンススキャンを有効または無効にする

ライセンススキャンは、インジェストされたすべてのCycloneDX SBOMファイルに対して、デフォルトで実行されます。プロジェクトごとにライセンススキャンを無効にするには、セキュリティ設定ページから行えます。無効にすると、SBOMの取り込みからのライセンスは、依存関係リストにunknownと表示されます。

前提条件:

  • プロジェクトのメンテナー、オーナー、またはセキュリティマネージャーロールが必要です。

CycloneDXファイルのライセンススキャンを有効または無効にするには:

  1. 上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。
  2. 左側のサイドバーで、セキュリティ > セキュリティ設定を選択します。
  3. CycloneDXのライセンススキャンセクションで、切替をオンまたはオフにします。

トラブルシューティング

CycloneDXファイルがスキャンされておらず、結果を提供していないように見える

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

CycloneDX SBOMファイルをCycloneDX JSON specificationに対して次のように検証できます:

shell
$ 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が検証に失敗した場合(例えば、重複するコンポーネントがあるため):

shell
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レポートファイルから重複するコンポーネントを削除します:

yaml
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でオンディスクフットプリントのパッケージメタデータテーブルを削減するエピックによって解決されました。しかし、GitLab 15.9から16.3の間にライセンススキャンを実行していたインスタンスの場合、不要なデータを削除した方がよいでしょう。

不要なデータを削除するには:

  1. package_metadata_synchronization機能フラグが現在有効になっているか、以前に有効になっていたかを確認し、そうであれば無効にします。Railsコンソールを使用して次のコマンドを実行します。

    ruby
    Feature.enabled?(:package_metadata_synchronization) && Feature.disable(:package_metadata_synchronization)
  2. データベースに非推奨のデータがあるか確認します:

    ruby
    PackageMetadata::PackageVersionLicense.count
    PackageMetadata::PackageVersion.count
  3. データベースに非推奨のデータがある場合は、次のコマンドを順番に実行して削除します:

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

CycloneDX SBOMの脆弱性スキャンで結果が生成されない

CycloneDXファイルがライセンスに対してスキャンされているにもかかわらず、脆弱性スキャンで結果が生成されない場合は、カスタムまたはマージされたCycloneDX SBOMの脆弱性スキャンで結果が生成されないを参照してください。

依存ライセンスが不明

オープンソースのライセンス情報はデータベースに保存され、プロジェクトの依存関係のライセンスを解決するために使用されます。ライセンス情報が存在しない場合、またはそのデータがまだデータベースで利用できない場合、依存関係のライセンスはunknownと表示される場合があります。

依存関係のライセンスの検索はパイプライン完了時に行われるため、その時点でこのデータが利用できなかった場合、unknownライセンスが記録されます。このライセンスは、その後のパイプラインが実行され、その時点で別のライセンス検索が行われるまで表示されます。検索によって依存関係のライセンスが変更されたことが確認された場合、この時点で新しいライセンスが表示されます。