보안 보고서 수신 개요

경고: 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 클래스의 인스턴스입니다. 이것은 취약성 데이터의 필터링된 쿼리 성능을 향상시키기 위해 VulnerabilityVulnerability::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::StoreGroupedScansService에서는 Security::StoreScanService를 호출합니다.
  7. Security::StoreScanServiceSecurity::StoreFindingsService를 호출합니다.
  8. ScanSecurityReportSecretsWorker는 감지된 누출된 키를 자동으로 취소하기 위해 Security::TokenRevocationService를 호출합니다.

이 시점에서 우리는 Vulnerability 레코드가 아닌 Security::Finding 레코드만 가지고 있습니다. 이러한 발견은 프로젝트의 기본 브랜치에 없기 때문에 취약성 레코드로 승격되지 않습니다. 이러한 Security::Finding 레코드가 Vulnerability 레코드로 승격될 수 있는 몇 가지 시나리오는 아래에서 설명되어 있습니다.

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

파이프라인이 기본 브랜치에서 실행된 경우 분기되지 않은 브랜치에 대한 파이프라인에서 스캔 실행 단계에 추가로 아래 단계가 실행됩니다:

  1. Security::StoreScansService가 호출되어 StoreSecurityReportsByProjectWorker를 예약합니다.
  2. StoreSecurityReportsByProjectWorkerSecurity::Ingestion::IngestReportsService를 실행합니다.
  3. Security::Ingestion::IngestReportsService는 주어진 파이프라인의 모든 보고서를 가져와 Security::Ingestion::IngestReportService를 호출한 후 Security::Ingestion::MarkAsResolvedService를 호출합니다.
  4. Security::Ingestion::IngestReportServiceSecurity::Ingestion::IngestReportSliceService를 호출하여 보고서 슬라이스에 대한 여러 작업을 실행합니다.

해산

만약 취약점의 상태를 변경한다면, 예를 들어 취약점 해산을 선택한다면 다음과 같은 일이 발생합니다:

  • Feedback 레코드가 해산 유형으로 생성되어 현재 상태를 기록합니다.
  • 이미 존재하지 않는다면, present_on_default_branch: false 속성을 가진 Vulnerability FindingVulnerability가 생성되며, 해당 상태 변경을 반영하는 State Transition이 관련됩니다.

상태 변경에 선택적으로 주석을 추가할 수 있으며, 이는 FeedbackState Transition에 기록됩니다.

이슈 또는 병합 요청 생성

이슈 생성 또는 병합 요청 생성을 선택하면, 현재 다음과 같은 일이 발생합니다:

  • Vulnerabilities::Feedback 레코드가 생성됩니다. 해당 피드백은 이슈 또는 병합 요청feedback_type을 가지며, 첨부에 대해 각각 issue_id 또는 merge_request_idNULL이 아닙니다.
  • 이미 존재하지 않는다면, present_on_default_branch: false 속성을 가진 Vulnerability FindingVulnerability가 생성되며, 취한 조치에 따라 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수동 취약점은 이 프로세스에서 제외됩니다.