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

SARIFレポート

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

この機能の利用は、機能フラグsarif_ingestionによって制御されます。詳細については、履歴を参照してください。

あらゆるSARIF 2.1.0スキャナーからの検出結果をGitLabの脆弱性管理に追加するには、サードパーティのSARIFレポートを使用します。CI/CDジョブがSARIFを生成するスキャナーを実行し、SARIFアーティファクトを追加します。GitLabは、アーティファクトを解析、検証し、セキュリティ検出結果として追加します。

レポートを追加すると、検出結果は次のページにネイティブのGitLabスキャナーからの検出結果とともに表示されます:

  • パイプラインのセキュリティタブ
  • プロジェクトの脆弱性レポート
  • セキュリティダッシュボード
  • マージリクエストのセキュリティウィジェット
  • セキュリティポリシー

サードパーティのSARIFレポートは、GitLabが提供する組み込みのスキャナーを補完します。GitLabがネイティブで提供していないサードパーティのスキャナーを統合したり、すでに実行しているツールからの検出結果を統合したりするために使用します。

SARIFレポートを追加する

GitLabにSARIF検出結果を追加するには:

前提条件:

  • プロジェクトのメンテナーまたはオーナーのロール。
  • SARIF 2.1.0ファイルを生成するCI/CDジョブ。
  1. お使いの.gitlab-ci.ymlファイルで、スキャナーを実行し、そのSARIF出力をartifacts:reports:sarifアーティファクトとして保存するジョブを定義します。例:

    sarif_scan:
      image: <scanner-image>
      script:
        - <scanner-command> --output sarif.json
      artifacts:
        reports:
          sarif: sarif.json
  2. 変更をコミットしてプッシュします。ジョブが完了すると、GitLabはSARIFファイルを解析します。

  3. パイプラインのセキュリティタブで、追加された検出結果を表示します。

CI/CDアーティファクトの参照については、artifacts:reports:sarifを参照してください。

割り当てられたレポートタイプ

GitLabは、検出結果の場所と識別子に基づいて、各SARIF検出結果に脆弱性レポートタイプを割り当てます。このタイプは、脆弱性レポートに検出結果が表示される場所と、セキュリティポリシーとの相互作用を決定します。

GitLabは、以下のルールを順番に評価し、検出結果に一致する最初のタイプを割り当てます。

ルール割り当てられたレポートタイプ
任意の識別子がCVEである。依存関係スキャン
任意の識別子がシークレット関連のCWEである。1シークレット検出
デフォルト(いずれのルールも一致しない場合)SAST

補足説明:

  1. 以下のCWEはシークレット関連です:

GitLabは、検出結果とそのルール内の3つのソースから、次の順序で識別子を読み取ります:

  1. エントリがCVE-YYYY-NまたはCWE-Nの形式に一致する場合のresult.ruleId
  2. エントリがcwe:Ncwe-Ncve:YYYY-N、またはcve-YYYY-Nの形式に一致する場合のrule.properties.tags[]
  3. 関係のtarget.toolComponent.nameCWEである場合のrule.relationships[]

CVEまたはサポートされているCWE識別子がない検出結果は、SASTとして割り当てられます。GitLabが割り当てるタイプを変更するには、スキャナーが一致するCVEまたはCWE識別子を出力するように設定してください。

SARIFフィールドマッピング

GitLabは、以下のルールに従って、SARIFフィールドをGitLabと互換性のあるフィールドに割り当てます。

GitLabフィールドSARIFソース必須備考
重大度重大度の解決を参照いいえ重大度フィールドが設定されていない場合、mediumがデフォルトです。
プライマリ識別子result.ruleIdは、run.tool.driver.rules[].id内の対応する値に一致します。check-smruleIdがない検出結果は追加されません。
セカンダリ識別子rule.properties.tags[]およびrule.relationships[]いいえレポートタイプを割り当てるために使用されます。
場所result.locations[0].physicalLocationcheck-sm物理的な場所がない検出結果は追加されません。
スキャナー名run.tool.driver.namecheck-sm有効なSARIFに必要です
スキャナーベンダーrun.tool.driver.organization、次にrun.tool.driver.informationUriいいえ最初の空でない値が使用されます
スキャナーバージョンrun.tool.driver.version、次にrun.tool.driver.semanticVersionいいえ最初の空でない値が使用されます
抑制result.suppressions[]いいえ抑制された結果は、すべての抑制がunderReviewまたはrejectedでない限りスキップされます。

重大度の解決

GitLabは、以下のフィールドを優先順位順に確認することで、SARIF検出結果の重大度を解決します。値を持つ最初のフィールドが使用されます。

  1. result.rank0.0から100.0までの浮動小数点数。
  2. rule.properties.security-severity0.0から10.0までの浮動小数点数。値はバケット化する前に10倍されます。
  3. result.properties.security-severity0.0から10.0までの浮動小数点数。値はバケット化する前に10倍されます。
  4. result.level
  5. rule.defaultConfiguration.level
  6. 他に一致するものがない場合、mediumがデフォルトとして使用されます。

result.rankまたはsecurity-severityからの数値スコアは、以下の範囲を使用して重大度として割り当てられます:

スコア(0-100)重大度
0.0-9.9情報
10.0-39.9
40.0-69.9中程度
70.0-89.9高い
90.0-100Critical

SARIF levelの値は次のようにマップされます:

level重大度
error高い
warning中程度
note
none情報

GitLabはlevel: errorをCriticalではなくHighに割り当てます。Criticalな検出結果をレポートするには、result.rank90以上に設定するか、security-severity9.0以上に設定します。

取り込みの動作

SARIFファイルが適切にフォーマットされているが、一部の結果を追加できない場合、GitLabは処理できなかった結果の割合を使用して、スキャン全体で何をすべきかを決定します。

ドロップ率動作レポートされる内容
0%すべての検出結果がインジェストされます。メッセージなし。
1%から50%有効な検出結果がインジェストされます。ドロップ数を含む警告。
50%超スキャン全体が失敗します。レポートからの検出結果はインジェストされません。ドロップ数を含むエラー。

GitLabは、以下のいずれかのケースでは結果を処理できません:

  • ruleIdが不足しています。
  • physicalLocationが不足しています。
  • 検出識別子の生成に使用される必須コンポーネントのいずれかがnilです。
  • 文字列フィールドが文字数制限を超過しています。

ドロップ率は、ファイル内の各runではなく、SARIFアーティファクト全体で計算されます。すべての実行で処理できない結果の割合が閾値を超えると、取り込みフィードバックがアーティファクトから出力されたすべてのレポートに適用されます。

スキーマ検証エラーおよびサポートされていないSARIFバージョンは、ドロップ率に関係なく、レポート全体が拒否される原因となります。

マルチツールレポート

SARIFファイルには複数のツール実行を含めることができ、それぞれに独自のruns[]エントリがあります。各実行について、GitLabは推測されたレポートタイプごとに検出結果をグループ化し、各グループに対して個別のスキャンレコードを作成します。複数の推測されたタイプの検出結果を含む実行は、複数のスキャンレコードを生成します。各スキャンは、実行のtool.driver.nameをそのスキャナーとして使用します。

複数のスキャナーの出力を単一のアーティファクトに結合するには、マルチ実行レポートを使用します。例えば、ジョブは2つのスキャナーを実行し、2つの実行を含む単一のSARIFファイルを出力できます。

ファイルごとの実行制限については、制限を参照してください。

制限

制限デフォルト設定可能
最大SARIFアーティファクトサイズ10 MB(ci_max_artifact_size_sarifcheck-sm
SARIFファイルあたりの最大実行数20いいえ
実行あたりの最大結果数5,000いいえ
実行あたりの最大ルール数25,000いいえ
ルールあたりの最大タグ数10いいえ
rule.nameの最大長255文字いいえ
shortDescription.textの最大長1,024文字いいえ
fullDescription.textの最大長1,024文字。発見タイトルとして使用される場合は255文字に切り詰められます。いいえ
message.textの最大長1,024文字。発見タイトルとして使用される場合は255文字に切り詰められます。いいえ
helpUriの最大長2,048文字いいえ
サポートされているSARIFバージョン2.1.0のみいいえ

実行あたりのカウントが制限を超えると、GitLabは最初のN個のエントリを処理し、警告を記録します。結果に文字数制限を超える文字列フィールドがある場合、結果全体がスキップされ、ドロップ率にカウントされます。

GitLab Self-Managedインスタンスの場合、管理者はインスタンス制限を通じて設定可能な制限を変更できます。

既知の問題

  • SAST、依存関係スキャン、またはシークレット検出として割り当てられたSARIF検出結果は、同等のネイティブGitLabスキャナーからの検出結果と重複排除されません。詳細については、イシュー592410を参照してください。
  • SARIFの抑制を使用して検出結果を除外することはできますが、GitLabでは抑制に基づく脆弱性の却下は作成されません。検出結果を無視するには、脆弱性レポートを使用します。