Sec 섹션 개발 지침
Sec 섹션은 GitLab 애플리케이션 보안 기능과 “Sec” 부분인 DevSecOps에 대한 책임이 있습니다. Sec 섹션에 특화된 개발 가이드가 여기에 나열되어 있습니다.
공통 용어에 대한 개요는 여기를 참조하세요.
아키텍처
개요
보안 기능을 지원하는 아키텍처는 주로 두 가지 부분으로 나뉩니다.
- 스캔
- 처리, 시각화 및 관리
스캔
스캔 부분은 주어진 리소스에서 취약점을 찾고 결과를 내보내는 역할을 합니다. 이러한 스캔은 분석기라고 하는 몇 개의 작은 프로젝트를 통해 CI/CD 작업에서 실행되며, 이 분석기는 분석기 하위 그룹에서 찾을 수 있습니다. 분석기는 GitLab에 통합하기 위해 내부적으로 또는 외부적으로 개발된 보안 도구인 스캐너를 래핑한 것입니다. 분석기는 주로 Go로 작성됩니다.
일부 타사 통합 업체는 통합 문서를 따르는 추가 스캐너를 제공하기도 하며, 이는 동일한 아키텍처를 활용합니다.
스캔 결과는 Secure 보고서 형식을 준수해야 하며, 파이프라인이 완료된 후 처리를 위해 CI/CD 작업 보고서 아티팩트로 업로드됩니다.
처리, 시각화 및 관리
데이터를 보고서 아티팩트로 사용할 수 있게 되면, GitLab Rails 애플리케이션에서 처리하여 보안 기능을 가능하게 할 수 있습니다. 이는 다음과 같은 보안 기능을 포함합니다.
- 보안 대시보드, 병합 요청 위젯, 파이프라인 보기 등
- 취약점과 상호 작용
- 승인 규칙
상황에 따라 보안 보고서는 데이터베이스에 저장되거나 보고서 아티팩트로 유지되어 필요할 때에 액세스할 수 있습니다.
보안 보고서 적재 개요
스캐너에 의해 생성된 보고서를 GitLab이 어떻게 처리하는지 자세한 내용은 보안 보고서 적재 개요를 참조하세요.
CI/CD 템플릿 개발
CI/CD 템플릿은 Verify 섹션이 책임지지만, 많은 경우 Sec 섹션의 기능 사용에 필수적입니다. CI/CD 템플릿을 사용 중이라면, GitLab CI/CD 템플릿 개발 가이드를 읽어보세요.
주요 식별자의 중요성
분석기 JSON 보고서 내의 identifiers
필드에는 취약점을 설명하고 추적하는 데 사용되는 여러 유형 및 범주의 집합이 포함되어 있습니다(CWE 패밀리).
identifiers
컬렉션 내의 첫 번째 항목은 주요 식별자로 알려져 있으며, 취약점을 추적하고 설명하는 데 중요한 구성 요소입니다.
다른 대부분의 경우 identifiers
컬렉션은 정렬되지 않으며, 나머지 보조 식별자는 취약점을 그룹화하는 데 사용되는 메타데이터로 작용합니다(분석기 취약점 번역는 예외입니다).
주요 식별자가 변경되고 프로젝트 파이프라인이 다시 실행되면 새로운 보고서 적재가 이전의 DB 레코드를 “고아”로 만들 수 있습니다. 우리의 처리 논리는 두 가지 다른 취약점의 델타를 생성하는 데 의존하기 때문에 이것이 꽤 혼란스러울 수 있습니다. 예를 들어:
한 번 병합된 후, 이전 취약점은 “해결됨”으로 표시되고 새로운 취약점은 “감지됨”으로 나열됩니다.
주요 식별자 안정성 보장을 위한 지침 원칙
- 매력적인 이유가 없는 한 주요 식별자는 변경해서는 안 됩니다.
- 취약점 번역을 지원하는 분석기는 고아 레코드를 방지하기 위해 이전 주요 식별자를 보조 위치에 포함해야 합니다.
- 주요 식별자 이외의 보조 식별자의 순서는 중요하지 않습니다.
- 식별자는
Type
및Value
필드의 조합을 기반으로 고유합니다(식별자 지문 참조). - 주요 식별자를 변경하면 분석기를 이전 버전으로 롤백해도 이전 작업에서 생성된 데이터는 수정하기에는 몇 가지 방법만 가능합니다.
분석기 취약점 번역
SAST Semgrep 분석기의 경우, 보고서의 취약점을 레거시 분석기(즉, bandit 또는 ESLint)에 연결하는 식별자가 특히 중요합니다.
취약점 번역을 활성화시키기 위해 Semgrep 분석기는 레거시 분석기의 주요 식별자와 정확히 일치하는 보조 식별자에 의존합니다.
예를 들어, 이전에 eslint
를 사용하여 취약점 레코드를 생성한 경우:
{
"version": "14.0.4",
"vulnerabilities": [
{
"identifiers": [
{
"type": "eslint_rule_id",
"name": "ESLint rule ID security/detect-eval-with-expression",
"value": "security/detect-eval-with-expression"
}
]
}
]
}
해당 Semgrep 보고서는 eslint_rule_id
를 포함해야 합니다:
{
"version": "14.0.4",
"vulnerabilities": [
{
"identifiers": [
{
"type": "semgrep_id",
"name": "eslint.detect-eval-with-expression",
"value": "eslint.detect-eval-with-expression",
"url": "https://semgrep.dev/r/gitlab.eslint.detect-eval-with-expression"
},
{
"type": "eslint_rule_id",
"name": "ESLint rule ID security/detect-eval-with-expression",
"value": "security/detect-eval-with-expression"
}
]
}
]
}
취약점 추적은 두 식별자의 조합을 통해 데이터베이스에 이전에 생성된 레거시 분석기에서 새로운 semgrep
분석기로 생성된 레코드로 다시 맵핑됩니다.