CycloneDXファイルのライセンススキャン
- プラン: Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
使用中のライセンスを検出するために、ライセンスコンプライアンスは、依存関係スキャンジョブの実行と、それらのジョブによって生成されるCycloneDXソフトウェア部品表 (SBOM) の解析に依存しています。このスキャン方法は、SPDXリストで定義されているように、600種類以上の異なるライセンスタイプを解析および識別できます。サードパーティのスキャナーは、サポートされている言語向けのCycloneDXレポートアーティファクトを生成し、GitLab CycloneDXのプロパティ分類に従う限り、依存関係のリストを生成するために使用できます。他のライセンスを提供する機能は、エピック10861で追跡されています。
ライセンススキャン機能は、外部データベースに収集され、GitLabインスタンスと自動的に同期される、公開されているパッケージメタデータに依存しています。このデータベースは、米国でホストされているマルチリージョンのCloud Storageバケットです。スキャンはGitLabインスタンス内でのみ実行されます。コンテキスト情報 (例: プロジェクトの依存関係のリスト) は、外部サービスには送信されません。
設定
CycloneDXファイルのライセンススキャンを有効にするには:
- 依存関係スキャンテンプレートを使用する
- 依存関係スキャンを有効にし、その前提条件が満たされていることを確認します。
- GitLab Self-Managedでは、GitLabインスタンスの管理者エリアでパッケージレジストリメタデータを同期するように選択できます。このデータ同期を機能させるには、GitLabインスタンスからドメイン
storage.googleapis.comへの送信ネットワークトラフィックを許可する必要があります。ネットワーク接続が制限されているか、まったくない場合は、詳細なガイダンスについてはドキュメントセクションオフライン環境での実行を参照してください。
- または、該当するパッケージレジストリにはCI/CDコンポーネントを使用します。
サポートされている言語とパッケージマネージャー
ライセンススキャンは、以下の言語とパッケージマネージャーでサポートされています:
| 言語 | パッケージマネージャー | 依存関係スキャンテンプレート | 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 | はい | いいえ |
脚注:
- Goの標準的なライブラリ (
stdlibなど) はサポートされておらず、unknownのライセンスとして表示されます。これらに対するサポートは、イシュー480305で追跡されています。
サポートされているファイルとバージョンは、依存関係スキャンによってサポートされているものです。
データソース
サポートされているパッケージのライセンス情報は、以下のソースから取得されます。GitLabは元のデータに追加の処理を行います。これには、バリエーションを標準的なライセンス名にマッピングすることが含まれます。
ライセンス式
CycloneDXファイルのライセンススキャンは複合ライセンスをサポートしていません。この機能を追加することは、イシュー336878で追跡されています。
検出されたライセンスに基づいてマージリクエストをブロックする
ユーザーは、検出されたライセンスに基づいてマージリクエストに対する承認を、ライセンス承認ポリシーを構成することで要求できます。
オフライン環境での実行
- プラン: Ultimate
- 提供形態: GitLab Self-Managed
インターネットを介した外部リソースへのアクセスが制限、制約、または断続的である環境にあるインスタンスの場合、ライセンスのCycloneDXレポートを正常にスキャンするにはいくつかの調整が必要です。詳細については、オフラインのクイックスタートガイドを参照してください。
CycloneDXレポートをライセンス情報のソースとして使用する
ライセンススキャンは、利用可能な場合にCycloneDX JSON SBOMのlicensesフィールドを使用します。ライセンス情報が利用できない場合は、外部ライセンスデータベースからインポートされたライセンス情報が使用されます (現在の動作)。ライセンス情報は、有効なSPDX識別子またはライセンス名を使用して提供できます。ただし、SPDXライセンスExpressionを使用してライセンスを提供することはサポートされていません。ライセンスフィールドのフォーマットに関する詳細情報は、CycloneDX仕様で見つけることができます。
licensesフィールドを提供する互換性のあるCycloneDX SBOMジェネレーターは、CycloneDX Tool Centerで見つけることができます。
現在、SPDX識別子を提供するライセンスのみがサポートされています。SDPXライセンスを超えてこの機能を拡張することは、イシュー505677で追跡されています。
ライセンス情報のソースを構成する
どちらも利用可能な場合に、使用するライセンス情報のソースを選択します。
プロジェクトの優先するライセンス情報のソースを構成するには:
- 上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。
- セキュリティ > セキュリティ設定を選択します。
- ライセンス情報元セクションで、いずれかを選択します:
- SBOM (デフォルト) - CycloneDXレポートからライセンス情報を使用します。
- スキャナーは、
/gl-sbom-*.cdx.jsonにあるプロジェクト内のレポートからライセンス情報を読み取ります。 - ライセンスを上書きするには、このファイル内のライセンスデータを直接更新するしてください。
- スキャナーは、
- PMDB - 外部ライセンスデータベースからライセンス情報を使用します。
- SBOM (デフォルト) - 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未使用のライセンスデータを削除する
ライセンススキャンの変更 (GitLab 15.9でリリース) により、インスタンスでかなりの量の追加ディスク容量が必要になりました。このイシューは、GitLab 16.3でReduceパッケージmetadata table on-disk footprintエピックによって解決されました。しかし、GitLab 15.9から16.3の間にライセンススキャンを実行していたインスタンスの場合、不要なデータを削除したい場合があります。
不要なデータを削除するには:
package_metadata_synchronization機能フラグが現在有効になっているか、以前に有効になっていたかを確認し、そうであれば無効にします。Rails consoleを使用して次のようにのコマンドを実行します。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のライセンスが記録されます。このライセンスは、その後のパイプラインが実行され、その時点で別のライセンスルックアップが行われるまで表示されます。ルックアップによって依存関係のライセンスが変更されたことが確認された場合、この時点で新しいライセンスが表示されます。