보안 보고서 삽입 개요
Vulnerability::Feedback
모델은 폐기 중이며 향후 모든 개발에서 적극적으로 피해야합니다. 현재 기능 동등성으로 유지되어 있어 발생한 문제로 인해 되돌릴 수 있지만, 16.0에서 제거될 예정입니다. 피드백 모델과 관련된 모든 상호작용은 StateTransition
, IssueLink
, 및 MergeRequestLink
모델에 의해 폐기됩니다. 여기에 더 자세한 정보를 찾을 수 있습니다.흔히 사용되는 용어
피드백
Vulnerabilities::Feedback
클래스의 인스턴스입니다. 이들은 취약점 발견을 취약점으로 승격되기 전에 사용자 상호작용을 추적하는 데 생성됩니다. 이 모델은 폐기 예정이며 폐기 및 제거 취약점::피드백 epic의 일부로 16.0에서 제거될 예정입니다.
이슈 링크
Vulnerabilities::IssueLink
클래스의 인스턴스입니다. 이들은 Vulnerability
레코드를 Issue
레코드에 연결하는 데 사용됩니다.
Merge Request 링크
Vulnerabilities::MergeRequestLink
클래스의 인스턴스입니다. 이들은 Vulnerability
레코드를 MergeRequest
레코드에 연결하는 데 사용됩니다.
보안 발견
Security::Finding
클래스의 인스턴스입니다. 이들은 특정 Security::Scan
에서 감지된 특정 취약점의 메타데이터 리포지터리로 작용합니다. 현재는 파이프라인 보안 보고서의 성능 향상을 위해 부분 발견 데이터를 저장합니다. 이 클래스는 곧 Vulnerability::Findings
대신 사용되도록 확장되어 거의 모든 필요한 스캔 정보를 저장하여 작업 자산에 의존하지 않고 있습니다.
보안 스캔
Security::Scan
클래스의 인스턴스입니다. 보안 스캔은 Job Artifact
를 출력하는 Ci::Build
의 대표로써 보안 스캔 결과물로 인식되고 Security::Finding
레코드로 처리됩니다.
상태 전이
Vulnerabilities::StateTransition
클래스의 인스턴스입니다. 이 모델은 관련 취약점 레코드의 상태 변경을 나타냅니다. 예를 들어 안전하게 판정된 취약점의 해제 등이 이에 해당합니다.
취약점
Vulnerability
클래스의 인스턴스입니다. Vulnerability
는 프로젝트의 기본 브랜치에서 감지된 Vulnerability::Finding
을 대표하거나 present_on_default_branch
플래그가 false인 경우 기본 브랜치 외부에서 상호작용된 발견을 대표합니다. 이는 Vulnerabilities::Finding
클래스에서 사용 가능한 정보를 기반으로 만들어집니다. 모든 Vulnerability
는 유효한 Vulnerabilities::Finding
객체가 있어야 하지만 데이터베이스 수준에서는 이는 강제되지는 않습니다.
발견
Vulnerabilities::Finding
클래스의 인스턴스입니다. Vulnerability::Finding
은 프로젝트의 기본 브랜치에 Merge된 보안 발견의 데이터베이스 전용 표현입니다. 동일한 Vulnerability
가 프로젝트 내에서 여러 위치에 존재할 수 있기 때문에 이 클래스는 이를 성과하기 위해 호출되어지기 전에 Vulnerabilities::Occurrence
라 불렸었습니다. 클래스의 이름을 변경한 후에도 대형 테이블 이름을 변경하는 작업이 포함되어 있기 때문에 관련된 테이블 이름 vulnerability_occurrences
을 유지했습니다.
식별자
Vulnerabilities::Identifier
클래스의 인스턴스입니다. 각 취약점은 해당 발견에서 파생될 수 있는 고유 식별자를 받아 동일한 Vulnerability
의 여러 발견을 상응시킴으로써 연관시킬 수 있습니다.
취약점 읽기
Vulnerabilities::Read
클래스의 인스턴스입니다. 이는 취약점 데이터 표시 전반의 성능을 향상시키기 위해 Vulnerability
및 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
를 호출합니다.
이 시점에서 우리는 Vulnerability
레코드가 아닌 Security::Finding
레코드만 가지게 됩니다. 이러한 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
를 호출하여 보고서 슬라이스에 대한 일련의 작업을 실행합니다.
기각
만약 “취약점 비활성화”를 선택하는 등의 취약점의 상태를 변경하면 현재 다음과 같은 일이 발생합니다.
- ‘비활성화’ 유형의
피드백
레코드가 생성되어 현재 상태를 기록합니다. - 이미 존재하지 않은 경우,
기본 브랜치에 표시: false
속성이 있는취약점 발견
및취약점
이 생성되며, 상태 변경을 반영하는상태 전이
가 관련됩니다.
상태 변경에 대해 선택적으로 코멘트를 추가할 수 있으며, 이는 피드백
및 상태 전이
에 기록됩니다.
이슈 또는 Merge Request 생성
“이슈 생성” 또는 “Merge Request 생성”을 선택하는 경우 현재 다음과 같은 일이 발생합니다.
-
취약점::피드백
레코드가 생성됩니다. 이 피드백은이슈
또는Merge Request
의피드백 유형
을 가지고 있으며, 첨부에 따라issue_id
또는merge_request_id
가NULL
이 아닐 것입니다. - 이미 존재하지 않은 경우,
기본 브랜치에 표시: false
속성이 있는취약점 발견
및취약점
이 생성되며, 취한 조치에 따라이슈 링크
또는Merge Request 링크
가 관련됩니다.
기본 브랜치의 취약점
기본 브랜치에서 실행된 스캔에서 감지된 보안 문제는 기본 브랜치에 표시: true
속성 및 해당하는 취약점 발견
레코드와 함께 취약점
으로 저장됩니다. 기본 브랜치 외부의 상호작용으로 이미 존재하는 취약점
레코드는 기본 브랜치에 표시: true
로 업데이트됩니다.
이미 상호작용한 취약점
은 모든 기존 상태 전이
, Merge Request 링크
, 이슈 링크
및 해당하는 취약점 피드백
을 유지합니다.
취약점 읽기 생성
PostgreSQL 데이터베이스 트리거를 통해 취약점 발견
레코드를 생성함에 따라 취약점 읽기
레코드가 생성되며, 이는 우리의 수집 프로세스의 일부이지만 보고서 페이지의 정규화 성능에 이점을 제공합니다.
이러한 생성 스타일은 빠르고 원활하게 의도되었지만 디버깅 및 유지 관리가 어려웠으며 나중에 애플리케이션 계층으로 이동될 수 있습니다.