セキュリティレポート取り込みの概要

caution
Vulnerability::Feedback モデルは現在非推奨となっており、今後のすべての開発において積極的に避けるべきです。現在、何らかのイシューが発生した場合にリバートできるように、フィーチャーパリティでメンテナーされていますが、16.0で削除される予定です。Feedbackモデルに関連するすべての相互作用は、StateTransitionIssueLinkMergeRequestLink モデルに取って代わられます。詳しくはエピックでご覧ください。

よく使われる用語

フィードバック

Vulnerabilities::Feedback クラスのインスタンス。脆弱性に昇格させる前に、ユーザーと脆弱性Findingsのやり取りを記録するために作成されます。このモデルは非推奨で、Deprecate and remove Vulnerabilities::Feedback epicの一部としてGitLab 16.0で削除される予定です。

Vulnerabilities::IssueLink クラスのインスタンス。Vulnerability レコードをIssue レコードにリンクするために使用されます。

Vulnerabilities::MergeRequestLink クラスのインスタンス。Vulnerability レコードをMergeRequest レコードにリンクするために使用されます。

セキュリティ検索

Security::Finding クラスのインスタンス。これらは、特定のSecurity::Scan で検出された特定の脆弱性のメタデータストアとして機能します。現在、パイプラインセキュリティレポートのパフォーマンスを向上させるために、部分的な発見データを格納しています。このクラスは、ジョブのアーティファクトに依存しないように、ほとんどすべての必要なスキャン情報を格納するように拡張され、近々、Vulnerability::Findings の代わりに使用される予定です。

セキュリティスキャン

Security::Scan クラスのインスタンス。セキュリティスキャンはCi::Build を代表するもので、セキュリティスキャンの結果として出力されたJob Artifact を GitLab が認め、その結果をSecurity::Finding レコードとして取り込みます。

状態遷移

Vulnerabilities::StateTransition クラスのインスタンス。このモデルは脆弱性レコードの状態変化を表します。

脆弱性

Vulnerability クラスの VulnerabilityインスタンスVulnerability 。A Vulnerabilityは、プロジェクトのデフォルトブランチで検出されたVulnerability::Finding を表します。また、present_on_default_branch フラグが False の場合は、デフォルトブランチの外部で何らかのやり取りが行われた検出を表します。たとえば、State Transition が却下された場合、IssueMerge Requestにリンクされた場合などです。これらは、Vulnerabilities::Finding クラスで利用可能な情報に基づいて作成されます。すべてのVulnerability は、対応するVulnerabilities::Finding オブジェクトを持たなければ有効にはなりませんが、これはデータベースレベルでは強制されません。

検索

Vulnerabilities::Finding クラスのインスタンス。同じVulnerability がプロジェクト内の複数の場所に存在する可能性があるため、Vulnerability::Finding は、プロジェクトのデフォルトブランチにマージされたセキュリティ発見のデータベースのみの表現です。このクラスは、以前はVulnerabilities::Occurrence と呼ばれていました。クラス名を変更した後も、大きなテーブルの名前を変更する手間がかかるため、関連するテーブル名はvulnerability_occurrences のままにしています。

識別子

Vulnerabilities::Identifier クラスのインスタンス。各脆弱性には、その発見から派生できる一意の識別子が与えられ、同じVulnerability の複数の発見をそれに応じて相関させることができます。

脆弱性の読み取り

Vulnerabilities::Read クラスのインスタンス。これは、VulnerabilityVulnerability::Finding データの非正規化レコードで、フロントエンドへの脆弱性データのフィルタリングされたクエリのパフォーマンスを向上させるためのものです。

対処法

Vulnerabilities::Remediation クラスのインスタンス。修復は、検出されたVulnerability. VulnerabilityNET Framework の既知の解決策の代表です。Vulnerabilityこれにより、GitLabは特定の.NET Frameworkを解決するための変更を推奨する Vulnerabilityことができます。

セキュリティレポートからの脆弱性作成

前提

  • プロジェクトはGitLab CIを使用
  • プロジェクトがセキュリティスキャンツールを使用
  • データベースに脆弱性はありません。
  • すべてのパイプラインがセキュリティスキャンを実行

デフォルト以外のブランチのパイプラインでスキャンを実行

  1. コードがブランチにプッシュされます。
  2. GitLab CI はそのブランチに対して新しいパイプラインを実行します。
  3. パイプラインのステータスは::Ci::Pipeline.completed_statusesのいずれかに遷移します。
  4. Security::StoreScansWorker が呼び出され、Security::StoreScansService をスケジュールします。
  5. Security::StoreScansServiceSecurity::StoreGroupedScansService を呼び出し、ScanSecurityReportSecretsWorker をスケジュールします。
  6. Security::StoreGroupedScansService コールSecurity::StoreScanService
  7. Security::StoreScanService callsSecurity::StoreFindingsService.
  8. ScanSecurityReportSecretsWorker Security::TokenRevocationService を呼び出し、検出された漏洩鍵を自動的に失効させます。
  9. この時点ではSecurity::Findingレコードしかありません。プロジェクトのデフォルトブランチにはこのような発見がないからです。

この時点で、Security::Finding に次のようなことが起こり、Vulnerability の記録を持つVulnerability::Finding に昇格させることができます:

デフォルトブランチのパイプラインでスキャンが実行されます。

パイプラインがデフォルトブランチで実行された場合、デフォルトブランチ以外のパイプラインで実行されたスキャンのステップに加えて、以下のステップが実行されます:

  1. Security::StoreScansService が呼び出され、StoreSecurityReportsWorker をスケジュールします。
  2. StoreSecurityReportsWorker の実行Security::Ingestion::IngestReportsService
  3. Security::Ingestion::IngestReportsService は指定されたパイプラインからすべてのレポーターを受け取り、Security::Ingestion::IngestReportService を呼び出し、Security::Ingestion::MarkAsResolvedService を呼び出します。
  4. Security::Ingestion::IngestReportService Security::Ingestion::IngestReportSliceService を呼び出し、レポート・スライスに対していくつかのタスクを実行します。

解散

Dismiss vulnerability を選択するなど、脆弱性の状態を変更すると、現在以下のことが起こります:

  • dismissal タイプのFeedback レコードが作成され、現在の状態が記録されます。
  • それらがまだ存在しない場合、Vulnerability Findingpresent_on_default_branch: false 属性を持つVulnerability が作成され、状態の変更を反映したState Transition が関連付けられます。

オプションで、FeedbackState Transition の両方に記録される状態変更にコメントを追加することができます。

イシューまたはマージリクエストの作成

Create issue またはCreate merge request を選択した場合、現在以下のことが起こります:

  • Vulnerabilities::Feedback レコードが作成されます。フィードバックには、issue またはmerge requestfeedback_type と、NULL ではないissue_id またはmerge_request_id が添付されます。
  • これらがまだ存在しない場合、Vulnerability Findingpresent_on_default_branch: false 属性を持つVulnerability が作成され、Issue Link またはMerge Request Link がアクションに関連付けられます。

デフォルトブランチの脆弱性

デフォルトブランチで実行されたスキャンで検出されたセキュリティ所見は、present_on_default_branch: true 属性とそれぞれのVulnerability Finding レコードを持つVulnerabilities として保存されます。デフォルトブランチ以外とのやり取りで既に存在するVulnerability レコードは、次のように更新されます。present_on_default_branch: true

Vulnerabilities すでに相互作用が行われている場合は、既存のすべてのState TransitionsMerge Request LinksIssue Links 、および対応するVulnerability Feedback が保持されます。

脆弱性リードの作成

Vulnerability::Read レコードは、Vulnerability::Finding レコードの作成時に、postgres データベースのトリガーを介して作成され、インジェストプロセスの一部となります。

この作成スタイルは、高速でシームレスであることを意図したものですが、デバッグやメンテナーが難しいことが判明しており、後にアプリケーションレイヤーにマイグレーションされる可能性があります。