보안 보고서 수신 개요
경고:
Vulnerability::Feedback
모델은 현재 폐기 중이며 추가 개발에서 적극적으로 피해야합니다. 현재 유지되며 문제가 발생할 경우 되돌릴 수 있도록 모든 기능이 유지됩니다. 그러나 16.0에서 제거될 예정입니다. 피드백 모델과 관련된 모든 상호 작용은 StateTransition
, IssueLink
, 및 MergeRequestLink
모델에 의해 더이상 지배됩니다. 이 에픽에서 더 자세히 알아보세요.
흔히 사용되는 용어
피드백
Vulnerabilities::Feedback
클래스의 인스턴스입니다. 이들은 취약성을 발견하기 전 사용자의 상호 작용을 추적하는 데 생성됩니다. 이 모델은 폐기되며 취약성::피드백 에픽의 일부로 16.0에서 제거될 예정입니다.
이슈 링크
Vulnerabilities::IssueLink
클래스의 인스턴스입니다. 이들은 Vulnerability
레코드를 Issue
레코드에 연결하는 데 사용됩니다.
머지 리퀘스트 링크
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인 경우에는 기본 브랜치 외부에서 상호 작용된 발견을 나타냅니다. 이들은 Vulnerabilities::Finding
클래스의 정보를 기반으로 생성됩니다. 모든 Vulnerability
에는 유효한 Vulnerabilities::Finding
객체가 필수로 있어야 하지만, 데이터베이스 수준에서는 이를 강제하지는 않습니다.
발견
Vulnerabilities::Finding
클래스의 인스턴스입니다. Vulnerability::Finding
은 프로젝트의 기본 브랜치에 병합된 보안 발견의 데이터베이스 표현으로, 동일한 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
가 호출되어StoreSecurityReportsByProjectWorker
를 예약합니다. -
StoreSecurityReportsByProjectWorker
는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
가 생성되며, 취한 조치에 따라Issue Link
또는Merge Request Link
가 관련될 것입니다.
기본 브랜치의 취약점
기본 브랜치에서 스캔 실행 중 감지된 보안 결과는 present_on_default_branch: true
속성과 해당하는 Vulnerability Finding
레코드를 가진 Vulnerability
로 저장됩니다. 기본 브랜치 외부의 상호작용에서 이미 존재하는 Vulnerability
레코드는 present_on_default_branch: true
로 업데이트됩니다.
이미 상호작용되었던 Vulnerabilities
는 모든 기존 State Transitions
, 병합 요청 링크
및 이슈 링크
그리고 해당하는 Vulnerability Feedback
을 유지합니다.
취약점 읽기 생성
Vulnerability::Finding
레코드 생성 시 PostgreSQL 데이터베이스 트리거를 통해 Vulnerability::Read
레코드가 생성되며, 이는 우리의 흡수 프로세스 일환으로, 보고서 페이지의 정규화 성능에 영향을 미치지 않으나 그에 이점을 줍니다.
이러한 생성 방식은 빠르고 원할하게 의도되었으나, 디버그와 유지보수가 어렵다는 것이 입증되었으며, 나중에 응용 프로그램 레이어로 이전할 수 있습니다.
더 이상 감지되지 않음
취약점 보고서의 “더 이상 감지되지 않음” 배지는 Vulnerability
레코드가 resolved_on_default_branch: true
인 경우 표시됩니다.
이는 기본 브랜치에서 파이프라인이 실행될 때 Security::Ingestion::MarkAsResolvedService
에 의해 설정됩니다. resolved_on_default_branch: false
이고 파이프라인 스캔 결과에 없는 취약점은 해결되었다고 표시됩니다.
Secret Detection 및 수동 취약점은 이 프로세스에서 제외됩니다.