보안 보고서 섭취 개요
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를 사용합니다.
- 프로젝트는 보안 스캔 도구를 사용합니다.
- 데이터베이스에 취약성이 없습니다.
- 모든 파이프라인에서 보안 스캔을 수행합니다.
브랜치의 파이프라인에서 스캔 실행
- 코드가 브랜치로 푸시됩니다.
- GitLab CI가 해당 브랜치에 대한 새 파이프라인을 실행합니다.
- 파이프라인 상태가
::Ci::Pipeline.completed_statuses
중 하나로 전환합니다. -
Security::StoreScansWorker
가 호출되어Security::StoreScansService
를 예약합니다. -
Security::StoreScansService
가Security::StoreGroupedScansService
를 호출하고ScanSecurityReportSecretsWorker
를 예약합니다. -
Security::StoreGroupedScansService
가Security::StoreScanService
를 호출합니다. -
Security::StoreScanService
가Security::StoreFindingsService
를 호출합니다. -
ScanSecurityReportSecretsWorker
가 누출된 키를 자동으로 폐기하기 위해Security::TokenRevocationService
를 호출합니다.
이 시점에서 이러한 Security::Finding
레코드만 있으며, 이러한 발견은 프로젝트의 기본 브랜치에 존재하지 않기 때문에 Vulnerability
레코드는 아직 없습니다.
이러한 Security::Finding
레코드가 Vulnerability
레코드로 승격될 수 있는 몇 가지 시나리오에 대해 아래에서 설명합니다.
기본 브랜치의 파이프라인에서 스캔 실행
파이프라인이 기본 브랜치에서 실행된 경우 브랜치의 파이프라인에서 스캔 실행의 단계에 추가적으로 다음 단계가 수행됩니다:
-
Security::StoreScansService
가 호출되어StoreSecurityReportsWorker
를 예약합니다. -
StoreSecurityReportsWorker
가Security::Ingestion::IngestReportsService
를 실행합니다. -
Security::Ingestion::IngestReportsService
가 주어진 파이프라인의 모든 보고서를 가져오고Security::Ingestion::IngestReportService
를 호출하고Security::Ingestion::MarkAsResolvedService
를 호출합니다. -
Security::Ingestion::IngestReportService
가Security::Ingestion::IngestReportSliceService
를 호출하여 보고서 슬라이스에 대해 일련의 작업을 실행합니다.
해제
취약성
.예비항목에 상태를 변경하는 등 취약성 해제
를 선택하는 경우 현재 다음과 같은 작업이 발생합니다.
-
폐지
타입의피드백
레코드가 생성되어 현재 상태를 기록합니다. - 이미 존재하지 않는 경우,
Vulnerability Finding
과Vulnerability
및present_on_default_branch: false
속성을 가진Vulnerability
가 생성될 것이며, 상태 변경을 반영하는State Transition
가 관련될 것입니다.
상태 변경에 댓글을 추가할 수 있으며, 이는 피드백
및 상태 전이에 기록됩니다.
이슈 또는 Merge Request 생성
Vulnerabilities::Feedback
레코드가 생성됩니다. 피드백은 피드백 유형
이 이슈
또는 Merge Request
이고 첨부 파일에 따라 issue_id
또는 merge_request_id
가 NULL
이 아닐 것입니다.
존재하지 않는 경우, Vulnerability Finding
과 Vulnerability
및 present_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 및 매뉴얼 취약점은 이 프로세스에서 제외됩니다.