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ジョブ。
お使いの
.gitlab-ci.ymlファイルで、スキャナーを実行し、そのSARIF出力をartifacts:reports:sarifアーティファクトとして保存するジョブを定義します。例:sarif_scan: image: <scanner-image> script: - <scanner-command> --output sarif.json artifacts: reports: sarif: sarif.json変更をコミットしてプッシュします。ジョブが完了すると、GitLabはSARIFファイルを解析します。
パイプラインのセキュリティタブで、追加された検出結果を表示します。
CI/CDアーティファクトの参照については、artifacts:reports:sarifを参照してください。
割り当てられたレポートタイプ
GitLabは、検出結果の場所と識別子に基づいて、各SARIF検出結果に脆弱性レポートタイプを割り当てます。このタイプは、脆弱性レポートに検出結果が表示される場所と、セキュリティポリシーとの相互作用を決定します。
GitLabは、以下のルールを順番に評価し、検出結果に一致する最初のタイプを割り当てます。
| ルール | 割り当てられたレポートタイプ |
|---|---|
| 任意の識別子がCVEである。 | 依存関係スキャン |
| 任意の識別子がシークレット関連のCWEである。1 | シークレット検出 |
| デフォルト(いずれのルールも一致しない場合) | SAST |
補足説明:
以下のCWEはシークレット関連です:
GitLabは、検出結果とそのルール内の3つのソースから、次の順序で識別子を読み取ります:
- エントリが
CVE-YYYY-NまたはCWE-Nの形式に一致する場合のresult.ruleId。 - エントリが
cwe:N、cwe-N、cve:YYYY-N、またはcve-YYYY-Nの形式に一致する場合のrule.properties.tags[]。 - 関係の
target.toolComponent.nameがCWEである場合のrule.relationships[]。
CVEまたはサポートされているCWE識別子がない検出結果は、SASTとして割り当てられます。GitLabが割り当てるタイプを変更するには、スキャナーが一致するCVEまたはCWE識別子を出力するように設定してください。
SARIFフィールドマッピング
GitLabは、以下のルールに従って、SARIFフィールドをGitLabと互換性のあるフィールドに割り当てます。
| GitLabフィールド | SARIFソース | 必須 | 備考 |
|---|---|---|---|
| 重大度 | 重大度の解決を参照 | いいえ | 重大度フィールドが設定されていない場合、mediumがデフォルトです。 |
| プライマリ識別子 | result.ruleIdは、run.tool.driver.rules[].id内の対応する値に一致します。 | ruleIdがない検出結果は追加されません。 | |
| セカンダリ識別子 | rule.properties.tags[]およびrule.relationships[] | いいえ | レポートタイプを割り当てるために使用されます。 |
| 場所 | result.locations[0].physicalLocation | 物理的な場所がない検出結果は追加されません。 | |
| スキャナー名 | run.tool.driver.name | 有効なSARIFに必要です | |
| スキャナーベンダー | run.tool.driver.organization、次にrun.tool.driver.informationUri | いいえ | 最初の空でない値が使用されます |
| スキャナーバージョン | run.tool.driver.version、次にrun.tool.driver.semanticVersion | いいえ | 最初の空でない値が使用されます |
| 抑制 | result.suppressions[] | いいえ | 抑制された結果は、すべての抑制がunderReviewまたはrejectedでない限りスキップされます。 |
重大度の解決
GitLabは、以下のフィールドを優先順位順に確認することで、SARIF検出結果の重大度を解決します。値を持つ最初のフィールドが使用されます。
result.rank。0.0から100.0までの浮動小数点数。rule.properties.security-severity。0.0から10.0までの浮動小数点数。値はバケット化する前に10倍されます。result.properties.security-severity。0.0から10.0までの浮動小数点数。値はバケット化する前に10倍されます。result.level。rule.defaultConfiguration.level。- 他に一致するものがない場合、
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-100 | Critical |
SARIF levelの値は次のようにマップされます:
level | 重大度 |
|---|---|
error | 高い |
warning | 中程度 |
note | 低 |
none | 情報 |
GitLabはlevel: errorをCriticalではなくHighに割り当てます。Criticalな検出結果をレポートするには、result.rankを90以上に設定するか、security-severityを9.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_sarif) | |
| 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では抑制に基づく脆弱性の却下は作成されません。検出結果を無視するには、脆弱性レポートを使用します。