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コンポーネント |
|---|---|---|---|
| .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は元のデータに追加の処理を行います。これには、バリエーションを標準的なライセンス名にマッピングすることが含まれます。
ライセンス式
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にあります。
ライセンス情報元を構成する
どちらも利用可能な場合に、使用するライセンス情報元を選択します。
プロジェクトの推奨されるライセンス情報元を構成するには:
- 上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 左側のサイドバーで、セキュリティ > セキュリティ設定を選択します。
- ライセンス情報元セクションで、いずれかを選択します:
- SBOM(デフォルト)- CycloneDXレポートからライセンス情報を使用します。
- スキャナーは、
/gl-sbom-*.cdx.jsonにあるプロジェクト内のレポートからライセンス情報を読み取ります。 - ライセンスを上書きするには、このファイル内のライセンスデータを直接更新してください。
- スキャナーは、
- PMDB - 外部ライセンスデータベースからライセンス情報を使用します。
- SBOM(デフォルト)- CycloneDXレポートからライセンス情報を使用します。
CycloneDXファイルのライセンススキャンを有効または無効にする
ライセンススキャンは、インジェストされたすべてのCycloneDX SBOMファイルに対して、デフォルトで実行されます。プロジェクトごとにライセンススキャンを無効にするには、セキュリティ設定ページから行えます。無効にすると、SBOMの取り込みからのライセンスは、依存関係リストにunknownと表示されます。
前提条件:
- プロジェクトのメンテナー、オーナー、またはセキュリティマネージャーロールが必要です。
CycloneDXファイルのライセンススキャンを有効または無効にするには:
- 上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 左側のサイドバーで、セキュリティ > セキュリティ設定を選択します。
- 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でオンディスクフットプリントのパッケージメタデータテーブルを削減するエピックによって解決されました。しかし、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
CycloneDX SBOMの脆弱性スキャンで結果が生成されない
CycloneDXファイルがライセンスに対してスキャンされているにもかかわらず、脆弱性スキャンで結果が生成されない場合は、カスタムまたはマージされたCycloneDX SBOMの脆弱性スキャンで結果が生成されないを参照してください。
依存ライセンスが不明
オープンソースのライセンス情報はデータベースに保存され、プロジェクトの依存関係のライセンスを解決するために使用されます。ライセンス情報が存在しない場合、またはそのデータがまだデータベースで利用できない場合、依存関係のライセンスはunknownと表示される場合があります。
依存関係のライセンスの検索はパイプライン完了時に行われるため、その時点でこのデータが利用できなかった場合、unknownライセンスが記録されます。このライセンスは、その後のパイプラインが実行され、その時点で別のライセンス検索が行われるまで表示されます。検索によって依存関係のライセンスが変更されたことが確認された場合、この時点で新しいライセンスが表示されます。