- 기능
- 요구 사항
- 지원되는 언어 및 프레임워크
- 지원 종료된 분석기
- 고급 취약성 추적
- 자동 취약성 해결
- 지원되는 배포
- 출력
- SAST 결과 보기
- 스캐너 기여
- 구성
- 오프라인 환경에서 SAST 실행
- SELinux에서 SAST 실행
정적 어플리케이션 보안 테스트(SAST)
만약 GitLab CI/CD를 사용 중이라면, 정적 어플리케이션 보안 테스트(SAST)를 사용하여 소스 코드의 알려진 취약점을 확인할 수 있습니다. SAST 분석기를 모든 GitLab 티어에서 실행할 수 있습니다. 분석기는 작업 artifact로 JSON 형식으로 보고서를 출력합니다.
GitLab Ultimate에서는 SAST 결과를 다음과 같이 처리할 수 있습니다:
- 승인 워크플로에 사용
- 보안 대시보드에서 검토
더 많은 정보는 기능을 참조하세요.
기능
다음 표는 각 기능이 사용 가능한 GitLab 티어를 나열합니다.
기능 | Free 및 Premium에서 | Ultimate에서 |
---|---|---|
오픈소스 분석기로 기본 스캔 | Yes | Yes |
다운로드 가능한 SAST JSON 보고서 | Yes | Yes |
GitLab 고급 SAST를 사용한 교차 파일, 교차 기능 스캔 | No | Yes |
병합 요청 위젯에서의 새로운 결과 찾기 | No | Yes |
병합 요청 변경 보기에서의 새로운 결과 찾기 | No | Yes |
취약점 관리 | No | Yes |
UI 기반 스캐너 구성(설정 방법은sast-by-using-the-ui) | No | Yes |
규칙 집합 사용자 정의 | No | Yes |
고급 취약점 추적 | No | Yes |
요구 사항
인스턴스에서 SAST 분석기를 실행하기 전에 다음 사항을 확인하세요:
-
docker
또는kubernetes
executor가 있는 Linux 기반 GitLab Runner. GitLab.com의 공유 러너를 사용하는 경우, 기본적으로 활성화되어 있습니다.- Windows 러너는 지원되지 않습니다.
- amd64 이외의 CPU 아키텍처는 지원되지 않습니다.
- GitLab CI/CD 구성(
.gitlab-ci.yml
)은 기본적으로 포함된test
단계를 포함해야 합니다..gitlab-ci.yml
파일에서 단계를 재정의하는 경우test
단계가 필요합니다.
지원되는 언어 및 프레임워크
GitLab SAST는 다양한 프로그래밍 언어 및 프레임워크를 스캔하는 것을 지원합니다. SAST 활성화 후에 프로젝트에서 둘 이상의 언어를 사용하더라도 적절한 분석기가 자동으로 실행됩니다.
더 많은 정보는 언어 지원에 대한 계획을 참조하세요.
언어 / 프레임워크 | 스캔에 사용 된 분석기 | 최소 지원 GitLab 버전 |
---|---|---|
.NET (모든 버전, C#만) | Semgrep with GitLab-managed rules | 15.4 |
.NET (모든 버전, C#만) | 고급 SAST | 17.3 |
Apex (Salesforce) | PMD | 12.1 |
C | Semgrep with GitLab-managed rules | 14.2 |
C/C++ | Semgrep with GitLab-managed rules | 16.11 |
Elixir (Phoenix) | Sobelow | 11.1 |
Go | Semgrep with GitLab-managed rules | 14.4 |
Go | 고급 SAST | 17.3 |
Groovy1 | SpotBugs with the find-sec-bugs plugin | 11.3 (Gradle) & 11.9 (Maven, SBT) |
Helm Charts | Kubesec | 13.1 |
Java (모든 빌드 시스템) | Semgrep with GitLab-managed rules | 14.10 |
Java (Android) | Semgrep with GitLab-managed rules | 16.11 |
Java (모든 빌드 시스템) | 고급 SAST | 17.3 |
JavaScript | Semgrep with GitLab-managed rules | 13.10 |
JavaScript | 고급 SAST | 17.3 |
Kotlin (Android) | Semgrep with GitLab-managed rules | 16.11 |
Kotlin (일반)1 | Semgrep with GitLab-managed rules | 16.11 |
Kubernetes manifest | Kubesec | 12.6 |
Node.js | Semgrep with GitLab-managed rules | 16.11 |
Node.js | 고급 SAST | 17.3 |
Objective-C (iOS) | Semgrep with GitLab-managed rules | 16.11 |
PHP | Semgrep with GitLab-managed rules | 16.11 |
Python | Semgrep with GitLab-managed rules | 13.9 |
Python | 고급 SAST | 17.3 |
React | Semgrep with GitLab-managed rules | 13.10 |
Ruby | Semgrep with GitLab-managed rules | 16.11 |
Ruby | 고급 SAST | 17.5 |
Ruby on Rails | Semgrep with GitLab-managed rules | 16.11 |
Rust 2 | Semgrep with user-provided Custom rules | 17.1 |
Scala (모든 빌드 시스템) | Semgrep with GitLab-managed rules | 16.0 |
Scala 1 | SpotBugs with the find-sec-bugs plugin | 11.0 (SBT) & 11.9 (Gradle, Maven) |
Swift (iOS) | Semgrep with GitLab-managed rules | 16.11 |
TypeScript | Semgrep with GitLab-managed rules | 13.10 |
TypeScript | 고급 SAST | 17.3 |
- SpotBugs 기반 분석기는 Gradle, Maven, 및 SBT를 지원합니다. 또한 Gradle wrapper, Grails, 그리고 Maven wrapper와 같은 변형과 함께 사용할 수 있습니다. 그러나 SpotBugs는 Ant 기반 프로젝트에서 사용 시에 제한 사항이 있습니다. Ant 기반의 Java 또는 Scala 프로젝트의 경우, 고급 SAST 또는 Semgrep 기반 분석기를 사용해야 합니다.
- 사용자 정의 ruleset과 semgrep-sast CI 작업의 override가 필요합니다. 예시는 [Scanning Rust applications](https://docs.gitlab.com/ee/user/application_security/sast/index.html#scanning-rust-applications)를 참조하세요.
지원 종료된 분석기
다음 GitLab 분석기는 지원 종료 상태에 도달하여 업데이트를받지 않습니다. 이들은 Semgrep 기반 분석기 및 GitLab-managed rules에 의해 대체되었습니다.
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 with the find-sec-bugs plugin | 10.6 (Maven), 10.8 (Gradle) & 11.9 (SBT) | 15.4 |
Python | bandit | 10.3 | 15.4 |
React | ESLint react plugin | 12.5 | 15.4 |
JavaScript | ESLint security plugin | 11.8 | 15.4 |
TypeScript | ESLint security plugin | 11.9, with ESLint in 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#, 고급 SAST 및 Semgrep 기반 분석기에서만
- Go, 고급 SAST 및 Semgrep 기반 분석기에서만
- Java, 고급 SAST 및 Semgrep 기반 분석기에서만
- JavaScript, 고급 SAST 및 Semgrep 기반 분석기에서만
- PHP, Semgrep 기반 분석기에서만
- Python, 고급 SAST 및 Semgrep 기반 분석기에서만
- Ruby, Semgrep 기반 분석기에서만
더 많은 언어 및 분석기의 지원은 이 Epic에서 추적됩니다.
자세한 정보는 비밀 프로젝트 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 호환 방식으로 SAST를 사용하려면 다른 분석기를 실행에서 제외해야 합니다. FIPS 활성화 이미지를 사용하여 Advanced SAST나 Semgrep을 루트가 아닌 사용자로 실행할 경우 run_as_user
속성을 이미지에서 생성한 gitlab
사용자(ID: 1000
)의 ID로 업데이트해야 합니다.
(https://gitlab.com/gitlab-org/security-products/analyzers/semgrep/-/blob/a5d822401014f400b24450c92df93467d5bbc6fd/Dockerfile.fips#L58).
출력
SAST는 작업 아티팩트로 gl-sast-report.json
파일을 출력합니다. 이 파일에는 감지된 모든 취약성의 세부 정보가 포함되어 있습니다.
GitLab 외부에서 처리하기 위해 파일을 다운로드할 수 있습니다.
자세한 내용은 다음을 참조하세요: - SAST 보고서 파일 스키마 - 예시 SAST 보고서 파일
SAST 결과 보기
GitLab에 의해 SAST 보고서 파일이 처리되고 그 내용이 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를 구성하려면 다음을 수행할 수 있습니다: - 자동 SAST 사용(Auto DevOps로 제공). - CI/CD YAML에서 SAST 구성. - UI를 사용하여 SAST 구성.
스캔 실행을 강제적으로 적용하여 여러 프로젝트에 걸쳐 SAST를 활성화할 수 있습니다.
GitLab Ultimate 전용의 Advanced SAST를 구성하려면 다음 지침을 따르세요.
CI/CD YAML에서 SAST 구성
SAST를 활성화하려면, SAST.gitlab-ci.yml
템플릿을 .gitlab-ci.yml
파일의 맨 아래에 복사하여 붙여넣습니다. include
줄이 이미 존재하는 경우에는 해당 줄 아래에 template
줄만 추가하세요.
include:
- template: Jobs/SAST.gitlab-ci.yml
포함된 템플릿은 CI/CD 파이프라인에서 SAST 작업을 생성하고 프로젝트 소스 코드를 가능한 취약점에 대해 스캔합니다.
결과는 나중에 다운로드하고 분석할 SAST 보고서 artifact로 저장됩니다. 다운로드시 항상 사용 가능한 최신 SAST artifact를 받습니다.
안정적인 SAST 템플릿 vs 최신 SAST 템플릿
SAST는 CI/CD 파이프라인에 보안 테스트를 통합하기 위한 두 가지 템플릿을 제공합니다:
-
SAST.gitlab-ci.yml
(추천)안정적인 템플릿은 신뢰성 있고 일관된 SAST 경험을 제공합니다. 대부분의 사용자 및 안정성과 예측 가능한 동작이 필요한 프로젝트에 대해 안정적인 템플릿을 사용해야 합니다.
-
이 템플릿은 최신 기능을 사용하고 테스트하고자 하는 사용자를 위한 것입니다. 안정성이 보장되지 않으며 다음 주요 릴리스에서 계획된 패치가 포함될 수 있습니다. 이 템플릿을 사용하면 안정 버전의 일부가 되기 전에 새로운 기능과 업데이트를 시도하여 새로운 기능에 대한 피드백을 제공할 수 있습니다.
UI를 이용한 SAST 구성
기본 설정 또는 사용자 정의를 사용하여 UI를 통해 SAST를 활성화하고 구성할 수 있습니다. 사용할 수 있는 방법은 GitLab 라이선스 티어에 따라 다릅니다.
사용자 정의로 SAST 구성
GitLab 16.2에서 UI에서 개별 SAST 분석기 구성 옵션을 제거했습니다.
참고:
구성 도구는 존재하지 않는 .gitlab-ci.yml
파일 또는 최소 구성 파일과 가장 잘 작동합니다. 복잡한 GitLab 구성 파일이 있는 경우에는 파싱되지 않을 수 있으며 오류가 발생할 수 있습니다.
사용자 정의로 SAST를 활성화 및 구성하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
- 보안 > 보안 구성을 선택합니다.
- 프로젝트의 기본 브랜치에 대한 최신 파이프라인이 완료되고 유효한
SAST
artifact를 생성했다면 SAST 구성을, 그렇지 않은 경우에는 정적 애플리케이션 보안 테스트(SAST) 행의 SAST 활성화를 선택합니다. -
사용자 정의 SAST 값을 입력합니다.
사용자 정의 값은
.gitlab-ci.yml
파일에 저장됩니다. SAST 구성 페이지에 없는 CI/CD 변수의 경우, 이들의 값은 GitLab SAST 템플릿에서 상속됩니다. - 병합 요청 생성을 선택합니다.
- 병합 요청을 검토하고 병합합니다.
이제 파이프라인은 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 변수를 통해 제공할 수 있습니다.
CI/CD 변수를 사용하여 개인 Maven 저장소에 사용자 이름과 암호 전달
개인 Maven 저장소에서 로그인 자격 증명이 필요한 경우 MAVEN_CLI_OPTS
CI/CD 변수를 사용할 수 있습니다.
자세한 내용은 개인 Maven 저장소 사용 방법을 확인하세요.
Kubesec 분석 도구 활성화
Kubesec 분석 도구를 활성화하려면 SCAN_KUBERNETES_MANIFESTS
를 "true"
로 설정해야 합니다. .gitlab-ci.yml
파일에서 다음을 정의하세요:
include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
SCAN_KUBERNETES_MANIFESTS: "true"
Rust 애플리케이션 검사
Rust 애플리케이션을 검사하려면 다음을 수행해야 합니다:
-
Rust를 위한 사용자 정의 ruleset을 제공해야 합니다. 리포지토리 루트의
.gitlab/
디렉터리에sast-ruleset.toml
이라는 파일을 만들고 다음 내용을 추가하세요:[semgrep] description = "Semgrep를 위한 Rust ruleset" targetdir = "/sgrules" timeout = 60 [[semgrep.passthrough]] type = "url" value = "https://semgrep.dev/c/p/rust" target = "rust.yml"
이 구성은 오픈 소스 Semgrep ruleset을 사용합니다. ruleset 사용자 정의에 대해 자세히 알아보세요.
-
semgrep-sast
작업을 재정의하여 Rust (.rs
) 파일을 감지하는 규칙을 추가하세요..gitlab-ci.yml
파일에 다음을 정의하세요:include: - template: Jobs/SAST.gitlab-ci.yml semgrep-sast: rules: - if: $CI_COMMIT_BRANCH exists: - '**/*.rs' # semgrep-sast 템플릿에서 스캔해야 하는 다른 파일 확장자를 포함하세요
사전 컴파일
대부분의 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
매개변수를 사용하여 구성할 수 있습니다.
경고: GitLab 보안 스캔 도구의 모든 사용자 정의는 기본 브랜치로 변경을 합치기 전에 병합 요청에서 테스트해야 합니다. 이를 하지 않으면 예상치 못한 결과가 발생할 수 있으며, 잘못된 양성 결과가 많아질 수 있습니다.
다음 예제는 SAST 템플릿을 포함하여 모든 작업에서 SEARCH_MAX_DEPTH
변수를 10
으로 재정의하는 방법을 보여줍니다. 이 템플릿은 파이프라인 구성 이전에 평가되므로 변수의 마지막 언급이 우선권을 갖게 됩니다.
include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
SEARCH_MAX_DEPTH: 10
사용자 정의 인증 기관
사용자 정의 인증 기관을 신뢰하려면 ADDITIONAL_CA_CERT_BUNDLE
변수를 SAST 환경에서 신뢰할 CA 인증서 번들로 설정하세요. 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
및 인증서의 텍스트 표현을 필요로 하는 변수로 사용할 수 있습니다.
Docker 이미지
다음은 Docker 이미지와 관련된 CI/CD 변수들입니다.
CI/CD 변수 | 설명 |
---|---|
SECURE_ANALYZERS_PREFIX
| 기본 이미지(프록시)를 제공하는 Docker 레지스트리의 이름을 재정의합니다. 분석기 사용자 정의에서 자세히 알아보세요. |
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 고급 SAST2,3 | |||
다른 모든 SAST 분석기3 | |||
SAST_SPOTBUGS_EXCLUDED_BUILD_PATHS
| 빌드 및 스캔에서 제외되는 디렉토리의 쉼표로 구분된 목록입니다. | 없음 | SpotBugs4 |
SEARCH_MAX_DEPTH
| 분석기가 일치하는 파일을 찾기 위해 내려갈 디렉토리 수입니다.5 |
20
| Semgrep |
GitLab 고급 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와 동일한 구문을 사용하는 글로브 스타일 패턴입니다.
-
-
이 분석기들은
SAST_EXCLUDED_PATHS
를 후 처리 필터로 구현하여 스캔 실행 _후_에 적용합니다.패턴은 글로브일 수 있으며(지원되는 패턴은
doublestar.Match
참조), 파일이나 폴더 경로(doc,spec
와 같은)를 매치할 수 있습니다. 상위 디렉토리도 패턴과 매치됩니다.SAST_EXCLUDED_PATHS
의 후 처리 필터 구현은 모든 SAST 분석기에서 사용할 수 있습니다. 일부 SAST 분석기는 슈퍼스크립트 2와 같이SAST_EXCLUDED_PATHS
를 사전 필터로도, 후 처리 필터로도 구현합니다. 사전 필터는 스캔해야 하는 파일 수를 줄여서 성능이 좋습니다.SAST_EXCLUDED_PATHS
를 사전 필터 및 후 처리 필터로 모두 지원하는 분석기의 경우 사전 필터가 먼저 적용되고 남은 취약성에 후 처리 필터가 적용됩니다. -
이 변수에 대해 경로 패턴은 글로브일 수 있습니다 (지원되는 패턴은
doublestar.Match
참조). 지원되는 빌드 파일에 일치하는 패턴은 빌드 프로세스에서 제외됩니다:build.sbt
grailsw
gradlew
build.gradle
mvnw
pom.xml
build.xml
예를 들어,
project/subdir/pom.xml
경로의 빌드 파일을 포함하는maven
프로젝트의 빌드와 스캔을 제외하려면 명시적으로 빌드 파일을 일치시키는 글로브 패턴(예:project/*/*.xml
또는**/*.xml
)이나project/subdir/pom.xml
과 같이 정확히 일치하는 패턴을 전달합니다.패턴의 상위 디렉토리를 전달(예:
project
또는project/subdir
)하는 경우, 빌드 파일이 패턴과 명확히 일치하지 않기 때문에 디렉토리가 빌드에서 제외되지 않습니다. -
SAST CI/CD 템플릿은 사용된 프로그래밍 언어를 탐지하고 일치하는 분석기를 선택하기 위해 저장소를 검색합니다. 그런 다음 각 분석기는 특정 파일 또는 디렉터리를 찾기 위해 코드베이스를 검색합니다.
SEARCH_MAX_DEPTH
의 값을 설정하여 분석기의 검색 단계가 어느 정도의 디렉토리 수를 포함해야 하는지 지정합니다.
분석기 설정
몇 가지 분석기는 CI/CD 변수로 사용자 정의할 수 있습니다.
CI/CD 변수 | 분석기명 | 설명 |
---|---|---|
GITLAB_ADVANCED_SAST_ENABLED
| GitLab Advanced SAST |
true 로 설정하여 고급 SAST 스캔을 활성화합니다 (GitLab Ultimate에서만 사용 가능). 기본값: false .
|
SCAN_KUBERNETES_MANIFESTS
| Kubesec | Kubernetes manifest를 스캔하려면 "true" 로 설정하세요.
|
KUBESEC_HELM_CHARTS_PATH
| Kubesec |
kubesec 가 스캔하는 Kubernetes manifest를 생성하는 데 helm 이 사용하는 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 옵션(값이 있는 인수 또는 플래그)입니다. Accept되는 옵션은 한정적입니다. CLI 옵션과 해당 값은 공백 또는 (= ) 문자로 구분하세요. 예: name1 value1 또는 name1=value1 . 여러 옵션은 공백으로 구분하세요. 예: name1 value1 name2 value2 . GitLab 15.3에서 도입되었습니다.
|
SAST_RULESET_GIT_REFERENCE
| All | 사용자 정의 ruleset 구성 파일의 경로를 정의합니다. 프로젝트에 커밋된 .gitlab/sast-ruleset.toml 파일이 있는 경우 해당 로컬 구성이 우선하며, SAST_RULESET_GIT_REFERENCE 에서 파일이 사용되지 않습니다. 이 변수는 Ultimate 티어에서만 사용할 수 있습니다.
|
SECURE_ENABLE_LOCAL_CONFIGURATION
| All | 사용자 정의 ruleset 구성 옵션을 활성화합니다. SECURE_ENABLE_LOCAL_CONFIGURATION 를 false 로 설정하면 프로젝트의 .gitlab/sast-ruleset.toml 사용자 정의 ruleset 구성 파일이 무시되며 SAST_RULESET_GIT_REFERENCE 또는 기본 구성 파일이 우선합니다.
|
보안 스캐너 구성
SAST 분석기는 내부적으로 OSS 보안 스캐너를 사용하여 분석을 수행합니다. 우리는 권장하는 스캐너 구성을 설정하여 조정할 필요가 없도록 했습니다. 그러나 기본 스캐너 구성이 귀하의 요구 사항에 맞지 않는 드문 경우가 있을 수 있습니다.
스캐너 동작을 일부 사용자 정의하려면 기본 스캐너에 일부 flag를 추가할 수 있습니다. 스캐너의 CLI 옵션에 flag를 지정하세요. 이러한 flag는 스캐너의 CLI 옵션에 추가됩니다.
분석기 | CLI 옵션 | 설명 |
---|---|---|
Semgrep |
--max-memory
| 단일 파일에 rule을 실행할 때 사용할 최대 시스템 메모리(MB)를 설정합니다. |
--max-target-bytes
|
스캔할 파일의 최대 크기를 설정합니다. 이보다 큰 입력 프로그램은 무시됩니다. 이 필터를 비활성화하려면 `0` 또는 음수로 설정하세요. 바이트는 단위를 포함하여 또는 생략하여 지정할 수 있습니다. 예: 참고: 이 flag를 기본값으로 유지해야 합니다. 또한 바이너리 파일은 스캔되지 않기 때문에 이 flag를 minified JavaScript, `DLLs`, `JARs` 또는 기타 이진 파일을 스캔하도록 변경하는 것을 피해야 합니다. | |
--timeout
|
단일 파일에 rule을 실행할 때 최대 시간(초)을 설정합니다. 시간 제한이 없도록 하려면 `0`으로 설정하세요. 제한 시간 값은 정수여야 하며, 예: 10 또는 15 . 기본값은 5 입니다.
| |
SpotBugs |
-effort
|
분석 노력 수준을 설정합니다. 증가하는 순서로 더 많은 취약점을 감지할 수 있는 정밀도 및 능력을 갖는 `min`, `less`, `more` 및 `max`와 같은 유효한 값이 있습니다. 기본값은 스캔을 완료하는 데 더 많은 메모리와 시간이 필요할 수 있는 `max`로 설정됩니다. 메모리 또는 성능 문제가 발생하는 경우 분석 노력 수준을 낮은 값으로 설정할 수 있습니다. 예: -effort less .
|
사용자 지정 CI/CD 변수
이전에 언급된 SAST 구성 CI/CD 변수 외에도 사용자 정의 변수는 SAST 판매 템플릿을 사용할 경우 기본 SAST 분석기 이미지로 전파됩니다.
분석에서 코드 제외
취약점을 분석에서 제외하기 위해 코드의 개별 행 또는 블록을 표시할 수 있습니다. 모든 취약점은 취약점 관리를 통해 관리하거나 ‘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는 기본적으로 항상 가져오기
(always
)pull_policy
를 가지고 있어서, 로컬 복사본이 있더라도 Docker 이미지를 GitLab 컨테이너 레지스트리에서 가져 오려고 시도합니다. 오프라인 환경에서는 GitLab Runner의 pull_policy
를if-not-present
로 설정할 수 있으며, 이렇게 설정하면 로컬에서만 사용 가능한 Docker 이미지를 사용하게 됩니다. 그러나 오프라인 환경이 아닌 경우항상
으로 pull policy 설정을 유지하는 것을 권장합니다. 이로 인해 CI/CD 파이프 라 인에서 업데이트된 스캐너를 사용할 수 있습니다.
로컬 Docker 레지스트리에 GitLab SAST 분석기 이미지 만들기
모든 지원되는 언어 및 프레임워크에서 SAST를 사용하려면 registry.gitlab.com
에서 다음과 같은 기본 SAST 분석기 이미지를
로컬 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
를 참조하세요.
사용자 정의 인증서 지원이 필요한 경우
사용자 정의 인증서의 지원은 다음 버전에서 도입되었습니다.
분석기 | 버전 |
---|---|
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 실행
기본적으로 SELinux에 호스팅된 GitLab 인스턴스에서 SAST 분석기가 지원됩니다. SELinux에서 호스팅된 러너는 제한된 권한을 가지고 있기 때문에 재정의된 SAST 작업에 before_script
를 추가하는 것이 작동하지 않을 수 있습니다.