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