보안 보고서 섭취 개요

caution
Vulnerability::Feedback 모델은 현재 폐지가 진행 중이며 향후 모든 개발에서 활발히 피해야합니다. 현재 feature parity로 유지되어 재귀가 필요할 경우 역전할 수 있지만, 16.0에서 제거할 예정입니다. 피드백 모델과 관련된 모든 상호 작용은 StateTransition, IssueLink, 및 MergeRequestLink 모델로 대체됩니다. 이 에픽에서 자세한 내용을 확인할 수 있습니다.

자주 사용되는 용어

피드백

Vulnerabilities::Feedback 클래스의 인스턴스. 취약성 발견이 취약성으로 승격되기 전에 사용자 상호 작용을 추적하는 데 생성됩니다. 이 모델은 폐지되었으며 폐지 및 제거 취약성::피드백 에픽의 일부로 16.0에서 제거될 예정입니다.

이슈 링크

Vulnerabilities::IssueLink 클래스의 인스턴스. Vulnerability 레코드를 Issue 레코드에 연결하는 데 사용됩니다.

Merge Request 링크

Vulnerabilities::MergeRequestLink 클래스의 인스턴스. Vulnerability 레코드를 MergeRequest 레코드에 연결하는 데 사용됩니다.

보안 발견

Security::Finding 클래스의 인스턴스. 특정 Security::Scan에서 감지된 특정 취약성의 메타데이터 리포지터리로 작동합니다. 현재는 일부 발견 데이터를 저장하여 파이프라인 보안 보고서의 성능을 향상시킵니다. 이 클래스는 곧 Vulnerability::Findings를 대신 사용할 예정이며 여기에서 확인하십시오.

보안 스캔

Security::Scan 클래스의 인스턴스. 보안 스캔은 Job Artifact를 출력하는 Ci::Build를 대표하며, GitLab은 해당 보고서를 인식하고 Security::Finding 레코드로 섭취합니다.

상태 전이

Vulnerabilities::StateTransition 클래스의 인스턴스. 이 모델은 해당 취약성 레코드의 상태 변경을 나타냅니다. 예를 들어 안전하다고 판단된 취약성의 해제를 나타냅니다.

취약성

Vulnerability 클래스의 인스턴스. Vulnerability는 프로젝트의 기본 브랜치에서 감지된 Vulnerability::Finding을 대표하며, present_on_default_branch 플래그가 false인 경우에는 기본 브랜치 외부에서 취약성이 상호 작용된 것을 나타냅니다. 이는 존재하는 모든 Vulnerability가 유효한 Vulnerabilities::Finding 객체를 가져야 함을 의미하지만, 데이터베이스 수준에서는 강제되지 않습니다.

발견

Vulnerabilities::Finding 클래스의 인스턴스. Vulnerability::Finding은 프로젝트의 기본 브랜치로 Merge된 보안 발견의 데이터베이스 전용 표현으로, 동일한 Vulnerability가 프로젝트 내에서 여러 곳에 존재할 수 있습니다. 본 클래스는 이전에 Vulnerabilities::Occurrence로 불렸으며 클래스 이름을 바꾼 후 큰 테이블 이름 변경의 노력으로 인해 연관된 테이블 이름인 vulnerability_occurrences를 유지했습니다.

식별자

Vulnerabilities::Identifier 클래스의 인스턴스. 각 취약성에는 해당 발견에서 파생될 수 있는 고유 식별자가 제공되어 동일한 Vulnerability의 여러 발견을 적절하게 관련시킬 수 있게 합니다.

취약성 읽기

Vulnerabilities::Read 클래스의 인스턴스. 이것은 취약성 및 Vulnerability::Finding 데이터의 정규화된 레코드로, 취약성 데이터를 프론트엔드에서 필터링된 쿼리 성능을 향상시키기 위해 저장합니다.

복구

Vulnerabilities::Remediation 클래스의 인스턴스. 복구는 감지된 Vulnerability에 대한 알려진 해결책을 대표합니다. 이는 GitLab이 특정 Vulnerability를 해결할 변경을 권장할 수 있게 합니다.

보안 보고서로부터 취약성 생성

가정:

  • 프로젝트는 GitLab CI를 사용합니다.
  • 프로젝트는 보안 스캔 도구를 사용합니다.
  • 데이터베이스에 취약성이 없습니다.
  • 모든 파이프라인에서 보안 스캔을 수행합니다.

브랜치의 파이프라인에서 스캔 실행

  1. 코드가 브랜치로 푸시됩니다.
  2. GitLab CI가 해당 브랜치에 대한 새 파이프라인을 실행합니다.
  3. 파이프라인 상태가 ::Ci::Pipeline.completed_statuses 중 하나로 전환합니다.
  4. Security::StoreScansWorker가 호출되어 Security::StoreScansService를 예약합니다.
  5. Security::StoreScansServiceSecurity::StoreGroupedScansService를 호출하고 ScanSecurityReportSecretsWorker를 예약합니다.
  6. Security::StoreGroupedScansServiceSecurity::StoreScanService를 호출합니다.
  7. Security::StoreScanServiceSecurity::StoreFindingsService를 호출합니다.
  8. ScanSecurityReportSecretsWorker가 누출된 키를 자동으로 폐기하기 위해 Security::TokenRevocationService를 호출합니다.

이 시점에서 이러한 Security::Finding 레코드만 있으며, 이러한 발견은 프로젝트의 기본 브랜치에 존재하지 않기 때문에 Vulnerability 레코드는 아직 없습니다. 이러한 Security::Finding 레코드가 Vulnerability 레코드로 승격될 수 있는 몇 가지 시나리오에 대해 아래에서 설명합니다.

기본 브랜치의 파이프라인에서 스캔 실행

파이프라인이 기본 브랜치에서 실행된 경우 브랜치의 파이프라인에서 스캔 실행의 단계에 추가적으로 다음 단계가 수행됩니다:

  1. Security::StoreScansService가 호출되어 StoreSecurityReportsWorker를 예약합니다.
  2. StoreSecurityReportsWorkerSecurity::Ingestion::IngestReportsService를 실행합니다.
  3. Security::Ingestion::IngestReportsService가 주어진 파이프라인의 모든 보고서를 가져오고 Security::Ingestion::IngestReportService를 호출하고 Security::Ingestion::MarkAsResolvedService를 호출합니다.
  4. Security::Ingestion::IngestReportServiceSecurity::Ingestion::IngestReportSliceService를 호출하여 보고서 슬라이스에 대해 일련의 작업을 실행합니다.

해제

취약성.예비항목에 상태를 변경하는 등 취약성 해제를 선택하는 경우 현재 다음과 같은 작업이 발생합니다.

  • 폐지타입의 피드백 레코드가 생성되어 현재 상태를 기록합니다.
  • 이미 존재하지 않는 경우, Vulnerability FindingVulnerabilitypresent_on_default_branch: false 속성을 가진 Vulnerability가 생성될 것이며, 상태 변경을 반영하는 State Transition가 관련될 것입니다.

상태 변경에 댓글을 추가할 수 있으며, 이는 피드백 및 상태 전이에 기록됩니다.

이슈 또는 Merge Request 생성

Vulnerabilities::Feedback 레코드가 생성됩니다. 피드백은 피드백 유형이슈 또는 Merge Request이고 첨부 파일에 따라 issue_id 또는 merge_request_idNULL이 아닐 것입니다. 존재하지 않는 경우, Vulnerability FindingVulnerabilitypresent_on_default_branch: false 속성을 가진 Vulnerability가 생성될 것이며, 취해진 조치에 따라 Issue Link 또는 Merge Request Link가 관련될 것입니다.

Default Branch의 취약점

기본 브랜치에서 실행된 스캔에서 감지된 보안 문제는 Vulnerability로 저장되며 present_on_default_branch: true 속성과 해당하는 Vulnerability Finding 레코드가 있습니다. 기본 브랜치 외부 상호작용에서 이미 존재하는 Vulnerability 레코드는 present_on_default_branch: true로 업데이트됩니다.

이미 상호작용된 Vulnerabilities는 모든 기존 State Transitions, Merge Request Links, Issue Links 및 해당하는 Vulnerability Feedback을 유지합니다.

취약점 Read 생성

Vulnerability::Read 레코드는 Vulnerability::Finding 레코드가 생성될 때 PostgreSQL 데이터베이스 트리거를 통해 생성되며, 이는 우리의 투입 프로세스의 일부이지만 보고서 페이지의 정규화 성능에 이점을 제공합니다.

이러한 생성 방식은 빠르고 무리없는 것으로 의도되었지만 디버깅과 유지 관리가 어렵다는 것으로 밝혀졌으며, 나중에 응용프로그램 계층으로 이주될 수 있습니다.

더 이상 감지되지 않음

취약점 보고서의 “No longer detected” 배지는 Vulnerability 레코드가 resolved_on_default_branch: true인 경우에 표시됩니다. 이것은 기본 브랜치에서 파이프라인이 실행될 때 Security::Ingestion::MarkAsResolvedService에 의해 설정됩니다. resolved_on_default_branch: false이고 파이프라인 스캔 결과에 없는 취약점은 해결된 것으로 표시됩니다. Secret Detection매뉴얼 취약점은 이 프로세스에서 제외됩니다.