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

SBOMを使用した依存関係スキャン

  • プラン: Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed
  • ステータス: 利用制限付き (GitLab.comおよびGitLab Self-Managed)

CycloneDXソフトウェア部品表(SBOM)を使用した依存関係スキャンでは、既知の脆弱性についてアプリケーションの依存関係が分析されます。すべての依存関係(推移的な依存関係を含む)がスキャンされます。

依存関係スキャンは、多くの場合、ソフトウェアコンポジション解析(SCA)の一部と見なされます。SCAには、コードで使用するアイテムの検査の側面が含まれる場合があります。これらのアイテムには通常、アプリケーションやシステムの依存関係が含まれており、ほとんどの場合、これらはユーザーが記述したアイテムからではなく外部ソースからインポートされます。

依存関係スキャンは、アプリケーションのライフサイクルの開発フェーズで実行できます。新しい依存関係スキャンアナライザーをCI/CDパイプラインで使用すると、プロジェクトの依存関係が検出され、CycloneDX SBOMレポートとして報告されます。セキュリティの検出結果は、ソースブランチとターゲットブランチの間で特定され、比較されます。コードの変更がコミットされる前に、アプリケーションに対するリスクにプロアクティブに対処できるように、検出結果とその重大度がマージリクエストにリストされます。報告されたSBOMコンポーネントのセキュリティアドバイザリーは、新しいセキュリティアドバイザリーが公開されると、CI/CDパイプラインとは無関係に、継続的脆弱性スキャンによっても識別されます。

GitLabは、これらのすべての依存関係タイプを確実に網羅するために、依存関係スキャンとコンテナスキャンの両方を提供しています。リスク領域をできるだけ広くカバーするために、すべてのセキュリティスキャナーを使用することをおすすめします。これらの機能の比較については、依存関係スキャンとコンテナスキャンの比較を参照してください。

このフィードバックイシューで、新しい依存関係スキャンアナライザーに関するご意見をお聞かせください。

依存関係スキャンを有効にする

依存関係スキャンを初めて使用する場合は、次の手順に従ってプロジェクトで有効にしてください。

  • すべてのGitLabインスタンスの前提条件:
    • プロジェクトのデベロッパー、メンテナー、またはオーナーロール。
    • サポートされているロックファイルまたは依存関係グラフ。または、サポートされている言語のフォールバックオプションとして、マニフェストファイルを使用できます。これは、リポジトリ内にあるか、CI/CDパイプラインで作成され、dependency-scanningジョブにアーティファクトとして渡されます。
    • セルフマネージドGitLab Runnerの場合は、dockerまたはkubernetes executorを使用するGitLab Runner。
    • GitLab.comでホストされているRunnerの場合、この設定はデフォルトで有効になっています。
  • Self-ManagedインスタンスのGitLabのみの追加前提条件:
    • スキャンされるすべてのPURLタイプのパッケージメタデータは、GitLabインスタンスで同期されている必要があります。

      GitLabインスタンスでこのデータが利用できない場合、依存関係スキャンで脆弱性を特定できません。

依存関係スキャンを有効にするには:

  1. 上部のバーで、検索または移動先を選択して、プロジェクトを見つけます。

  2. コード > リポジトリを選択します。

  3. .gitlab-ci.ymlファイルを選択します。

  4. 編集 > 単一のファイルを編集を選択します。

  5. v2依存関係スキャンCI/CDテンプレートを追加します:

    include:
      - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml
  6. 変更をコミットするを選択します。

ロックファイルまたは依存関係グラフを作成する

プロジェクトにサポートされているロックファイルまたはリポジトリにコミットされた依存関係グラフがない場合は、1つ指定する必要があります。

以下の例は、一般的な言語およびパッケージマネージャーでGitLabアナライザーによってサポートされているファイルを作成する方法を示しています。サポートされている言語とファイルの完全なリストも参照してください。

Go

プロジェクトがgo.modファイルのみを提供する場合でも、依存関係スキャンアナライザーはコンポーネントのリストを抽出できます。ただし、依存関係パス情報は利用できません。さらに、同じモジュールの複数のバージョンがある場合は、誤検出が発生する可能性があります。

コンポーネントの検出と機能のカバレッジを向上させるには、Goツールチェーンからgo mod graphコマンドを使用して生成されたgo.graphファイルを提供する必要があります。

以下の例.gitlab-ci.ymlは、Goプロジェクトで依存関係パスのサポートを使用してアナライザーを有効にする方法を示しています。依存関係グラフは、依存関係スキャンの実行前に、buildステージでジョブアーティファクトとして出力されます。

stages:
  - build
  - test

include:
  - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml
go:build:
  stage: build
  image: "golang:latest"
  script:
    - "go mod tidy"
    - "go build ./..."
    - "go mod graph > go.graph"
  artifacts:
    when: on_success
    access: developer
    paths: ["**/go.graph"]

Gradle

Gradleプロジェクトの場合は、次のいずれかの方法を使用して依存関係グラフを作成します。

  • Nebula Gradle Dependency Lockプラグイン
  • GradleのHtmlDependencyReportTask
依存関係ロックプラグイン

この方法では、直接的な依存関係に関する情報が提供されます。

Gradleプロジェクトでアナライザーを有効にするには、以下の手順に従います:

  1. build.gradleまたはbuild.gradle.ktsを編集して、gradle-dependency-lock-pluginを使用するか、初期化スクリプトを使用します。
  2. .gitlab-ci.ymlファイルを構成してdependencies.lockおよびdependencies.direct.lockアーティファクトを生成し、それらをdependency-scanningジョブに渡します。

次の例は、Gradleプロジェクトのアナライザーを構成する方法を示しています。

stages:
  - build
  - test

image: gradle:8.0-jdk11

include:
  - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml

generate nebula lockfile:
  # Running in the build stage ensures that the dependency-scanning job
  # receives the scannable artifacts.
  stage: build
  script:
    - |
      cat << EOF > nebula.gradle
      initscript {
          repositories {
            mavenCentral()
          }
          dependencies {
              classpath 'com.netflix.nebula:gradle-dependency-lock-plugin:12.7.1'
          }
      }

      allprojects {
          apply plugin: nebula.plugin.dependencylock.DependencyLockPlugin
      }
      EOF
      ./gradlew --init-script nebula.gradle -PdependencyLock.includeTransitives=true -PdependencyLock.lockFile=dependencies.lock generateLock saveLock
      ./gradlew --init-script nebula.gradle -PdependencyLock.includeTransitives=false -PdependencyLock.lockFile=dependencies.direct.lock generateLock saveLock
      # generateLock saves the lock file in the build/ directory of a project
      # and saveLock copies it into the root of a project. To avoid duplicates
      # and get an accurate location of the dependency, use find to remove the
      # lock files in the build/ directory only.
  after_script:
    - find . -path '*/build/dependencies*.lock' -print -delete
  # Collect all generated artifacts and pass them onto jobs in sequential stages.
  artifacts:
    paths:
      - '**/dependencies*.lock'
HtmlDependencyReportTask

この方法では、推移的および直接的な依存関係に関する情報が提供されます。

HtmlDependencyReportTaskは、Gradleプロジェクトの依存関係のリストを取得する別の方法です(gradleバージョン4~8でテスト済み)。依存関係スキャンでこの方法を使用できるようにするには、gradle htmlDependencyReportタスクの実行からのアーティファクトを使用可能にする必要があります。

stages:
  - build
  - test

# Define the image that contains Java and Gradle
image: gradle:8.0-jdk11

include:
  - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml

build:
  stage: build
  script:
    - gradle --init-script report.gradle htmlDependencyReport
  # The gradle task writes the dependency report as a javascript file under
  # build/reports/project/dependencies. Because the file has an un-standardized
  # name, the after_script finds and renames the file to
  # `gradle-html-dependency-report.js` copying it to the  same directory as
  # `build.gradle`
  after_script:
    - |
      reports_dir=build/reports/project/dependencies
      while IFS= read -r -d '' src; do
        dest="${src%%/$reports_dir/*}/gradle-html-dependency-report.js"
        cp $src $dest
      done < <(find . -type f -path "*/${reports_dir}/*.js" -not -path "*/${reports_dir}/js/*" -print0)
  # Pass html report artifact to subsequent dependency scanning stage.
  artifacts:
    paths:
      - "**/gradle-html-dependency-report.js"

上記のコマンドはreport.gradleファイルを使用し、--init-scriptを介して提供するか、そのコンテンツをbuild.gradleに直接追加できます:

allprojects {
    apply plugin: 'project-report'
}

依存関係レポートは、一部の構成の依存関係がFAILED解決されない可能性があることを示している場合があります。この場合、依存関係スキャンは警告をログに記録しますが、ジョブは失敗しません。解決の失敗が報告された場合にパイプラインを失敗させたい場合は、上記のbuildの例に次の追加手順を追加します。

while IFS= read -r -d '' file; do
  grep --quiet -E '"resolvable":\s*"FAILED' $file && echo "Dependency report has dependencies with FAILED resolution status" && exit 1
done < <(find . -type f -path "*/gradle-html-dependency-report.js -print0)

Maven

次の例.gitlab-ci.ymlは、Mavenプロジェクトでアナライザーを有効にする方法を示しています。依存関係グラフは、依存関係スキャンの実行前に、buildステージでジョブアーティファクトとして出力されます。

要件: maven-dependency-pluginは、少なくともバージョン3.7.0以上を使用してください。

stages:
  - build
  - test

image: maven:3.9.9-eclipse-temurin-21

include:
  - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml

build:
  # Running in the build stage ensures that the dependency-scanning job
  # receives the maven.graph.json artifacts.
  stage: build
  script:
    - mvn install
    - mvn org.apache.maven.plugins:maven-dependency-plugin:3.8.1:tree -DoutputType=json -DoutputFile=maven.graph.json
  # Collect all maven.graph.json artifacts and pass them onto jobs
  # in sequential stages.
  artifacts:
    paths:
      - "**/*.jar"
      - "**/maven.graph.json"

pip

プロジェクトがpip-compileコマンドラインツールによって生成されたrequirements.txtロックファイルを提供する場合、依存関係スキャンアナライザーは、コンポーネントのリストと依存関係グラフ情報を抽出でき、依存関係パス機能をサポートします。

または、プロジェクトは、pipdeptree --jsonコマンドラインユーティリティによって生成されたpipdeptree.json依存関係グラフエクスポートを提供できます。

以下の例.gitlab-ci.ymlは、pipプロジェクトで依存関係パスのサポートを使用してアナライザーを有効にする方法を示しています。buildステージは、依存関係スキャンの実行前に、ジョブアーティファクトとして依存関係グラフを出力します。

stages:
  - build
  - test

include:
  - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml

build:
  stage: build
  image: "python:latest"
  script:
    - "pip install -r requirements.txt"
    - "pip install pipdeptree"
    # Run pipdeptree to get project's dependencies and exclude pipdeptree itself to avoid false positives
    - "pipdeptree -e pipdeptree --json > pipdeptree.json"
  artifacts:
    when: on_success
    access: developer
    paths: ["**/pipdeptree.json"]

既知の問題により、pipdeptreeオプションの依存関係を親パッケージの依存関係としてマークしません。その結果、依存関係スキャンは、それらを推移的な依存関係としてではなく、プロジェクトの直接的な依存関係としてマークします。

Pipenv

プロジェクトがPipfile.lockファイルのみを提供する場合でも、依存関係スキャンアナライザーはコンポーネントのリストを抽出できます。ただし、依存関係パス情報は利用できません。

機能カバレッジを向上させるには、pipenv graphコマンドによって生成されたpipenv.graph.jsonファイルを提供する必要があります。

次の例.gitlab-ci.ymlは、Pipenvプロジェクトで依存関係パスのサポートを使用してアナライザーを有効にする方法を示しています。buildステージは、依存関係スキャンの実行前に、ジョブアーティファクトとして依存関係グラフを出力します。

stages:
  - build
  - test

include:
  - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml

build:
  stage: build
  image: "python:3.12"
  script:
    - "pip install pipenv"
    - "pipenv install"
    - "pipenv graph --json-tree > pipenv.graph.json"
  artifacts:
    when: on_success
    access: developer
    paths: ["**/pipenv.graph.json"]

sbt

sbtプロジェクトでアナライザーを有効にするには以下の手順に従います:

次の例.gitlab-ci.ymlは、sbtプロジェクトで依存関係パスのサポートを使用してアナライザーを有効にする方法を示しています。buildステージは、依存関係スキャンの実行前に、ジョブアーティファクトとして依存関係グラフを出力します。

stages:
  - build
  - test

include:
  - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml

build:
  stage: build
  image: "sbtscala/scala-sbt:eclipse-temurin-17.0.13_11_1.10.7_3.6.3"
  script:
    - "sbt dependencyDot"
  artifacts:
    when: on_success
    access: developer
    paths: ["**/dependencies-compile.dot"]

結果について理解する

依存関係スキャンアナライザーの出力内容:

  • 検出された、サポート対象のロックファイルまたは依存関係グラフのエクスポートごとに、CycloneDX形式のSBOMを生成します。
  • スキャンされたすべてのSBOMドキュメントに対する単一の依存関係スキャンレポート(GitLab.comおよびGitLab Self-Managedのみ)。

CycloneDXソフトウェア部品表

依存関係スキャンアナライザーは、検出されたサポートされているロックファイルまたは依存関係グラフエクスポートごとに、CycloneDXソフトウェア部品表(SBOM)を出力します。CycloneDX SBOMは、ジョブアーティファクトとして作成されます。

CycloneDX SBOMの仕様は次のとおりです:

  • gl-sbom-<package-type>-<package-manager>.cdx.jsonという名前が付けられます。
  • 依存関係スキャンジョブのジョブアーティファクトとして利用できます。
  • cyclonedxレポートとしてアップロードされます。
  • 検出されたロックファイルまたは依存関係グラフエクスポートファイルと同じディレクトリに保存されます。

たとえば、プロジェクトに次の構造がある場合:

.
├── ruby-project/
│   └── Gemfile.lock
├── ruby-project-2/
│   └── Gemfile.lock
└── php-project/
    └── composer.lock

次のCycloneDX SBOMは、ジョブアーティファクトとして作成されます:

.
├── ruby-project/
│   ├── Gemfile.lock
│   └── gl-sbom-gem-bundler.cdx.json
├── ruby-project-2/
│   ├── Gemfile.lock
│   └── gl-sbom-gem-bundler.cdx.json
└── php-project/
    ├── composer.lock
    └── gl-sbom-packagist-composer.cdx.json

複数のCycloneDX SBOMをマージする

CI/CDジョブを使用して、複数のCycloneDX SBOMを単一のSBOMにマージできます。

GitLabは、依存関係グラフエクスポートやロックファイルの場所など、各CycloneDX SBOMのメタデータに実装固有の詳細を格納するためにCycloneDXプロパティを使用します。複数のCycloneDX SBOMをマージすると、この情報はマージ後のファイルから削除されます。

たとえば、次の.gitlab-ci.ymlの抜粋は、複数のCyclone SBOMファイルをマージし、結果として生成されるファイルを検証する方法を示しています。

stages:
  - test
  - merge-cyclonedx-sboms

include:
  - component: $CI_SERVER_FQDN/components/dependency-scanning/main@1

merge cyclonedx sboms:
  stage: merge-cyclonedx-sboms
  image:
    name: cyclonedx/cyclonedx-cli:0.27.1
    entrypoint: [""]
  script:
    - find . -name "gl-sbom-*.cdx.json" -exec cyclonedx merge --output-file gl-sbom-all.cdx.json --input-files "{}" +
    # optional: validate the merged sbom
    - cyclonedx validate --input-version v1_6 --input-file gl-sbom-all.cdx.json
  artifacts:
    paths:
      - gl-sbom-all.cdx.json

依存関係スキャンレポート

  • 提供形態: GitLab.com、GitLab Self-Managed

依存関係スキャンアナライザーは、CycloneDX SBOMファイルで特定された依存関係で特定されたすべての脆弱性をドキュメント化する依存関係スキャンレポートを生成します。

依存関係スキャンレポート:

  • gl-dependency-scanning-report.jsonという名前が付けられます。
  • 依存関係スキャンジョブのジョブアーティファクトとして使用できます。
  • dependency_scanningレポートとしてアップロードされます。
  • プロジェクトのルートディレクトリに保存されます。

最適化

SBOMを使用した依存関係スキャンを最適化するには、次のいずれかの方法を使用します:

  • パスを除外する
  • スキャンを最大のディレクトリ深度に制限する

パスを除外する

スキャンパフォーマンスを最適化し、関連するリポジトリコンテンツに焦点を当てるには、パスを除外します。

.gitlab-ci.ymlファイルに、除外されたパスを一覧表示します:

  • 依存関係スキャンテンプレートを使用している場合は、DS_EXCLUDED_PATHS CI/CD変数を使用します。
  • 依存関係スキャンCI/CDコンポーネントを使用している場合は、excluded_paths仕様入力を使用します。

除外パターン

除外パターンは、次のルールに従います:

  • スラッシュのないパターンは、プロジェクト内の任意の深度でファイル名またはディレクトリ名と一致します(例: test./testsrc/testと一致します)。
  • スラッシュ(/)を含むパターンは、親ディレクトリ単位でのマッチングが行われます。つまり、そのパターンで始まるパスに一致します(例: a/ba/ba/b/cには一致しますが、c/a/bには一致しません)。
  • 標準のglobワイルドカードがサポートされています(例: a/**/ba/ba/x/ba/x/y/bと一致します)。
  • 先頭と末尾のスラッシュは無視されます(例: /buildbuild/buildと同じように動作します)。

スキャンを最大のディレクトリ深度に制限する

スキャンパフォーマンスを最適化し、分析するファイルの数を減らすために、スキャンを最大のディレクトリ深度に制限します。

ルートディレクトリは深度1としてカウントされ、各サブディレクトリは深度を1ずつ増やします。デフォルトの深度は2です。値が-1の場合、深さに関係なくすべてのディレクトリをスキャンします。

.gitlab-ci.ymlファイルで最大の深度を指定するには、以下を行います:

  • 依存関係スキャンテンプレートを使用している場合は、DS_MAX_DEPTH CI/CD変数を使用します。
  • 依存関係スキャンCI/CDコンポーネントを使用している場合は、max_scan_depth仕様入力を使用します。

次の例では、DS_MAX_DEPTH3に設定されている場合、commonディレクトリのサブディレクトリはスキャンされません。

timer
├── integration
│   ├── doc
│   └── modules
└── source
    ├── common
    │   ├── cplusplus
    │   └── go
    ├── linux
    ├── macos
    └── windows

ロールアウトする

単一のプロジェクトでSBOMの結果を使用した依存関係スキャンに自信がある場合は、その実装を複数のプロジェクトとグループに拡張できます。詳細については、複数のプロジェクトでスキャンを強制するを参照してください。

固有の要件がある場合、SBOMを使用した依存関係スキャンはオフライン環境で実行できます。

サポートされているパッケージタイプ

セキュリティポリシー分析を効果的にするには、SBOMレポートにリストされているコンポーネントに、GitLab Advisory Databaseに対応するエントリが含まれている必要があります。

GitLab SBOM脆弱性スキャナーは、次のPURLタイプのコンポーネントについて、依存関係スキャンの脆弱性を報告できます:

  • cargo
  • composer
  • conan
  • gem
  • golang
  • maven
  • npm
  • nuget
  • pypi
  • swift

サポートされている言語とファイル

言語パッケージマネージャーファイル説明依存関係グラフのサポート静的到達可能性のサポート
C#NuGetpackages.lock.jsonnugetによって生成されたロックファイル。check-smいいえ
C/C++Conanconan.lockconanによって生成されたロックファイル。check-smいいえ
C/C++/Fortran/Go/Python/RCondaconda-lock.ymlconda-lockによって生成された環境ファイル。いいえいいえ
Dartpubpubspec.lockpub.graph.jsonpubによって生成されたロックファイル。dart pub deps --json > pub.graph.jsonから派生した依存関係グラフ。check-smいいえ
GoGogo.modgo.graph標準のgoツールチェーンによって生成されたモジュールファイル。go mod graph > go.graphから派生した依存関係グラフ。check-smいいえ
Javaivyivy-report.xmlreport Apache Antタスクによって生成された依存関係グラフエクスポート。いいえcheck-sm
JavaMavenmaven.graph.jsonmvn dependency:tree -DoutputType=jsonによって生成された依存関係グラフエクスポート。check-smcheck-sm
Java/KotlinGradledependencies.lockdependencies.direct.lockgradle-dependency-lock-pluginによって生成されたロックファイル。check-smcheck-sm
Java/KotlinGradlegradle.lockfilegradle dependencies --write-locksによって生成されたロックファイル。いいえcheck-sm
Java/KotlinGradlegradle-html-dependency-report.jshtmlDependencyReportタスクによって生成された依存関係グラフのエクスポート。check-smcheck-sm
JavaScript/TypeScriptnpmpackage-lock.jsonnpm-shrinkwrap.jsonnpm v5以降で生成されたロックファイル(lockfileVersion属性を生成しない以前のバージョンはサポートされていません)。check-smcheck-sm
JavaScript/TypeScriptpnpmpnpm-lock.yamlpnpmによって生成されたロックファイル。check-smcheck-sm
JavaScript/TypeScriptyarnyarn.lockyarnによって生成されたロックファイル。check-smcheck-sm
PHPcomposercomposer.lockcomposerによって生成されたロックファイル。check-smいいえ
Pythonpippipdeptree.jsonpipdeptree --jsonによって生成された依存関係グラフエクスポート。check-smcheck-sm
Pythonpiprequirements.txtpip-compileによって生成された依存関係ロックファイル。check-smcheck-sm
PythonpipenvPipfile.lockpipenvによって生成されたロックファイル。いいえいいえ
Pythonpipenvpipenv.graph.jsonpipenv graph --json-tree >pipenv.graph.jsonによって生成された依存関係グラフエクスポート。check-smcheck-sm
Pythonpoetrypoetry.lockpoetryによって生成されたロックファイル。check-smcheck-sm
Pythonuv1uv.lockuvによって生成されたロックファイル。check-smcheck-sm
RubybundlerGemfile.lockgems.lockedbundlerによって生成されたロックファイル。check-smいいえ
RustcargoCargo.lockcargoによって生成されたロックファイル。check-smいいえ
Scalasbtdependencies-compile.dotsbt dependencyDotによって生成された依存関係グラフエクスポート。check-smいいえ
SwiftswiftPackage.resolvedswiftによって生成されたロックファイル。いいえいいえ

脚注:

  1. ロックファイルに、異なる環境マーカーを持つ同じパッケージの複数のエントリが含まれている場合(たとえば、Python 3.11未満の場合はnumpy==2.2.6、Python 3.11以上の場合はnumpy==2.4.1)、最初のエントリのみが解析され、レポートされます。

パッケージハッシュ情報

依存関係スキャンSBOMには、利用可能な場合にパッケージハッシュ情報が含まれます。この情報は、NuGetパッケージにのみ提供されます。パッケージの整合性と信頼性を検証できるように、SBOM内の次の場所にパッケージハッシュが表示されます:

  • 専用ハッシュフィールド
  • PURL修飾子

例:

{
  "name": "Iesi.Collections",
  "version": "4.0.4",
  "purl": "pkg:nuget/Iesi.Collections@4.0.4?sha512=8e579b4a3bf66bb6a661f297114b0f0d27f6622f6bd3f164bef4fa0f2ede865ef3f1dbbe7531aa283bbe7d86e713e5ae233fefde9ad89b58e90658ccad8d69f9",
  "hashes": [
    {
      "alg": "SHA-512",
      "content": "8e579b4a3bf66bb6a661f297114b0f0d27f6622f6bd3f164bef4fa0f2ede865ef3f1dbbe7531aa283bbe7d86e713e5ae233fefde9ad89b58e90658ccad8d69f9"
    }
  ],
  "type": "library",
  "bom-ref": "pkg:nuget/Iesi.Collections@4.0.4?sha512=8e579b4a3bf66bb6a661f297114b0f0d27f6622f6bd3f164bef4fa0f2ede865ef3f1dbbe7531aa283bbe7d86e713e5ae233fefde9ad89b58e90658ccad8d69f9"
}

アナライザーの動作をカスタマイズする

アナライザーの動作のカスタマイズ方法は、イネーブルメントソリューションによって異なります。

これらの変更をデフォルトブランチにマージする前に、マージリクエストでGitLabアナライザーのすべてのカスタマイズをテストしてください。そうしないと、誤検出が多数発生するなど、予期しない結果が生じる可能性があります。

CI/CDテンプレートを使用した動作のカスタマイズ

利用可能なspec入力

次のspec入力は、Dependency-Scanning.v2.gitlab-ci.ymlテンプレートと組み合わせて使用できます。

Spec入力デフォルト説明
job_name文字列"dependency-scanning"依存関係スキャンジョブの名前。
stage文字列test依存関係スキャンジョブのステージ。
allow_failureブール値true依存関係スキャンジョブの失敗がパイプラインを失敗させるかどうか。
analyzer_image_prefix文字列"$CI_TEMPLATE_REGISTRY_HOST/security-products"アナライザーのリポジトリを指すレジストリURLプレフィックス。
analyzer_image_name文字列"dependency-scanning"依存関係スキャンジョブで使用されるアナライザーイメージのリポジトリ。
analyzer_image_version文字列"1"依存関係スキャンジョブで使用されるアナライザーイメージのバージョン。
enable_mr_pipelinesブール値true依存関係スキャンジョブをMRまたはブランチパイプラインで実行するかどうかを制御します。
additional_ca_cert_bundle文字列信頼するCA証明書バンドル。ここに示されているCAバンドルは、システムの証明書に追加され、スキャンプロセス中に他のツールでも使用されます。詳細については、カスタムTLS認証局を参照してください。
pipcompile_requirements_file_name_pattern文字列分析時に使用するカスタム要件ファイル名のパターン。このパターンは、ディレクトリパスではなく、ファイル名のみと一致する必要があります。構文の詳細は、doublestarライブラリを参照してください。
max_scan_depth数値2サポートされているファイルを検索するためにアナライザーが検索するディレクトリレベル数を定義します。値 -1は、アナライザーが深さに関係なくすべてのディレクトリを検索することを意味します。
excluded_paths文字列"**/spec,**/test,**/tests,**/tmp"スキャンから除外するパスのカンマ区切りリスト(globがサポートされています)。
include_dev_dependenciesブール値trueサポートされているファイルをスキャンするときに、開発/テスト依存関係を含めます。
enable_static_reachabilityブール値false静的到達可能性を有効にします。
analyzer_log_level文字列"info"依存関係スキャンのログレベル。オプションは、致命的、エラー、警告、情報、デバッグです。
enable_vulnerability_scanブール値true生成されたSBOMの脆弱性分析を有効にします
api_timeout数値10依存関係スキャンSBOM APIリクエストのタイムアウト(秒単位)。
api_scan_download_delay数値3スキャン結果のダウンロード前の依存関係スキャンSBOM APIの初期遅延(秒単位)。

利用可能なCI/CD変数

これらの変数はspec入力を置き換えることができ、ベータlatestテンプレートとも互換性があります。

CI/CD変数説明
ADDITIONAL_CA_CERT_BUNDLE信頼するCA証明書バンドル。ここに示されているCAバンドルは、システムの証明書に追加され、スキャンプロセス中に他のツールでも使用されます。詳細については、カスタムTLS認証局を参照してください。
ANALYZER_ARTIFACT_DIRCycloneDXレポート(SBOM)が保存されるディレクトリ。デフォルトは${CI_PROJECT_DIR}/sca-artifactsです。
DS_EXCLUDED_ANALYZERS依存関係スキャンから除外するアナライザーを(名前で)指定します。
DS_EXCLUDED_PATHSパスに基づいて、スキャンからファイルとディレクトリを除外します。カンマ区切りのパターンリストを指定します。パターンには、glob(サポートされているパターンについてはdoublestar.Matchを参照)、またはファイルパスやフォルダーパス(doc,specなど)を使用できます。一致ルールの詳細については、除外パターンを参照してください。これは、スキャンが実行される前に適用されるプリフィルターです。依存関係検出と静的到達可能性の両方に適用されます。デフォルトは"**/spec,**/test,**/tests,**/tmp,**/node_modules,**/.bundle,**/vendor,**/.git"です。
DS_MAX_DEPTHアナライザーがスキャン対象のサポートされているファイルを検索するディレクトリ階層の深さを定義します。値が-1の場合、深さに関係なくすべてのディレクトリをスキャンします。デフォルトは2です。
DS_INCLUDE_DEV_DEPENDENCIES"false"に設定すると、開発依存関係はレポートされません。Composer、Conda、Gradle、Maven、NPM、pnpm、Pipenv、Poetry、またはuvを使用するプロジェクトのみがサポートされています。デフォルトは"true"です。
DS_PIPCOMPILE_REQUIREMENTS_FILE_NAME_PATTERNglobパターンマッチングを使用して処理する要件ファイルを定義します(例: requirements*.txtまたは*-requirements.txt)。このパターンは、ディレクトリパスではなく、ファイル名のみと一致する必要があります。構文の詳細については、globパターンドキュメントを参照してください。
SECURE_ANALYZERS_PREFIX公式のデフォルトイメージを提供するDockerレジストリ(プロキシ)の名前をオーバーライドします。
DS_FF_LINK_COMPONENTS_TO_GIT_FILESCI/CDパイプラインで動的に生成されるロックファイルやグラフファイルではなく、依存関係リスト内のコンポーネントをリポジトリにコミットされたファイルにリンクします。これにより、すべてのコンポーネントがリポジトリ内のソースファイルにリンクされます。デフォルトは"false"です。
SEARCH_IGNORE_HIDDEN_DIRS非表示のディレクトリを無視します。依存関係スキャンと静的到達可能性の両方で機能します。デフォルトは"true"です。
DS_STATIC_REACHABILITY_ENABLED静的到達可能性を有効にします。デフォルトは"false"です。
DS_ENABLE_VULNERABILITY_SCAN生成されたSBOMファイルの脆弱性スキャンを有効にします。依存関係スキャンレポートを生成します。デフォルトは"true"です。
DS_API_TIMEOUT依存関係スキャンSBOM APIリクエストのタイムアウト(秒単位)(最小値: 5、最大値: 300)デフォルト: 10
DS_API_SCAN_DOWNLOAD_DELAYスキャン結果のダウンロード前の初期遅延(秒単位)(最小値: 1、最大値: 120)デフォルト: 3
DS_ENABLE_MANIFEST_FALLBACKロックファイルまたは依存関係グラフが利用できない場合は、マニフェストフォールバックを有効にします。マニフェストフォールバックを参照してください。デフォルトは"false"です。
SECURE_LOG_LEVELログレベル。デフォルトは"info"です。

カスタムTLS認証局

依存関係スキャンでは、アナライザーコンテナイメージに付属するデフォルトの代わりに、カスタムTLS証明書をSSL/TLS接続に使用できます。

カスタムTLS認証局を使用する

カスタムTLS認証局を使用するには、CI/CD変数ADDITIONAL_CA_CERT_BUNDLEX.509 PEM公開キー証明書のテキスト表現を割り当てます。

たとえば、.gitlab-ci.ymlファイルで証明書を設定するには、次のようにします:

variables:
  ADDITIONAL_CA_CERT_BUNDLE: |
      -----BEGIN CERTIFICATE-----
      MIIGqTCCBJGgAwIBAgIQI7AVxxVwg2kch4d56XNdDjANBgkqhkiG9w0BAQsFADCB
      ...
      jWgmPqF3vUbZE0EyScetPJquRFRKIesyJuBFMAs=
      -----END CERTIFICATE-----

マニフェストフォールバック

サポートされているロックファイルまたは依存関係グラフのエクスポートが利用できない場合、依存関係スキャンアナライザーは、サポートされているマニフェストファイルからフォールバックとして依存関係を抽出できます。

次のマニフェストファイルがサポートされています:

言語パッケージマネージャーマニフェストファイル
JavaMavenpom.xml
Pythonpiprequirements.txt
JavaGradlebuild.gradlebuild.gradle.kts

マニフェストフォールバックは、ロックファイルスキャンと比較すると精度が落ちます:

  • 推移的な依存関係はありません: 直接的な依存関係のみが検出されます。
  • 解決済みの正確なバージョンを常に特定できるとは限りません。

マニフェストフォールバックを有効にするには、DS_ENABLE_MANIFEST_FALLBACKCI/CD変数を"true"に設定します。

アプリケーションのスキャン方法

SBOMを使用した依存関係スキャン機能は、静的到達可能性や脆弱性スキャンなどの他の分析から依存関係検出を分離する、分解された依存関係分析アプローチに依存しています。

この関心の分離とアーキテクチャのモジュール化により、対応言語の拡充、GitLabプラットフォーム内でのより緊密なインテグレーションとユーザー体験の向上、そして業界標準のレポート形式への移行を通じて、お客様へのサポートをより強化できます。

依存関係スキャンの全体的なフローを以下に示します。

flowchart TD
    subgraph CI[CI Pipeline]
        START([CI Job Starts])
        DETECT[Dependency Detection]
        SBOM_GEN[SBOM Reports Generation]
        SR[Static Reachability Analysis]
        UPLOAD[Upload SBOM Files]
        DL[Download Scan Results]
        REPORT[DS Security Report Generation]
        END([CI Job Complete])
    end

    subgraph GitLab[GitLab Instance]
        API[CI SBOM Scan API]
        SCANNER[GitLab SBOM Vulnerability Scanner]
        RESULTS[Scan Results]
    end

    START --> DETECT
    DETECT --> SBOM_GEN
    SBOM_GEN --> SR
    SR --> UPLOAD
    UPLOAD --> API
    API --> SCANNER
    SCANNER --> RESULTS
    RESULTS --> DL
    DL --> REPORT
    REPORT --> END

依存関係検出フェーズでは、アナライザーが利用可能なロックファイルを解析して、プロジェクトの依存とその関係(依存関係グラフ)の包括的なインベントリを構築します。このインベントリは、CycloneDX SBOM(ソフトウェア部品表)ドキュメントにキャプチャされます。

静的到達可能性フェーズでは、アナライザーはソースファイルを解析して、アクティブに使用されているSBOMコンポーネントを特定し、それに応じてSBOMファイルでマークします。これにより、ユーザーは、脆弱なコンポーネントが到達可能かどうかに基づいて、脆弱性の優先順位を付けることができます。詳細については、静的到達可能性ページを参照してください。

SBOMドキュメントは、依存関係スキャンSBOM APIを介してGitLabインスタンスに一時的にアップロードされます。GitLab SBOM脆弱性スキャナーエンジンは、SBOMコンポーネントをアドバイザリと照合して、依存関係スキャンレポートに含めるためにアナライザーに返される所見のリストを生成します。

APIは、認証にデフォルトのCI_JOB_TOKENを使用します。CI_JOB_TOKENの値を別のトークンで上書きすると、APIから403(Forbidden)エラーが返される可能性があります。

ユーザーは、次を使用して依存関係スキャンSBOM APIと通信するアナライザークライアントを構成できます:

  • vulnerability_scan_api_timeoutまたはDS_API_TIMEOUT
  • vulnerability_scan_api_download_delayまたはDS_API_SCAN_DOWNLOAD_DELAY

詳細については、利用可能なspec入力および利用可能なCI/CD変数を参照してください。

生成されたレポートは、 CIジョブの完了時、通常はパイプライン完了後にGitLabインスタンスにアップロードされ、処理されます。

SBOMレポートは、依存関係リストライセンススキャン継続的な脆弱性スキャンなど、他のSBOMベースの機能をサポートするために使用されます。

依存関係スキャンレポートは、セキュリティスキャン結果の一般的なプロセスに従います。

  • 依存関係スキャンレポートがデフォルトブランチのCI/CDジョブによって宣言されている場合: 脆弱性が作成され、脆弱性レポートに表示されます。
  • 依存関係スキャンレポートがデフォルト以外のブランチのCI/CDジョブによって宣言されている場合: セキュリティ所見が作成され、パイプラインビューのセキュリティタブとMRセキュリティウィジェットに表示されます。

オフラインサポート

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

インターネット経由での外部リソースへのアクセスが制限、制限、または断続的な環境のインスタンスでは、依存関係スキャンジョブを正常に実行するためにいくつかの調整を行う必要があります。詳細については、オフライン環境を参照してください。

要件

オフライン環境で依存関係スキャンを実行するには、以下が必要です:

  • dockerまたはkubernetesのexecutorを備えたGitLab Runner
  • 依存関係スキャンアナライザーイメージのローカルコピー
  • パッケージメタデータデータベースへのアクセス依存関係のライセンスとアドバイザリデータを取得する必要があります。

アナライザーイメージのローカルコピー

依存関係スキャンアナライザーを使用するには、以下の手順に従います:

  1. registry.gitlab.comから、次のデフォルトの依存関係スキャンアナライザーイメージをローカルのDockerコンテナレジストリにインポートします:

    registry.gitlab.com/security-products/dependency-scanning:1

    DockerイメージをローカルのオフラインDockerレジストリにインポートするプロセスは、ネットワークのセキュリティポリシーによって異なります。IT部門に相談して、外部リソースをインポートまたは一時的にアクセスするための承認済みプロセスを確認してください。これらのスキャナーは新しい定義で定期的に更新されるため、定期的にダウンロードすることをおすすめします。オフラインインスタンスがGitLabレジストリにアクセスできる場合は、Security-Binariesテンプレートを使用して、最新の依存関係スキャンアナライザーイメージをダウンロードできます。

  2. ローカルアナライザーを使用するようにGitLab CI/CDを設定します。

    CI/CD変数SECURE_ANALYZERS_PREFIXまたはanalyzer_image_prefix spec入力の値をローカルDockerレジストリに設定します(この例では、docker-registry.example.com)。

    include:
      - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml
    
    variables:
      SECURE_ANALYZERS_PREFIX: "docker-registry.example.com/analyzers"

複数のプロジェクトでのスキャンの強制

セキュリティポリシーを使用して、複数のプロジェクトで依存関係スキャンを強制します。依存関係スキャンには、ロックファイルまたは依存関係グラフファイルのいずれかの、スキャン可能なアーティファクトが必要です。スキャン可能なアーティファクトがプロジェクトのリポジトリにコミットされているかどうかによって、ポリシーの選択が決まります。

  • スキャン可能なアーティファクトがリポジトリにコミットされている場合は、スキャン実行ポリシーを使用します。

    スキャン可能なアーティファクトがリポジトリにコミットされているプロジェクトでは、スキャン実行ポリシーを使用することが、依存関係スキャンを強制する最も直接的な方法となります。

  • スキャン可能なアーティファクトがリポジトリにコミットされていない場合は、パイプライン実行ポリシーを使用します。

    スキャン可能なアーティファクトがリポジトリにコミットされていないプロジェクトの場合は、パイプライン実行ポリシーを使用する必要があります。このポリシーでは、依存関係スキャンを呼び出す前に、スキャン可能なアーティファクトを生成するためのカスタムCI/CDジョブを定義する必要があります。

    パイプライン実行ポリシーは、次のことを行う必要があります:

    • CI/CDパイプラインの一部として、ロックファイルまたは依存関係グラフファイルを生成します。
    • 特定のプロジェクト要件に合わせて依存関係検出プロセスをカスタマイズします。
    • GradleやMavenなどのビルドツールに関する言語固有の指示を実装します。

次の例では、Gradle nebulaプラグインを使用してロックファイルを生成します。他の言語については、ロックファイルまたは依存関係グラフの作成を参照してください。

例: Gradleプロジェクトのパイプライン実行ポリシー

リポジトリにコミットされたスキャン可能なアーティファクトがないGradleプロジェクトの場合は、パイプライン実行ポリシーでアーティファクト生成ステップを定義する必要があります。次の例では、nebulaプラグインを使用しています。

  1. 専用のセキュリティポリシープロジェクトで、メインポリシーファイル(例: policy.yml)を作成または更新します:

    pipeline_execution_policy:
    - name: Enforce Gradle dependency scanning with SBOM
      description: Generate dependency artifact and run dependency scanning.
      enabled: true
      pipeline_config_strategy: inject_policy
      content:
        include:
          - project: $SECURITY_POLICIES_PROJECT
            file: "dependency-scanning.yml"
  2. dependency-scanning.ymlポリシーファイルを追加します:

    stages:
      - build
      - test
    
    include:
      - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml
    
    generate nebula lockfile:
      image: openjdk:11-jdk
      stage: build
      script:
        - |
          cat << EOF > nebula.gradle
          initscript {
              repositories {
                mavenCentral()
              }
              dependencies {
                  classpath 'com.netflix.nebula:gradle-dependency-lock-plugin:12.7.1'
              }
          }
    
          allprojects {
              apply plugin: nebula.plugin.dependencylock.DependencyLockPlugin
          }
          EOF
          ./gradlew --init-script nebula.gradle -PdependencyLock.includeTransitives=true -PdependencyLock.lockFile=dependencies.lock generateLock saveLock
          ./gradlew --init-script nebula.gradle -PdependencyLock.includeTransitives=false -PdependencyLock.lockFile=dependencies.direct.lock generateLock saveLock
      after_script:
        - find . -path '*/build/dependencies.lock' -print -delete
      artifacts:
        paths:
          - '**/dependencies.lock'
          - '**/dependencies.direct.lock'

このアプローチにより、次のことが保証されます:

  1. Gradleプロジェクトで実行されるパイプラインによって、スキャン可能なアーティファクトが生成されること
  2. 依存関係スキャンが確実に適用され、スキャン可能なアーティファクトへアクセスできること
  3. ポリシーの適用範囲内にあるすべてのプロジェクトで、同一の依存関係スキャン方式が一貫して使用されること
  4. 設定変更を一元管理し、複数のプロジェクトに横断的に適用できること

新しい依存関係スキャン機能を有効にするその他の方法

v2テンプレートを使用して、依存関係スキャン機能を有効にすることを強くお勧めします。これが不可能な場合は、次のいずれかの方法を選択できます:

latestテンプレートの使用

latestテンプレートは安定版とは見なされておらず、破壊的な変更が含まれる可能性があります。詳しくはテンプレートエディションを参照してください。

latest依存関係スキャンCI/CDテンプレートDependency-Scanning.latest.gitlab-ci.ymlを使用して、GitLab提供のアナライザーを有効にします。

  • (非推奨の)Gemnasiumアナライザーがデフォルトで使用されます。

  • 新しい依存関係スキャンアナライザーを有効にするには、CI/CD変数DS_ENFORCE_NEW_ANALYZERtrueに設定します。

  • サポートされているロックファイル、依存関係グラフ 、またはトリガーファイルがパイプラインでdependency-scanningジョブを作成するために、リポジトリに存在する必要があります。

    include:
      - template: Jobs/Dependency-Scanning.latest.gitlab-ci.yml
    
    variables:
      DS_ENFORCE_NEW_ANALYZER: 'true'

または、latestテンプレートでスキャン実行ポリシーを使用して機能を有効にし、CI/CD変数DS_ENFORCE_NEW_ANALYZERtrueに設定して、新しい依存関係スキャンアナライザーを適用できます。

アナライザーの動作をカスタマイズする場合は、使用可能なCI/CD変数を使用してください。

latestテンプレートのトリガーファイル

トリガーファイルは、最新の依存関係スキャンCI/CDテンプレートを使用するときに、dependency-scanning CI/CDジョブを作成します。アナライザーはこれらのファイルをスキャンしません。トリガーファイルを使用してロックファイルまたは依存関係グラフを作成すると、プロジェクトがサポートされます。

言語ファイル
C#/Visual Basic*.csproj*.vbproj
Javapom.xml
Java/Kotlinbuild.gradlebuild.gradle.kts
Pythonrequirements.pipPipfilerequires.txtsetup.py
Scalabuild.sbt

依存関係スキャンCI/CDコンポーネントの使用

依存関係スキャンCI/CDコンポーネントを使用して、新しい依存関係スキャンアナライザーを有効にします。このアプローチを選択する前に、GitLab Self-Managedインスタンスの現在の制限事項を確認してください。

include:
  - component: $CI_SERVER_FQDN/components/dependency-scanning/main@1

ロックファイルまたは依存関係グラフを作成する必要もあります。

依存関係スキャンCI/CDコンポーネントを使用する場合、アナライザーは入力を構成することでカスタマイズできます。

独自のSBOMの持ち込み

サードパーティ製のSBOMのサポートは技術的には可能ですが、このエピックでの公式サポートが完了すると、大きく変更される可能性があります。

カスタムCIジョブで、サードパーティ製のCycloneDX SBOMジェネレーターまたはカスタムツールで生成された独自のCycloneDX SBOMドキュメントをCI/CDアーティファクトレポートとして使用します。

依存関係スキャンをSBOMを使用してアクティブ化するには、提供されているCycloneDX SBOMドキュメントが以下を満たしている必要があります:

トラブルシューティング

依存関係スキャンを使用する際に、次のイシューが発生する可能性があります。

カスタムCI_JOB_TOKENを使用するときの403 Forbiddenエラー

依存関係スキャンSBOM APIは、スキャンのアップロードまたはダウンロードフェーズ中に403 Forbiddenエラーを返す可能性があります。

これは、依存関係スキャンSBOM APIが認証にデフォルトのCI_JOB_TOKENを必要とするために発生します。CI_JOB_TOKEN変数を(プロジェクトアクセストークンやパーソナルアクセストークンなどの)カスタムトークンでオーバーライドすると、カスタムトークンにapiスコープがある場合でも、APIはリクエストを適切に認証できません。

このイシューを解決するには、次のいずれかの操作を行います:

  • 推奨。CI_JOB_TOKENのオーバーライドを削除します。定義済み変数をオーバーライドすると、予期しない動作が発生する可能性があります。詳細については、CI/CD変数を参照してください。
  • 別の変数名を使用します。パイプラインの他の目的でカスタムトークンを使用する必要がある場合は、CI_JOB_TOKENをオーバーライドする代わりに、CUSTOM_ACCESS_TOKENのような別のCI/CD変数に格納します。

GitLabは、依存関係スキャンAPIエンドポイントに対してきめ細かいジョブ権限をサポートしていませんが、イシュー578850でこの機能の追加が提案されています。

警告: grep: command not found

アナライザーイメージには、イメージのアタックサーフェスを小さくするために、最小限の依存関係が含まれています。その結果、grepのような他のイメージで一般的に見られるユーティリティがイメージから欠落しています。これにより、ジョブログに/usr/bin/bash: line 3: grep: command not foundのような警告が表示される場合があります。この警告は、アナライザーの結果には影響せず、無視できます。

コンプライアンスフレームワークの互換性

GitLab Self-ManagedインスタンスでSBOMベースの依存関係スキャンを使用する場合、コンプライアンスフレームワークとの互換性について考慮事項があります:

  • GitLab.com(SaaS): 「依存関係スキャンの実行」コンプライアンスコントロールは、SBOMベースの依存関係スキャンで正しく機能します。
  • 18.4以降のGitLab Self-Managedインスタンス: 従来のgl-dependency-scanning-report.jsonアーティファクトが生成されないため、「依存関係スキャンの実行」コンプライアンスコントロールは、SBOMベースの依存関係スキャン(DS_ENFORCE_NEW_ANALYZER: 'true')を使用すると失敗する可能性があります。

Self-Managedインスタンスの回避策: 「依存関係スキャンの実行」コントロールを必要とするコンプライアンスフレームワークチェックに合格する必要がある場合は、v2テンプレート(Jobs/Dependency-Scanning.v2.gitlab-ci.yml)を使用できます。これにより、SBOMと依存関係スキャンレポートの両方が生成されます。

コンプライアンスコントロールの詳細については、GitLabのコンプライアンスコントロールを参照してください。

エラー: failed to verify certificate: x509: certificate signed by unknown authority

依存関係スキャンアナライザーがホストに接続すると、次のエラーが発生する可能性があります。このエラーの原因は、依存関係スキャンアナライザーで使用されている証明書がホストによって信頼されていないことです。

failed to verify certificate: x509: certificate signed by unknown authority

このイシューを解決するには、自己署名証明書をADDITIONAL_CA_CERT_BUNDLE CI/CD変数に指定します。この証明書は、依存関係スキャンアナライザーがホストに接続するときに使用されます。

ADDITIONAL_CA_CERT_BUNDLE環境変数の値は証明書自体である必要があります:

include:
  - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml

dependency-scanning:
  variables:
    ADDITIONAL_CA_CERT_BUNDLE: |
      -----BEGIN CERTIFICATE-----
      <...>
      -----END CERTIFICATE-----
  before_script:
    - echo "$ADDITIONAL_CA_CERT_BUNDLE" > /tmp/cacert.pem
    - export SSL_CERT_FILE="/tmp/cacert.pem"