보안 보고서 수신 개요
경고:
Vulnerability::Feedback
모델은 현재 폐기 단계에 있으므로 향후 모든 개발에서 적극적으로 피해야 합니다. 현재 feature parity를 유지하여 문제가 발생할 경우 되돌릴 수 있지만, 16.0에서 제거될 예정입니다. 피드백 모델과 관련된 모든 상호작용은 StateTransition
, IssueLink
, 및 MergeRequestLink
모델에 의해 대체됩니다. 자세한 내용은 이 에픽에서 확인할 수 있습니다.
자주 사용되는 용어
Feedback
Vulnerabilities::Feedback
클래스의 인스턴스입니다. 이러한 피드백은 취약점을 취약성으로 승격하기 전에 사용자 상호작용을 추적하는 데 생성됩니다. 이 모델은 폐기 단계이며 취약성::피드백 에픽의 일환으로 16.0에서 제거될 예정입니다.
Issue Link
Vulnerabilities::IssueLink
클래스의 인스턴스입니다. 이들은 Vulnerability
레코드를 Issue
레코드에 연결하는 데 사용됩니다.
Merge Request Link
Vulnerabilities::MergeRequestLink
클래스의 인스턴스입니다. 이들은 Vulnerability
레코드를 MergeRequest
레코드에 연결하는 데 사용됩니다.
Security Finding
Security::Finding
클래스의 인스턴스입니다. 이들은 특정 Security::Scan
에서 감지된 특정 취약성의 메타데이터 저장소로 작동합니다. 현재는 파이프라인 보안 보고서의 성능을 향상시키기 위해 일부 발견 데이터를 저장합니다. 이 클래스는 곧 Vulnerability::Findings 대신 사용될 예정입니다.
Security Scan
Security::Scan
클래스의 인스턴스입니다. 보안 스캔은 Job Artifact
를 출력하는 Ci::Build
를 대표하며, 이를 보안 스캔 결과로 보고하고, GitLab은 이를 Security::Finding
레코드로 수신하고 수용합니다.
State Transition
Vulnerabilities::StateTransition
클래스의 인스턴스입니다. 이 모델은 해당 취약성 레코드의 상태 변경을 나타내며, 예를 들어 안전하다고 판단된 취약성의 기각을 나타냅니다.
Vulnerability
Vulnerability
클래스의 인스턴스입니다. Vulnerability
는 프로젝트의 기본 브랜치에서 감지된 Vulnerability::Finding
을 대표하거나, present_on_default_branch
플래그가 false인 경우 기본 브랜치 외부에서 어떤 방식으로든 상호작용된 발견을 대표합니다. 예를 들어 기각될 때,(State Transition
) 또는 Issue
또는 Merge Request
에 링크할 때입니다. 이들은 Vulnerabilities::Finding
클래스에서 제공되는 정보를 기반으로 생성됩니다. 모든 Vulnerability
에는 유효하게 하는 데 필요한 해당 Vulnerabilities::Finding
객체가 반드시 있어야 하지만, 데이터베이스 수준에서 강요되는 것은 아닙니다.
Finding
Vulnerabilities::Finding
클래스의 인스턴스입니다. Vulnerability::Finding
은 프로젝트의 기본 브랜치로 병합된 보안 발견의 데이터베이스 전용 표현입니다. 동일한 Vulnerability
가 프로젝트 내에서 여러 곳에 있을 수 있기 때문에 클래스는 이전에는 Vulnerabilities::Occurrence
라고 불렸지만 클래스의 이름을 변경한 후 큰 테이블의 이름 변경으로 인한 노력으로 인해 연결된 테이블 이름인 vulnerability_occurrences
을 유지했습니다.
Identifier
Vulnerabilities::Identifier
클래스의 인스턴스입니다. 각 취약점에는 해당 발견에서 유도될 수 있는 고유한 식별자가 부여되어, 동일한 Vulnerability
의 여러 발견을 적절하게 연관시킬 수 있습니다.
Vulnerability Read
Vulnerabilities::Read
클래스의 인스턴스입니다. 이는 취약점 데이터를 프론트엔드로의 필터링된 쿼리의 성능을 향상시키기 위해 Vulnerability
및 Vulnerability::Finding
데이터의 비정규화된 레코드입니다.
Remediation
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
를 호출합니다.
이 시점에서 우리는 Vulnerability
레코드가 아니라 Security::Finding
레코드만 갖게 됩니다. 이러한 발견이 프로젝트의 기본 브랜치에 존재하지 않기 때문에 이러한 Security::Finding
레코드를 Vulnerability
레코드로 승격하는 경우의 몇 가지 시나리오가 아래에 설명되어 있습니다.
기본 브랜치에서의 Pipeline에서의 스캔 실행
파이프라인이 기본 브랜치에서 실행된 경우, 기본 브랜치가 아닌 경우의 파이프라인에서의 스캔 실행 단계에 추가로 다음 단계가 실행됩니다:
-
Security::StoreScansService
가 호출되어StoreSecurityReportsWorker
를 예약합니다. -
StoreSecurityReportsWorker
가Security::Ingestion::IngestReportsService
를 실행합니다. -
Security::Ingestion::IngestReportsService
는 주어진 파이프라인에서 모든 보고서를 가져와Security::Ingestion::IngestReportService
를 호출한 후Security::Ingestion::MarkAsResolvedService
를 호출합니다. -
Security::Ingestion::IngestReportService
는Security::Ingestion::IngestReportSliceService
를 호출하여 보고서 슬라이스에 대해 여러 작업을 실행합니다.
거부
거부 취약성
과 같이 취약성의 상태를 변경하는 경우 현재 다음과 같은 일이 발생합니다:
- 현재 상태를 기록하기 위해
거부
타입의Feedback
레코드가 생성됩니다. - 이미 존재하지 않는 경우,
present_on_default_branch: false
속성을 가진Vulnerability Finding
및Vulnerability
가 생성되며, 상태 변경을 반영하는State Transition
이 관련됩니다.
상태 변경에 대해 선택적으로 주석을 추가할 수 있으며, 이는 상태 변경에 대해 Feedback
및 State Transition
에 기록됩니다.
이슈 또는 머지 요청 생성
이슈 생성
또는 머지 요청 생성
을 선택하는 경우 현재 다음과 같은 일이 발생합니다:
-
Vulnerabilities::Feedback
레코드가 생성됩니다. 해당 피드백에는이슈
또는머지 요청
의feedback_type
이 있으며, 첨부 파일에 따라issue_id
또는merge_request_id
가NULL
이 아닙니다. - 이미 존재하지 않는 경우,
present_on_default_branch: false
속성을 가진Vulnerability Finding
및Vulnerability
가 생성되며, 취한 조치에 따라이슈 링크
또는머지 요청 링크
가 관련됩니다.
기본 브랜치의 취약점
기본 브랜치에서 실행된 스캔에서 감지된 보안 결과는 present_on_default_branch: true
속성과 해당하는 Vulnerability Finding
레코드로 저장됩니다. 기본 브랜치 외부 상호작용으로 이미 존재하는 Vulnerability
레코드는 present_on_default_branch: true
로 업데이트됩니다.
이미 상호작용한 Vulnerability
는 모든 기존의 State Transitions
, 머지 요청 링크
및 이슈 링크
를 유지하며 해당하는 Vulnerability Feedback
도 유지됩니다.
취약점 Read 작성
Vulnerability::Read
레코드는 Vulnerability::Finding
레코드 생성시 PostgreSQL 데이터베이스 트리거를 통해 생성되며, 보고서 페이지의 비정규화 성능 이점을 제외하고는 적용 프로세스의 일부로서 영향을 미치지 않습니다.
이 작성 방식은 빠르고 원활하게 의도되었지만, 디버깅 및 유지보수가 어려워 나중에 응용 프로그램 계층으로 이전될 수 있습니다.