- 기능
- 요구 사항
- 지원되는 언어 및 프레임워크
- 지원 종료된 분석기
- 고급 취약점 추적
- 자동 취약점 해결
- 지원되는 배포판
- 출력
- SAST 결과 보기
- 스캐너 기여하기
- 구성
- 오프라인 환경에서 SAST 실행
- SELinux에서 SAST 실행하기
정적 애플리케이션 보안 테스트 (SAST)
GitLab CI/CD를 사용하고 있다면 GitLab CI/CD, 정적 애플리케이션 보안 테스트(SAST)를 사용하여 소스 코드를 알려진 취약점에 대해 검사할 수 있습니다.
모든 GitLab 티어에서 SAST 분석기를 실행할 수 있습니다. 분석기의 출력 결과는 JSON 형식의 보고서로 작업 산출물로 생성됩니다.
GitLab Ultimate에서는 SAST 결과가 추가로 처리되므로 다음을 수행할 수 있습니다:
- 승인 워크플로우에서 사용할 수 있습니다.
- 보안 대시보드에서 검토할 수 있습니다.
자세한 내용은 기능을 참조하세요.
기능
다음 표는 각 기능이 사용 가능한 GitLab 티어를 나열합니다.
기능 | Free & Premium | Ultimate |
---|---|---|
오픈 소스 분석기를 이용한 기본 스캔 | 예 | 예 |
다운로드 가능한 SAST JSON 보고서 | 예 | 예 |
GitLab 고급 SAST를 이용한 파일 간, 함수 간 스캔 | 아니요 | 예 |
병합 요청 위젯 내의 새로운 발견 | 아니요 | 예 |
병합 요청 변경 보기 내의 새로운 발견 | 아니요 | 예 |
취약점 관리 | 아니요 | 예 |
UI 기반 스캐너 구성 | 아니요 | 예 |
규칙세트 사용자 지정 | 아니요 | 예 |
고급 취약점 추적 | 아니요 | 예 |
요구 사항
인스턴스에서 SAST 분석기를 실행하기 전에 다음을 확인하세요:
-
docker
또는kubernetes
실행자를 사용하는 리눅스 기반 GitLab Runner가 필요합니다. GitLab.com의 공유 러너를 사용하는 경우 기본적으로 활성화되어 있습니다.- Windows Runners는 지원되지 않습니다.
- amd64 외의 CPU 아키텍처는 지원되지 않습니다.
- GitLab CI/CD 구성(
.gitlab-ci.yml
)에는 기본적으로 포함된test
단계가 포함되어야 합니다..gitlab-ci.yml
파일에서 단계를 재정의하는 경우test
단계가 필요합니다.
지원되는 언어 및 프레임워크
GitLab SAST는 다양한 프로그래밍 언어 및 프레임워크 스캐닝을 지원합니다.
SAST 활성화 후에, 프로젝트가 여러 언어를 사용하는 경우에도 적절한 분석기가 자동으로 실행됩니다.
SAST의 언어 지원 계획에 대한 자세한 정보는 카테고리 방향 페이지를 참조하십시오.
언어 / 프레임워크 | 스캐닝에 사용되는 분석기 | 최소 지원 GitLab 버전 |
---|---|---|
.NET (모든 버전, C# 전용) | Semgrep와 GitLab 관리 규칙 | 15.4 |
.NET (모든 버전, C# 전용) | Advanced SAST | 17.3 |
Apex (Salesforce) | PMD | 12.1 |
C | Semgrep와 GitLab 관리 규칙 | 14.2 |
C/C++ | Semgrep와 GitLab 관리 규칙 | 16.11 |
Elixir (Phoenix) | Sobelow | 11.1 |
Go | Semgrep와 GitLab 관리 규칙 | 14.4 |
Go | Advanced SAST | 17.3 |
Groovy1 | SpotBugs와 find-sec-bugs 플러그인 | 11.3 (Gradle) & 11.9 (Maven, SBT) |
Helm Charts | Kubesec | 13.1 |
Java (모든 빌드 시스템) | Semgrep와 GitLab 관리 규칙 | 14.10 |
Java (Android) | Semgrep와 GitLab 관리 규칙 | 16.11 |
Java (모든 빌드 시스템) | Advanced SAST | 17.3 |
JavaScript | Semgrep와 GitLab 관리 규칙 | 13.10 |
JavaScript | Advanced SAST | 17.3 |
Kotlin (Android) | Semgrep와 GitLab 관리 규칙 | 16.11 |
Kotlin (General)1 | Semgrep와 GitLab 관리 규칙 | 16.11 |
Kubernetes manifests | Kubesec | 12.6 |
Node.js | Semgrep와 GitLab 관리 규칙 | 16.11 |
Node.js | Advanced SAST | 17.3 |
Objective-C (iOS) | Semgrep와 GitLab 관리 규칙 | 16.11 |
PHP | Semgrep와 GitLab 관리 규칙 | 16.11 |
Python | Semgrep와 GitLab 관리 규칙 | 13.9 |
Python | Advanced SAST | 17.3 |
React | Semgrep와 GitLab 관리 규칙 | 13.10 |
Ruby | Semgrep와 GitLab 관리 규칙 | 16.11 |
Ruby | Advanced SAST | 17.5 |
Ruby on Rails | Semgrep와 GitLab 관리 규칙 | 16.11 |
Rust 2 | Semgrep와 사용자 제공 커스텀 규칙 | 17.1 |
Scala (모든 빌드 시스템) | Semgrep와 GitLab 관리 규칙 | 16.0 |
Scala 1 | SpotBugs와 find-sec-bugs 플러그인 | 11.0 (SBT) & 11.9 (Gradle, Maven) |
Swift (iOS) | Semgrep와 GitLab 관리 규칙 | 16.11 |
TypeScript | Semgrep와 GitLab 관리 규칙 | 13.10 |
TypeScript | Advanced SAST | 17.3 |
- SpotBugs 기반 분석기는 Gradle, Maven, 그리고 SBT를 지원합니다. 또한 Gradle wrapper, Grails, 그리고 Maven wrapper와 같은 변형과 함께 사용할 수 있습니다. 하지만 SpotBugs는 제한이 있습니다. Ant 기반 프로젝트에 대해 사용할 경우, Advanced SAST 또는 Semgrep 기반 분석기를 사용하는 것이 좋습니다.
- 사용자 정의 규칙 세트와 semgrep-sast CI 작업에 대한 오버라이드가 필요합니다. 예제는 Rust 애플리케이션 스캐닝을 참조하십시오.
지원 종료된 분석기
다음의 GitLab 분석기는 지원 종료 상태에 도달하여 업데이트를 받지 않습니다.
이들은 GitLab 관리 규칙이 적용된 Semgrep 기반 분석기로 대체되었습니다.
GitLab 17.3.1로 업그레이드한 후, 한 번의 데이터 마이그레이션이 자동으로 해결되며, 지원 종료에 도달한 분석기로부터의 발견 사항을 처리합니다.
여기에는 SpotBugs를 제외한 아래 나열된 모든 분석기가 포함됩니다. SpotBugs는 여전히 Groovy 코드를 스캔하기 때문입니다.
마이그레이션은 확인되지 않았거나 해제되지 않은 취약점만 해결하며, 자동으로 Semgrep 기반 스캐닝으로 변환된 취약점에는 영향을 주지 않습니다.
자세한 내용은 이슈 444926을 참조하세요.
언어 / 프레임워크 | 분석기 스캔에 사용됨 | 최소 지원 GitLab 버전 | 지원 종료 GitLab 버전 |
---|---|---|---|
.NET Core | Security Code Scan | 11.0 | 16.0 |
.NET Framework | Security Code Scan | 13.0 | 16.0 |
Go | Gosec | 10.7 | 15.4 |
Java | SpotBugs와 find-sec-bugs 플러그인 | 10.6 (Maven), 10.8 (Gradle) & 11.9 (SBT) | 15.4 |
Python | bandit | 10.3 | 15.4 |
React | ESLint react 플러그인 | 12.5 | 15.4 |
JavaScript | ESLint 보안 플러그인 | 11.8 | 15.4 |
TypeScript | ESLint 보안 플러그인 | 11.9, ESLint가 13.2일 때 | 15.4 |
Ruby | brakeman | 13.9 | 17.0 |
Ruby on Rails | brakeman | 13.9 | 17.0 |
Node.js | NodeJsScan | 11.1 | 17.0 |
Kotlin (General) | SpotBugs | 13.11 | 17.0 |
Kotlin (Android) | MobSF | 13.5 | 17.0 |
Java (Android) | MobSF | 13.5 | 17.0 |
Objective-C (iOS) | MobSF | 13.5 | 17.0 |
PHP | phpcs-security-audit | 10.8 | 17.0 |
C++ | Flawfinder | 10.7 | 17.0 |
고급 취약점 추적
소스 코드는 변동성이 있으며, 개발자가 변경을 가하면 소스 코드는 파일 내 또는 파일 간에 이동할 수 있습니다.
보안 분석기가 이미 취약점 보고서에서 추적 중인 취약점을 보고했을 수 있습니다.
이러한 취약점은 특정 문제 코드 조각과 연결되어 있어 이를 찾아서 수정할 수 있습니다.
코드 조각이 이동할 때 신뢰할 수 있게 추적되지 않으면, 동일한 취약점이 다시 보고될 수 있기 때문에 취약점 관리가 더 어려워집니다.
GitLab SAST는 리팩토링이나 관련 없는 변경으로 인해 동일한 취약점이 파일 내에서 이동했을 때 이를 더 정확하게 식별하기 위해 고급 취약점 추적 알고리즘을 사용합니다.
고급 취약점 추적은 지원되는 언어 및 분석기의 하위 집합에서 사용할 수 있습니다:
- C, Semgrep 기반에서만
- C++, Semgrep 기반에서만
- C#, Advanced SAST 및 Semgrep 기반 분석기에서만
- Go, Advanced SAST 및 Semgrep 기반 분석기에서만
- Java, Advanced SAST 및 Semgrep 기반 분석기에서만
- JavaScript, Advanced SAST 및 Semgrep 기반 분석기에서만
- PHP, Semgrep 기반 분석기에서만
- Python, Advanced SAST 및 Semgrep 기반 분석기에서만
- Ruby, Semgrep 기반 분석기에서만
더 많은 언어 및 분석기에 대한 지원은 이 에픽에서 추적됩니다.
자세한 내용은 기밀 프로젝트 https://gitlab.com/gitlab-org/security-products/post-analyzers/tracking-calculator
를 참조하세요. 이 프로젝트의 내용은 GitLab 팀 구성원에게만 제공됩니다.
자동 취약점 해결
- GitLab 15.9에서
sec_mark_dropped_findings_as_resolved
라는 프로젝트 수준 플래그로 도입됨.- GitLab 15.10에서 기본적으로 활성화됨. GitLab.com에서는 프로젝트를 위한 플래그를 비활성화해야 할 경우 지원에 문의하세요.
- GitLab 16.2에서 특징 플래그가 제거됨.
여전히 관련 있는 취약점에 집중할 수 있도록 GitLab SAST는 다음과 같은 경우에 취약점을 자동으로 해결합니다:
- 사전 정의된 규칙을 비활성화할 때.
- 기본 규칙 집합에서 규칙을 제거할 때.
자동 해결은 Semgrep 기반 분석기의 발견에 대해서만 가능합니다.
취약점 관리 시스템은 자동으로 해결된 취약점에 댓글을 남겨 취약점의 역사적 기록을 유지합니다.
나중에 규칙을 다시 활성화하면 발견 사항이 재개설되어 조정됩니다.
지원되는 배포판
기본 스캐너 이미지는 크기 및 유지 관리성을 위해 기본 Alpine 이미지를 기준으로 구축됩니다.
FIPS 지원 이미지
GitLab은 FIPS 140 검증 암호화 모듈을 사용하는 Red Hat UBI 기반 이미지를 제공합니다.
FIPS 지원 이미지를 사용하려면 다음 중 하나를 설정할 수 있습니다:
-
SAST_IMAGE_SUFFIX
를-fips
로 설정합니다. - 기본 이미지 이름에
-fips
확장을 추가합니다.
예:
variables:
SAST_IMAGE_SUFFIX: '-fips'
include:
- template: Jobs/SAST.gitlab-ci.yml
FIPS 준수 이미지는 Advanced SAST 및 Semgrep 기반 분석기에서만 사용할 수 있습니다.
FIPS 지원 이미지를 사용하여 Advanced SAST 또는 Semgrep을 비루트 사용자로 실행하는 경우,
runners.kubernetes.pod_security_context
아래에 있는 run_as_user
속성을 업데이트하여 이미지에 의해 생성된 gitlab
사용자의 ID인 1000
을 사용해야 합니다.출력
SAST는 파일 gl-sast-report.json
을 작업 아티팩트로 출력합니다. 이 파일에는 발견된 모든 취약점의 세부 정보가 포함되어 있습니다. 파일을
다운로드하여 GitLab 외부에서 처리할 수 있습니다.
자세한 내용은 다음을 참조하십시오:
SAST 결과 보기
SAST 보고서 파일은 GitLab에 의해 처리되며, 세부 사항이 UI에 표시됩니다:
- 병합 요청 위젯
- 병합 요청 변경 사항 보기
- 취약점 보고서
파이프라인은 SAST 및 DAST 스캐닝을 포함한 여러 작업으로 구성됩니다. 어떤 작업이든 이유 여하를 막론하고 완료되지 않으면 보안 대시보드에 SAST 스캐너 출력을 표시하지 않습니다. 예를 들어, SAST 작업이 완료되었지만 DAST 작업이 실패하면 보안 대시보드에 SAST 결과가 표시되지 않습니다. 실패 시, 분석기는 종료 코드를 출력합니다.
병합 요청 위젯
SAST 결과는 비교를 위한 대상 브랜치의 보고서가 사용 가능한 경우 병합 요청 위젯 영역에 표시됩니다. 병합 요청 위젯은 병합 요청에서 수행된 변경에 의해 도입된 SAST 결과와 해결 방법을 표시합니다.
병합 요청 변경 사항 보기
- 도입됨 GitLab 16.6에서
sast_reports_in_inline_diff
라는 플래그와 함께. 기본적으로 비활성화되어 있습니다.- GitLab 16.8에서 기본적으로 활성화되었습니다.
- GitLab 16.9에서 기능 플래그가 제거됨.
SAST 결과는 병합 요청 변경 사항 보기에서 표시됩니다. SAST 문제를 포함하는 줄은 가장자리 옆에 기호로 표시됩니다. 기호를 선택하면 문제 목록이 표시되고, 문제를 선택하면 해당 세부 정보를 볼 수 있습니다.
스캐너 기여하기
보안 스캐너 통합 문서에서는 다른 보안 스캐너를 GitLab에 통합하는 방법을 설명합니다.
구성
SAST 스캐닝은 귀하의 CI/CD 파이프라인에서 실행됩니다.
GitLab에서 관리하는 CI/CD 템플릿을 파이프라인에 추가하면 적절한 SAST 분석기가 자동으로 코드를 스캔하여 결과를 SAST 보고서 아티팩트로 저장합니다.
프로젝트에 대해 SAST를 구성하려면 다음을 수행할 수 있습니다:
- Auto SAST를 사용하여 Auto DevOps에서 제공.
- CI/CD YAML에서 SAST 구성.
- UI를 사용하여 SAST 구성.
여러 프로젝트에서 SAST를 활성화하려면 스캔 실행 강제 적용을 수행할 수 있습니다.
고급 SAST(오직 GitLab Ultimate에서 사용 가능)를 구성하려면 이러한 지침을 따르십시오.
CI/CD YAML에서 SAST 구성하기
SAST를 활성화하려면, SAST.gitlab-ci.yml
템플릿을 포함해야 합니다.
템플릿은 GitLab 설치의 일부로 제공됩니다.
다음 내용을 .gitlab-ci.yml
파일의 하단에 복사하여 붙여넣으세요.
이미 include
라인이 존재하는 경우, 그 아래에 template
라인만 추가하세요.
include:
- template: Jobs/SAST.gitlab-ci.yml
포함된 템플릿은 CI/CD 파이프라인에서 SAST 작업을 생성하고 프로젝트의 소스 코드를 스캔하여 가능한 취약점을 찾습니다.
결과는 나중에 다운로드하고 분석할 수 있는 SAST 보고서 아티팩트로 저장됩니다.
다운로드할 때마다 항상 가장 최근의 SAST 아티팩트를 받게 됩니다.
안정적인 SAST 템플릿 vs 최신 SAST 템플릿
SAST는 CI/CD 파이프라인에 보안 테스트를 통합하기 위해 두 가지 템플릿을 제공합니다:
-
SAST.gitlab-ci.yml
(권장)안정적인 템플릿은 신뢰할 수 있고 일관된 SAST 경험을 제공합니다. 대다수의 사용자와 CI/CD 파이프라인에서 안정성과 예측 가능한 동작이 필요한 프로젝트는 안정적인 템플릿을 사용해야 합니다.
-
이 템플릿은 최첨단 기능에 접근하고 테스트하려는 사람들을 위한 것입니다. 안정적이지 않으며 다음 주요 릴리스를 위해 계획된 중단 변경 사항이 포함될 수 있습니다. 이 템플릿은 새로운 기능과 업데이트를 안정적인 릴리스의 일부가 되기 전에 시도해볼 수 있는 기회를 제공하며, 잠재적인 불안정성에 익숙하고 새로운 기능에 대한 피드백을 제공하고자 하는 이들에게 이상적입니다.
UI를 사용하여 SAST 구성하기
UI를 사용하여 기본 설정 또는 사용자 정의를 통해 SAST를 활성화하고 구성할 수 있습니다.
사용할 수 있는 방법은 GitLab 라이센스 티어에 따라 다릅니다.
사용자 정의로 SAST 구성하기
제거됨 GitLab 16.2에서 UI의 개별 SAST 분석기 구성 옵션.
.gitlab-ci.yml
파일이 없거나 최소한의 구성 파일이 있을 때 가장 잘 작동합니다.복잡한 GitLab 구성 파일이 있는 경우 구문 분석에 실패할 수 있으며 오류가 발생할 수 있습니다.
사용자 정의로 SAST를 활성화하고 구성하려면:
-
왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
-
보안 > 보안 구성을 선택합니다.
-
프로젝트의 기본 브랜치에 대한 최신 파이프라인이 완료되고 유효한
SAST
아티팩트를 생성했으면 SAST 구성을 선택하고, 그렇지 않으면 Static Application Security Testing (SAST) 행에서 SAST 활성화를 선택합니다. -
사용자 정의 SAST 값을 입력합니다.
사용자 정의 값은
.gitlab-ci.yml
파일에 저장됩니다. SAST 구성 페이지에 없는 CI/CD 변수의 값은 GitLab SAST 템플릿에서 상속됩니다. -
Merge Request 생성을 선택합니다.
-
Merge Request를 검토하고 병합합니다.
이제 파이프라인에 SAST 작업이 포함됩니다.
기본 설정으로 SAST 구성하기
.gitlab-ci.yml
파일이 없거나 최소한의 구성 파일을 사용할 때 가장 잘 작동합니다.복잡한 GitLab 구성 파일이 있는 경우, 성공적으로 파싱되지 않을 수 있으며, 오류가 발생할 수 있습니다.
기본 설정으로 SAST를 활성화하고 구성하려면:
-
왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
-
보안 > 보안 구성을 선택합니다.
-
SAST 섹션에서 병합 요청으로 구성을 선택합니다.
-
SAST를 활성화하려면 병합 요청을 검토하고 병합합니다.
이제 파이프라인에는 SAST 작업이 포함됩니다.
SAST 작업 재정의하기
작업 정의를 재정의하려면(예를 들어, variables
, dependencies
또는 rules
과 같은 속성을 변경하려면), 재정의할 SAST 작업과 동일한 이름의 작업을 선언합니다. 이 새로운 작업을 템플릿 포함 이후에 배치하고 그 아래에 추가 키를 지정합니다. 예를 들어, 이는 spotbugs
분석기에 대해 FAIL_NEVER
를 활성화합니다:
include:
- template: Jobs/SAST.gitlab-ci.yml
spotbugs-sast:
variables:
FAIL_NEVER: 1
마이너 이미지 버전 고정하기
GitLab이 관리하는 CI/CD 템플릿은 주요 버전을 지정하며, 해당 주요 버전 내에서 자동으로 최신 분석기 릴리스를 가져옵니다.
경우에 따라 특정 버전을 사용해야 할 수도 있습니다.
예를 들어, 이후 릴리스에서 회귀를 피해야 할 필요가 있을 수 있습니다.
자동 업데이트 동작을 재정의하려면, SAST.gitlab-ci.yml
템플릿을 포함한 후 CI/CD 구성 파일에서 SAST_ANALYZER_IMAGE_TAG
CI/CD 변수를 설정합니다.
이 변수를 특정 작업 내에서만 설정하세요.
상위 레벨에서 설정하면 다른 SAST 분석기에 대해 설정한 버전이 사용됩니다.
태그를 다음과 같이 설정할 수 있습니다:
- 주요 버전, 예:
3
. 파이프라인은 이 주요 버전 내에서 릴리스된 모든 마이너 또는 패치 업데이트를 사용합니다. - 마이너 버전, 예:
3.7
. 파이프라인은 이 마이너 버전 내에서 릴리스된 모든 패치 업데이트를 사용합니다. - 패치 버전, 예:
3.7.0
. 파이프라인은 업데이트를 받지 않습니다.
이 예제는 semgrep
분석기의 특정 마이너 버전과 brakeman
분석기의 특정 패치 버전을 사용합니다:
include:
- template: Jobs/SAST.gitlab-ci.yml
semgrep-sast:
variables:
SAST_ANALYZER_IMAGE_TAG: "3.7"
brakeman-sast:
variables:
SAST_ANALYZER_IMAGE_TAG: "3.1.1"
개인 레포지토리에 대한 자격 증명을 전달하기 위해 CI/CD 변수 사용하기
일부 분석기는 분석을 수행하기 위해 프로젝트의 종속성을 다운로드해야 합니다.
그 결과, 이러한 종속성은 개인 Git 레포지토리에 있을 수 있으며, 따라서 다운로드하기 위해 사용자 이름 및 비밀번호와 같은 자격 증명이 필요합니다.
분석기에 따라 이러한 자격 증명은 사용자 정의 CI/CD 변수를 통해 제공될 수 있습니다.
개인 Maven 레포지토리에 사용자 이름 및 비밀번호를 전달하기 위해 CI/CD 변수 사용하기
개인 Maven 레포지토리에 로그인 자격 증명이 필요한 경우, MAVEN_CLI_OPTS
CI/CD 변수를 사용할 수 있습니다.
개인 Maven 레포지토리를 사용하는 방법에 대한 자세한 내용을 읽어보세요.
Kubesec 분석기 활성화
SCAN_KUBERNETES_MANIFESTS
를 "true"
로 설정하여
Kubesec 분석기를 활성화해야 합니다. .gitlab-ci.yml
에서 다음과 같이 정의합니다:
include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
SCAN_KUBERNETES_MANIFESTS: "true"
Rust 애플리케이션 스캔하기
Rust 애플리케이션을 스캔하려면 다음을 수행해야 합니다:
-
Rust에 대한 사용자 정의 규칙 집합을 제공합니다. 저장소 루트의
.gitlab/
디렉토리에sast-ruleset.toml
이라는 파일을 만듭니다. 다음 내용을 추가합니다:[semgrep] description = "Rust ruleset for Semgrep" targetdir = "/sgrules" timeout = 60 [[semgrep.passthrough]] type = "url" value = "https://semgrep.dev/c/p/rust" target = "rust.yml"
이 구성은 오픈 소스 Semgrep 규칙 집합을 사용합니다. 사용자 정의 규칙 집합에 대한 내용을 더 읽어보세요.
-
Rust(
.rs
) 파일을 감지하는 규칙을 추가하기 위해semgrep-sast
작업을 재정의합니다..gitlab-ci.yml
파일에 다음을 정의합니다:include: - template: Jobs/SAST.gitlab-ci.yml semgrep-sast: rules: - if: $CI_COMMIT_BRANCH exists: - '**/*.rs' # semgrep-sast 템플릿에서 스캔해야 하는 다른 파일 확장자를 포함하세요: Jobs/SAST.gitlab-ci.yml
사전 컴파일
대부분의 GitLab SAST 분석기는 소스 코드를 직접 스캔하며 먼저 컴파일할 필요가 없습니다.
그러나 기술적인 이유로 SpotBugs 기반 분석기는 컴파일된 바이트코드를 스캔합니다.
기본적으로 SpotBugs 기반 분석기는 종속성을 자동으로 가져오고 코드를 컴파일하려고 시도합니다.
자동 컴파일은 다음과 같이 실패할 수 있습니다:
- 프로젝트에 사용자 정의 빌드 구성이 필요합니다.
- 분석기에 내장되어 있지 않은 언어 버전을 사용합니다.
이러한 문제를 해결하려면 분석기 컴파일 단계를 건너뛰고 파이프라인의 이전 단계에서 아티팩트를 직접 제공할 수 있습니다.
이 전략은 _사전 컴파일_이라고 불립니다.
사전 컴파일을 사용하려면:
-
프로젝트의 종속성을 프로젝트 작업 디렉토리의 디렉토리로 출력한 후, 해당 디렉토리를 아티팩트로 저장합니다.
artifacts: paths
구성을 설정하여 저장하세요. -
자동 컴파일을 비활성화하려면 분석기 작업에
COMPILE: "false"
CI/CD 변수를 제공합니다. -
분석기 작업의 종속성으로 컴파일 단계를 추가합니다.
분석기가 컴파일된 아티팩트를 인식하도록 하려면,
vendored 디렉토리의 경로를 명시적으로 지정해야 합니다.
이 구성은 프로젝트 설정에 따라 달라질 수 있습니다.
Maven 프로젝트의 경우 MAVEN_REPO_PATH
를 사용할 수 있습니다.
사용 가능한 옵션의 전체 목록은 분석기 설정을 참조하세요.
다음 예시는 Maven 프로젝트를 사전 컴파일하고 SpotBugs 기반 SAST 분석기에 제공하는 방법입니다:
stages:
- build
- test
include:
- template: Jobs/SAST.gitlab-ci.yml
build:
image: maven:3.6-jdk-8-slim
stage: build
script:
- mvn package -Dmaven.repo.local=./.m2/repository
artifacts:
paths:
- .m2/
- target/
spotbugs-sast:
dependencies:
- build
variables:
MAVEN_REPO_PATH: $CI_PROJECT_DIR/.m2/repository
COMPILE: "false"
artifacts:
reports:
sast: gl-sast-report.json
병합 요청 파이프라인에서 작업 실행
병합 요청 파이프라인에서 보안 스캐닝 도구 사용을 참조하세요.
사용 가능한 CI/CD 변수
SAST는 .gitlab-ci.yml
의 variables
매개변수를 사용하여 구성할 수 있습니다.
다음 예는 모든 작업에서 SEARCH_MAX_DEPTH
변수를 10
으로 재정의하는 SAST 템플릿을 포함합니다. 템플릿은 파이프라인 구성 전에 평가됩니다, 따라서 변수의 마지막 언급이 우선합니다.
include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
SEARCH_MAX_DEPTH: 10
사용자 정의 인증 기관
사용자 정의 인증 기관을 신뢰하려면, SAST 환경에서 신뢰할 CA 인증서 번들을 ADDITIONAL_CA_CERT_BUNDLE
변수로 설정합니다. ADDITIONAL_CA_CERT_BUNDLE
값은 X.509 PEM 공개 키 인증서의 텍스트 표현을 포함해야 합니다. 예를 들어, .gitlab-ci.yml
파일에서 이 값을 설정하려면 다음을 사용하세요:
variables:
ADDITIONAL_CA_CERT_BUNDLE: |
-----BEGIN CERTIFICATE-----
MIIGqTCCBJGgAwIBAgIQI7AVxxVwg2kch4d56XNdDjANBgkqhkiG9w0BAQsFADCB
...
jWgmPqF3vUbZE0EyScetPJquRFRKIesyJuBFMAs=
-----END CERTIFICATE-----
ADDITIONAL_CA_CERT_BUNDLE
값은 UI에서 사용자 정의 변수로 구성될 수도 있습니다. 이 경우 인증서의 경로가 필요한 file
형식이나 인증서의 텍스트 표현이 필요한 변수 형식으로 설정할 수 있습니다.
도커 이미지
다음은 도커 이미지와 관련된 CI/CD 변수입니다.
CI/CD 변수 | 설명 |
---|---|
SECURE_ANALYZERS_PREFIX |
기본 이미지를 제공하는 도커 레지스트리의 이름을 재정의합니다 (프록시). 분석기 사용자 정의 에 대해 자세히 알아보세요. |
SAST_EXCLUDED_ANALYZERS |
절대 실행되지 않아야 하는 기본 이미지 이름입니다. 분석기 사용자 정의 에 대해 자세히 알아보세요. |
SAST_ANALYZER_IMAGE_TAG |
분석기 이미지의 기본 버전을 재정의합니다. 분석기 이미지 버전 고정 에 대해 자세히 알아보세요. |
SAST_IMAGE_SUFFIX |
이미지 이름에 추가되는 접미사입니다. -fips 로 설정된 경우, FIPS-지원 이미지를 스캔에 사용합니다. FIPS-지원 이미지 에 대한 자세한 내용은 여기에서 확인하세요. |
취약성 필터
CI/CD 변수 | 설명 | 기본값 | 분석기 |
---|---|---|---|
SAST_EXCLUDED_PATHS
|
취약성을 제외할 경로의 쉼표로 구분된 목록입니다. 이 변수를 처리하는 방법은 사용되는 분석기에 따라 다릅니다.1 |
spec, test, tests, tmp
|
Semgrep2,3 |
GitLab Advanced SAST2,3 | |||
다른 모든 SAST 분석기3 | |||
SAST_SPOTBUGS_EXCLUDED_BUILD_PATHS
|
빌드 및 스캔에서 제외할 디렉토리의 쉼표로 구분된 목록입니다. | 없음 | SpotBugs4 |
SEARCH_MAX_DEPTH
|
분석기가 스캔할 일치하는 파일을 검색할 때 내려갈 디렉토리 수준의 수입니다.5 |
20
|
Semgrep |
GitLab Advanced SAST | |||
4
|
다른 모든 SAST 분석기 |
각주:
-
프로젝트 도구에서 사용하는 임시 디렉토리를 제외해야 할 수도 있습니다.
이는 오탐을 생성할 수 있기 때문입니다. 경로를 제외하려면 기본 제외 경로를 복사하여 붙여넣은 다음 자신의 제외할 경로를 추가하세요. 기본 제외 경로를 지정하지 않으면 기본값이 재정의되며 지정한 경로만 SAST 스캔에서 제외됩니다. -
이 분석기에 대해
SAST_EXCLUDED_PATHS
는 스캔이 실행되기 전에 적용되는 사전 필터로 구현됩니다.분석기는 쉼표로 구분된 패턴 중 하나와 경로가 일치하는 파일이나 디렉토리를 건너뜁니다.
예를 들어,
SAST_EXCLUDED_PATHS
가*.py,tests
로 설정된 경우:-
*.py
는 다음을 무시합니다:foo.py
src/foo.py
foo.py/bar.sh
-
tests
는 다음을 무시합니다:tests/foo.py
a/b/tests/c/foo.py
각 패턴은 gitignore와 동일한 구문을 사용하는 glob 스타일 패턴입니다.
-
-
이 분석기에 대해
SAST_EXCLUDED_PATHS
는 스캔이 실행된 후에 적용되는 후처리 필터로 구현됩니다.패턴은 glob(지원되는 패턴은
doublestar.Match
을 참조) 또는 파일 또는 폴더 경로일 수 있습니다(예:doc,spec
). 상위 디렉토리도 패턴과 일치합니다.SAST_EXCLUDED_PATHS
의 후처리 필터 구현은 모든 SAST 분석기에 대해 사용 가능합니다. 일부 SAST 분석기는 2와 같은 각주가 있는 분석기처럼SAST_EXCLUDED_PATHS
를 사전 필터와 후처리 필터 모두로 구현합니다. 사전 필터는 스캔할 파일 수를 줄이기 때문에 더 효율적입니다.사전 필터와 후처리 필터를 모두 지원하는 분석기에 대해 먼저 사전 필터가 적용되고, 그 다음 남은 취약성에 후처리 필터가 적용됩니다.
-
이 변수를 위해 경로 패턴은 glob일 수 있습니다.
(지원되는 패턴은doublestar.Match
을 참조).
경로 패턴이 지원되는 빌드 파일과 일치하는 경우 디렉토리는 빌드 프로세스에서 제외됩니다:build.sbt
grailsw
gradlew
build.gradle
mvnw
pom.xml
build.xml
예를 들어,
project/subdir/pom.xml
경로를 포함하는maven
프로젝트의 빌드 및 스캔을 제외하려면, 빌드 파일과 명시적으로 일치하는 glob 패턴(예:project/*/*.xml
또는**/*.xml
또는project/subdir/pom.xml
와 같은 정확한 일치)을 전달해야 합니다.패턴에 대해 상위 디렉토리를 전달하면
project
또는project/subdir
와 같은 경우, 이 경우 빌드 파일이 패턴과 명시적으로 일치하지 않기 때문에 해당 디렉토리는 빌드에서 제외되지 않습니다. -
SAST CI/CD 템플릿
은 사용된 프로그래밍 언어를 탐지하기 위해 리포지토리를 검색하고, 일치하는 분석기를 선택합니다. 그런 다음 각 분석기는 스캔해야 할 특정 파일이나 디렉토리를 찾기 위해 코드베이스를 검색합니다.
SEARCH_MAX_DEPTH
의 값을 설정하여 분석기의 검색 단계가 span해야 하는 디렉토리 수준 수를 지정하세요.
분석기 설정
일부 분석기는 CI/CD 변수를 사용하여 사용자 지정할 수 있습니다.
CI/CD 변수 | 분석기 | 설명 |
---|---|---|
GITLAB_ADVANCED_SAST_ENABLED |
GitLab Advanced SAST |
Advanced SAST 스캔을 활성화하려면 true 로 설정하세요 (GitLab Ultimate에서만 사용 가능). 기본값: false . |
SCAN_KUBERNETES_MANIFESTS |
Kubesec | Kubernetes 매니페스트를 스캔하려면 "true" 로 설정하세요. |
KUBESEC_HELM_CHARTS_PATH |
Kubesec |
kubesec 가 스캔할 Kubernetes 매니페스트를 생성하는 데 사용하는 Helm 차트의 선택적 경로입니다. 의존성이 정의되어 있으면, 필요한 의존성을 가져오기 위해 before_script 에서 helm dependency build 를 실행해야 합니다. |
KUBESEC_HELM_OPTIONS |
Kubesec |
helm 실행 파일에 대한 추가 인수입니다. |
COMPILE |
SpotBugs | 프로젝트 컴파일 및 의존성 가져오기를 비활성화하려면 false 로 설정하세요. |
ANT_HOME |
SpotBugs |
ANT_HOME 변수입니다. |
ANT_PATH |
SpotBugs |
ant 실행 파일의 경로입니다. |
GRADLE_PATH |
SpotBugs |
gradle 실행 파일의 경로입니다. |
JAVA_OPTS |
SpotBugs |
java 실행 파일에 대한 추가 인수입니다. |
JAVA_PATH |
SpotBugs |
java 실행 파일의 경로입니다. |
SAST_JAVA_VERSION |
SpotBugs | 사용할 Java 버전입니다. GitLab 15.0부터 시작하여 지원되는 버전은 11 및 17 (기본값)입니다. GitLab 15.0 이전에는 지원되는 버전은 8 (기본값) 및 11 입니다. |
MAVEN_CLI_OPTS |
SpotBugs |
mvn 또는 mvnw 실행 파일에 대한 추가 인수입니다. |
MAVEN_PATH |
SpotBugs |
mvn 실행 파일의 경로입니다. |
MAVEN_REPO_PATH |
SpotBugs | Maven 로컬 저장소의 경로입니다 ( maven.repo.local 속성의 축약형). |
SBT_PATH |
SpotBugs |
sbt 실행 파일의 경로입니다. |
FAIL_NEVER |
SpotBugs | 컴파일 실패를 무시하려면 1 로 설정하세요. |
SAST_SEMGREP_METRICS |
Semgrep | 익명화된 스캔 메트릭스를 r2c로 보내지 않도록 하려면 "false" 로 설정하세요. 기본값: true . |
SAST_SCANNER_ALLOWED_CLI_OPTS |
Semgrep | 스캔 작업을 실행할 때 기본 보안 스캐너에 전달되는 CLI 옵션(값이 있는 인수 또는 플래그)입니다. 수용되는 옵션은 제한된 세트입니다 options. CLI 옵션과 해당 값을 공백 또는 등호(= ) 문자를 사용하여 구분하세요. 예: name1 value1 또는 name1=value1 . 여러 옵션은 공백으로 구분해야 합니다. 예: name1 value1 name2 value2 . GitLab 15.3에서 추가됨. |
SAST_RULESET_GIT_REFERENCE |
All | 사용자 정의 규칙 세트 구성으로의 경로를 정의합니다. 프로젝트에 .gitlab/sast-ruleset.toml 파일이 커밋되어 있는 경우, 해당 로컬 구성이 우선하며 SAST_RULESET_GIT_REFERENCE 의 파일은 사용되지 않습니다. 이 변수는 Ultimate 등급에서만 사용할 수 있습니다. |
SECURE_ENABLE_LOCAL_CONFIGURATION |
All | 사용자 정의 규칙 세트 구성 사용 옵션을 활성화합니다. SECURE_ENABLE_LOCAL_CONFIGURATION 가 false 로 설정된 경우, 프로젝트의 .gitlab/sast-ruleset.toml 에 있는 사용자 정의 규칙 세트 구성 파일은 무시되며 SAST_RULESET_GIT_REFERENCE 의 파일 또는 기본 구성이 우선합니다. |
보안 스캐너 구성
SAST 분석기는 내부적으로 OSS 보안 스캐너를 사용하여 분석을 수행합니다.
우리는 보안 스캐너에 대한 권장 구성을 설정하므로 이를 조정하는 것에 대해 걱정할 필요가 없습니다.
하지만 기본 스캐너 구성이 귀하의 요구 사항에 맞지 않는 드문 경우가 있을 수 있습니다.
스캐너 동작의 일부 사용자 지정을 허용하기 위해 기본 스캐너에 제한된 플래그 세트를 추가할 수 있습니다.
플래그는 SAST_SCANNER_ALLOWED_CLI_OPTS
CI/CD 변수에 지정합니다.
이 플래그는 스캐너의 CLI 옵션에 추가됩니다.
분석기 | CLI 옵션 | 설명 |
---|---|---|
Semgrep |
--max-memory
|
단일 파일에서 규칙을 실행할 때 사용할 최대 시스템 메모리(MB)를 설정합니다. |
--max-target-bytes
|
스캔할 파일의 최대 크기입니다. 이보다 큰 입력 프로그램은 무시됩니다.
이 필터를 비활성화하려면
참고:
이 플래그는 기본값으로 유지해야 합니다. 또한, 이 플래그를 변경하여
축소된 JavaScript를 스캔하는 것은 잘 작동하지 않을 가능성이 높으므로
피해야 하며, |
|
--timeout
|
단일 파일에서 규칙을 실행하는 데 소요할 최대 시간(초)입니다.
시간 제한이 없으려면 0 으로 설정하세요.
타임아웃 값은 정수여야 하며, 예를 들어: 10 또는 15 와 같이 설정합니다.
기본값은 5 입니다.
|
|
SpotBugs |
-effort
|
분석 노력 수준을 설정합니다. 유효한 값은 정해진 방식으로 증가하는 정밀도와 더 많은 취약성을 감지할 수 있는 능력을 가지고 있습니다.
min , less , more 및 max 입니다.
기본값은 max 로 설정되어 있으며, 프로젝트의 크기에 따라 스캔을 완료하려면 더 많은 메모리와 시간이 필요할 수 있습니다.
메모리 또는 성능 문제에 직면하면 분석 노력 수준을 낮은 값으로 줄일 수 있습니다. 예: -effort less 와 같이 설정하세요.
|
커스텀 CI/CD 변수
앞서 언급한 SAST 구성 CI/CD 변수 외에, 모든 커스텀 변수는 구성에서 SAST 벤더 템플릿이 사용되는 경우, 기본 SAST 분석기 이미지로 전파됩니다.
분석에서 코드 제외하기
개별 코드 줄이나 블록을 표시하여 취약점 분석에서 제외할 수 있습니다. 모든 취약점은 Vulnerability Management를 통해 관리해야 하며,
이 방법으로 주석을 통한 취약점 발견하기 전에 SAST_EXCLUDED_PATHS
를 사용하여 스캔된 파일 경로를 조정해야 합니다.
Semgrep 기반 분석기를 사용할 때, 다음 옵션도 사용할 수 있습니다:
-
코드 줄 무시하기 - 줄 끝에
// nosemgrep:
주석을 추가합니다(접두사는 개발 언어에 따라 다릅니다).Java 예시:
vuln_func(); // nosemgrep
Python 예시:
vuln_func(); # nosemgrep
-
특정 규칙에 대한 코드 줄 무시하기 - 줄 끝에
// nosemgrep: RULE_ID
주석을 추가합니다(접두사는 개발 언어에 따라 다릅니다). -
파일이나 디렉토리 무시하기 - 리포지토리의 루트 디렉토리 또는 프로젝트 작업 디렉토리에
.semgrepignore
파일을 생성하고 그곳에 파일과 폴더에 대한 패턴을 추가합니다.
자세한 내용은 Semgrep 문서를 참조하세요.
오프라인 환경에서 SAST 실행
인터넷을 통해 외부 리소스에 대한 접근이 제한되거나 간헐적인 자가 관리 GitLab 인스턴스의 경우, SAST 작업이 성공적으로 실행되도록 일부 조정이 필요합니다. 자세한 내용은 오프라인 환경을 참조하세요.
오프라인 SAST 요구 사항
오프라인 환경에서 SAST를 사용하려면 다음이 필요합니다:
-
docker
또는kubernetes
실행기를 사용하는 GitLab Runner. - SAST 분석기 이미지의 로컬 사본이 있는 Docker 컨테이너 레지스트리.
- 패키지의 인증서 검사 구성(선택 사항).
GitLab Runner는 기본 pull_policy
가 always
로 설정되어 있습니다,
즉, 로컬 사본이 있더라도 GitLab 컨테이너 레지스트리에서 Docker 이미지를 끌어오려고 합니다. 오프라인 환경에서는
GitLab Runner pull_policy
를 if-not-present
로 설정하여
로컬에서만 사용 가능한 Docker 이미지를 사용할 것을 권장합니다. 그러나 오프라인 환경이 아닐 경우, CI/CD 파이프라인에서 업데이트된 스캐너를 사용하도록
always
로 유지하는 것을 권장합니다.
GitLab SAST 분석기 이미지를 Docker 레지스트리에 사용 가능하게 만들기
모든 지원되는 언어 및 프레임워크로 SAST를 사용하려면,
다음 기본 SAST 분석기 이미지를 registry.gitlab.com
에서 로컬 Docker 컨테이너 레지스트리로 가져옵니다:
registry.gitlab.com/security-products/gitlab-advanced-sast:1
registry.gitlab.com/security-products/kubesec:5
registry.gitlab.com/security-products/pmd-apex:5
registry.gitlab.com/security-products/semgrep:5
registry.gitlab.com/security-products/sobelow:5
registry.gitlab.com/security-products/spotbugs:5
로컬 오프라인 Docker 레지스트리에 Docker 이미지를 가져오는 과정은 귀하의 네트워크 보안 정책에 따라 다릅니다. 외부 리소스를 가져오거나 일시적으로 접근할 수 있는 승인된 과정을 찾으려면 IT 직원에게 문의하십시오. 이러한 스캐너는 정기적으로 업데이트됩니다 새로운 정의로, 때때로 귀하가 직접 업데이트할 수 있습니다.
Docker 이미지를 파일로 저장하고 전송하는 방법에 대한 자세한 내용은 Docker 문서의
docker save
, docker load
,
docker export
, 및 docker import
를 참조하세요.
사용자 지정 인증 기관에 대한 지원이 필요한 경우
사용자 지정 인증 기관에 대한 지원은 다음 버전에서 도입되었습니다.
분석기 | 버전 |
---|---|
kubesec |
v2.1.0 |
pmd-apex |
v2.1.0 |
semgrep |
v0.0.1 |
sobelow |
v2.2.0 |
spotbugs |
v2.7.1 |
로컬 SAST 분석기를 사용하기 위한 SAST CI/CD 변수 설정
다음 구성을 .gitlab-ci.yml
파일에 추가하세요. SECURE_ANALYZERS_PREFIX
를 로컬 Docker 컨테이너 레지스트리를 참조하도록 바꿔야 합니다:
include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
SECURE_ANALYZERS_PREFIX: "localhost:5000/analyzers"
이제 SAST 작업은 인터넷에 접속하지 않고도 코드를 스캔하고 보안 보고서를 생성하는 로컬 복사본의 SAST 분석기를 사용해야 합니다.
패키지의 인증서 확인 구성하기
SAST 작업이 패키지 관리자를 호출하는 경우, 인증서 확인을 구성해야 합니다. 오프라인 환경에서는 외부 소스와의 인증서 확인이 불가능합니다. 자가 서명된 인증서를 사용하거나 인증서 확인을 비활성화하십시오. 패키지 관리자의 설명서를 참조하여 지침을 확인하세요.
SELinux에서 SAST 실행하기
기본적으로 SAST 분석기는 SELinux에서 호스팅된 GitLab 인스턴스에서 지원됩니다. 오버라이드된 SAST 작업에서 before_script
를 추가하는 것은 SELinux에서 호스팅된 러너가 제한된 권한을 가지므로 작동하지 않을 수 있습니다.