정적 애플리케이션 보안 테스트 (SAST)

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated
note
“애플리케이션 보안의 지진 효과” 라고 하는 백서에서 상위 6개 공격 중 4개가 애플리케이션 기반이었다는 사실을 설명합니다. 귀하의 조직을 어떻게 보호할지 알아보려면 다운로드하십시오.

GitLab CI/CD를 사용하는 경우 정적 애플리케이션 보안 테스트 (SAST)를 사용하여 알려진 취약점을 확인할 수 있습니다. SAST 분석기를 사용하면 어떤 GitLab 티어에서든 JSON 형식의 보고서를 작업 아티팩트로 얻을 수 있습니다.

GitLab Ultimate를 사용하면 SAST 결과를 다음과 같이 처리할 수 있습니다.

  • 승인 워크플로에 사용합니다.
  • 보안 대시보드에서 검토합니다.

자세한 내용은 각 티어별 기능 요약을 참조하십시오.

MR 위젯에 표시된 SAST 결과

파이프라인은 SAST 및 DAST 스캔을 포함한 여러 작업으로 구성됩니다. 어떤 이유로든 작업이 실패하면 보안 대시보드에 SAST 스캐너 출력이 표시되지 않습니다. 예를 들어 SAST 작업은 완료되었지만 DAST 작업이 실패하면 보안 대시보드에 SAST 결과가 표시되지 않습니다. 실패할 경우 분석기는 종료 코드를 출력합니다.

요구 사항

SAST는 기본적으로 사용 가능한 ‘test’ 단계에서 실행됩니다. .gitlab-ci.yml 파일에서 단계를 재정의하는 경우 ‘test’ 단계가 필요합니다.

SAST 작업을 실행하려면 기본적으로 docker 또는 kubernetes 실행자가 있는 GitLab Runner가 필요합니다. GitLab.com의 SaaS 러너를 사용하는 경우 이 기능은 기본적으로 활성화됩니다.

note
GitLab SAST 분석기는 Linux amd64 환경에서 Docker에서만 실행됩니다. 이는 Docker 19.03.0이 아닙니다. 자세한 내용은 문제 해결 정보를 참조하십시오.

지원되는 언어 및 프레임워크

GitLab SAST는 다양한 프로그래밍 언어 및 프레임워크를 스캔할 수 있습니다. SAST를 활성화하면 프로젝트가 여러 언어를 사용하더라도 적절한 세트의 분석기가 자동으로 실행됩니다.

SAST에서 언어 지원에 대한 우리의 계획에 대한 자세한 정보는 카테고리 방향 페이지를 참조하십시오.

언어 / 프레임워크 스캔에 사용되는 분석기 최소 지원 GitLab 버전
.NET (모든 버전, C# 전용) SemgrepGitLab-managed rules 15.4
Apex (Salesforce) PMD 12.1
C SemgrepGitLab-managed rules 14.2
C/C++ Flawfinder 2 10.7
Elixir (Phoenix) Sobelow 11.1
Go SemgrepGitLab-managed rules 14.4
Groovy1 SpotBugs 및 find-sec-bugs 플러그인 11.3 (Gradle) 및 11.9 (Maven, SBT)
Helm 차트 Kubesec 13.1
Java (모든 빌드 시스템) SemgrepGitLab-managed rules 14.10
Java (Android) MobSF (상태: 베타) 13.5
JavaScript SemgrepGitLab-managed rules 13.10
Kotlin (Android) MobSF (상태: 베타) 13.5
Kotlin (일반)1 SpotBugs 및 find-sec-bugs 플러그인 13.11
Kubernetes 매니페스트 Kubesec 12.6
Node.js NodeJsScan 2 11.1
Objective-C (iOS) MobSF (상태: 베타) 13.5
PHP phpcs-security-audit 2 10.8
Python SemgrepGitLab-managed rules 13.9
React SemgrepGitLab-managed rules 13.10
Ruby brakeman 2 13.9
Ruby on Rails brakeman 2 10.3
Scala (모든 빌드 시스템) SemgrepGitLab-managed rules 16.0
Scala 1 SpotBugs 및 find-sec-bugs 플러그인 11.0 (SBT) 및 11.9 (Gradle, Maven)
Swift (iOS) MobSF (상태: 베타) 13.5
TypeScript SemgrepGitLab-managed rules 13.10
각주:
  1. SpotBugs 기반 분석기는 [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/) 및 [SBT](https://www.scala-sbt.org/)를 지원합니다. 또한 [Gradle 래퍼](https://docs.gradle.org/current/userguide/gradle_wrapper.html), [Grails](https://grails.org/) 및 [Maven 래퍼](https://github.com/takari/maven-wrapper)와 같은 변형과 함께 사용할 수 있습니다. 그러나 SpotBugs는 [Ant](https://ant.apache.org/)-기반 프로젝트에서 사용할 때 [제한 사항](https://gitlab.com/gitlab-org/gitlab/-/issues/350801)이 있습니다. Ant 기반 Java 또는 Scala 프로젝트의 경우 Semgrep 기반 분석기를 사용해야 합니다.
  1. 이 분석기들은 [GitLab 16.9](https://gitlab.com/gitlab-org/gitlab/-/issues/431123)에서 사용이 중단되었으며 17.0에서 제거 예정입니다. [Semgrep 분석기](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep)가 그 대체로 제안되었습니다.

지원되는 분석기의 끝

GitLab은 아래 분석기에 대한 지원 종료에 도달했습니다. 이러한 분석기는 Semgrep 기반 분석기로 대체되었습니다.

언어 / 프레임워크 스캔에 사용된 분석기 최소 지원하는 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 plugin 12.5 15.4
JavaScript ESLint security plugin 11.8 15.4
TypeScript ESLint security plugin 11.9, ESLint 13.2 포함 15.4

다중 프로젝트 지원

GitLab SAST는 여러 프로젝트를 포함하는 리포지터리를 스캔할 수 있습니다.

다음 분석기가 다중 프로젝트를 지원합니다:

  • Bandit
  • ESLint
  • Gosec
  • Kubesec
  • NodeJsScan
  • MobSF
  • PMD
  • Security Code Scan
  • Semgrep
  • SpotBugs
  • Sobelow

Security Code Scan의 다중 프로젝트 지원 활성화

Security Code Scan에서의 다중 프로젝트 지원에는 리포지터리 루트에 솔루션 (.sln) 파일이 필요합니다. 솔루션 형식에 대한 자세한 내용은 Microsoft 참조 솔루션 (.sln) 파일을 참조하십시오.

거짓 긍정 탐지

상세 정보: Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

GitLab SAST는 다른 도구 출력의 특정 유형의 거짓 긍정 결과를 식별할 수 있습니다. 이러한 결과는 취약점 보고서취약점 페이지에서 거짓 긍정으로 표시됩니다.

거짓 긍정 탐지는 지원되는 언어분석기의 하위 집합에서 사용할 수 있습니다:

  • Semgrep 기반 분석기의 Go
  • Brakeman 기반 분석기의 Ruby

SAST 거짓 긍정이 취약점 페이지에 표시됩니다

고급 취약점 추적

상세 정보: Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

소스 코드는 불안정합니다. 개발자가 변경을 가할 때마다 소스 코드는 파일 내에서 이동하거나 파일 간에 이동할 수 있습니다. 보안 분석기는 이미 추적 중인 취약점을 취약점 보고서에서 추적되는 코드 조각에 연결하여 식별하여 수정될 수 있도록 합니다. 코드 조각이 이동함에 따라 신뢰할 수 없으면 동일한 취약점이 다시 보고될 수 있기 때문에 취약점 관리가 더 어려워집니다.

GitLab SAST는 동일한 취약점이 리팩터링이나 관련 없는 변경으로 인해 파일 내에서 이동된 경우를 보다 정확하게 식별하기 위해 고급 취약점 추적 알고리즘을 사용합니다.

고급 취약점 추적은 지원되는 언어분석기의 하위 집합에서 사용할 수 있습니다:

  • C, Semgrep 기반 및 Flawfinder 분석기에서
  • C++, Flawfinder 분석기에서
  • C#, Semgrep 기반 분석기에서
  • Go, Semgrep 기반 분석기에서
  • Java, mobsf, Semgrep 기반 및 SpotBugs 분석기에서
  • JavaScript, Semgrep 기반 및 NodeJS-Scan 분석기에서
  • PHP, phpcs-security-audit 분석기에서
  • Python, Semgrep 기반 분석기에서
  • Ruby, Brakeman 기반 분석기에서

더 많은 언어 및 분석기 지원은 이 epic에서 추적됩니다.

더 많은 정보는 비공개 프로젝트 https://gitlab.com/gitlab-org/security-products/post-analyzers/tracking-calculator에서 확인하십시오. 본 프로젝트의 내용은 GitLab 팀 멤버에게만 제공됩니다.

자동 취약점 해결

여전히 관련성 있는 취약점에 주로 초점을 맞추도록 도와주기 위해 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 호환 이미지는 Semgrep 기반 분석기에만 사용할 수 있습니다.

caution
FIPS 호환 방식으로 SAST를 사용하려면 다른 분석기의 실행을 제외해야 합니다. Semgrep를 FIPS 활성화 이미지에서 루트가 아닌 사용자와 함께 실행하려면 이미지에서 생성된 gitlab 사용자의 ID(1000)를 사용하여 run_as_user 속성을 업데이트해야 합니다(https://gitlab.com/gitlab-org/security-products/analyzers/semgrep/-/blob/a5d822401014f400b24450c92df93467d5bbc6fd/Dockerfile.fips#L58).

각 티어별 기능 요약

다양한 GitLab 티어에서 사용 가능한 다양한 기능은 다음 표와 같습니다.

기능 무료 및 Premium Ultimate
적절한 분석기를 사용하여 코드 자동 스캔
SAST 스캐너 구성
SAST 설정 사용자 정의
SAST 출력 다운로드
Merge Request 위젯에서 새로운 결과 보기
Merge Request 변경 사항에서 새로운 결과 보기
취약점 관리
보안 대시보드에 액세스
UI를 사용하여 SAST 구성
SAST 규칙셋 사용자 정의
거짓 긍정 결과 식별
이동된 취약점 추적

출력

SAST는 작업 아티팩트로 gl-sast-report.json 파일을 출력합니다. 해당 파일에는 감지된 모든 취약점의 세부 정보가 포함되어 있습니다. GitLab 밖에서 처리하기 위해 해당 파일을 다운로드할 수 있습니다.

자세한 내용은 아래 링크를 참조하십시오:

SAST 결과 보기

SAST 보고서 파일은 GitLab에 의해 처리되고 해당 세부 정보가 UI에 표시됩니다.

  • Merge Request 위젯
  • Merge Request 변경 사항 보기
  • 취약점 보고서

Merge Request 위젯

Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

대상 브랜치의 보고서를 비교할 수 있는 경우, SAST 결과가 Merge Request 위젯 영역에 표시됩니다. Merge Request 위젯은 Merge Request에서 적용한 변경으로 인해 도입된 SAST 결과 및 해결 방법을 표시합니다.

보안 Merge Request 위젯

Merge Request 변경 내용 보기

Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated
  • GitLab 16.6에서 sast_reports_in_inline_diff라는 플래그로 도입됨. 기본적으로 비활성화됨.
  • 기본적으로 GitLab 16.8에서 활성화됨.
  • GitLab 16.9에서 플래그 제거됨.

Merge Request 변경 내용에서 SAST 결과가 표시됩니다. SAST 문제가 포함된 줄은 gutter 옆에 심볼로 표시됩니다. 해당 심볼을 선택하여 문제 디렉터리을 볼 수 있으며, 문제를 선택하면 해당 세부 정보를 볼 수 있습니다.

SAST Inline Indicator

스캐너 기부

보안 스캐너 통합 설명서에서 다른 보안 스캐너를 GitLab에 통합하는 방법에 대해 설명합니다.

구성

SAST 스캐닝은 CI/CD 파이프라인에서 실행됩니다. GitLab 관리 CI/CD 템플릿을 파이프라인에 추가하면 자동으로 SAST analyzers가 코드를 자동으로 스캔하고 SAST 보고서 artifact를 저장합니다.

프로젝트에 SAST를 구성하려면 다음을 수행할 수 있습니다:

여러 프로젝트에서 스캔 실행 강제화하여 SAST를 활성화할 수 있습니다.

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 보고서 artifact로 저장되어 나중에 다운로드하고 분석할 수 있습니다. 다운로드하면 항상 사용 가능한 최신 SAST artifact를 받게 됩니다.

UI를 사용하여 SAST 구성

기본 설정 또는 사용자 정의로 UI를 사용하여 SAST를 활성화하고 구성할 수 있습니다. 사용 가능한 방법은 GitLab 라이선스 티어에 따라 다릅니다.

사용자 정의로 SAST 구성

Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

GitLab 16.2에서 UI에서 개별 SAST analyzers 구성 옵션을 제거했습니다.

note
구성 도구는 기존의 .gitlab-ci.yml 파일이 없거나 최소 구성 파일이 있는 경우에 가장 잘 작동합니다. 복잡한 GitLab 구성 파일이 있으면 구문 분석이 올바로 수행되지 않을 수 있으며 오류가 발생할 수 있습니다.

사용자 정의로 SAST를 활성화하고 구성하려면 다음을 수행합니다:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. 보안 > 보안 구성을 선택합니다.
  3. 프로젝트에 .gitlab-ci.yml 파일이 없는 경우, 정적 애플리케이션 보안 테스트(SAST) 행에서 SAST 활성화를 선택하고, 그렇지 않으면 SAST 구성을 선택합니다.
  4. 사용자 정의 SAST 값을 입력합니다.

    사용자 지정 값은 .gitlab-ci.yml 파일에 저장됩니다. SAST 구성 페이지에 없는 CI/CD 변수는 GitLab SAST 템플릿에서 상속된 값을 갖게 됩니다.

  5. Merge Request 생성을 선택합니다.
  6. Merge Request을 검토하고 Merge합니다.

이제 파이프라인에 SAST 작업이 포함됩니다.

기본 설정만 사용하여 SAST 구성하기

note
구성 도구는 기존의 .gitlab-ci.yml 파일이 없거나 최소 구성 파일이 있는 경우에 가장 잘 작동합니다. 복잡한 GitLab 구성 파일이 있으면 구문 분석이 올바로 수행되지 않을 수 있으며 오류가 발생할 수 있습니다.

기본 설정만 사용하여 SAST를 활성화하고 구성하려면 다음을 수행합니다:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. 보안 > 보안 구성을 선택합니다.
  3. SAST 섹션에서 Merge Request을 통한 구성을 선택합니다.
  4. SAST를 활성화하기 위해 Merge Request을 검토하고 Merge합니다.

이제 파이프라인에 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 템플릿은 주 버전을 지정하고 해당 주 버전 내에서 자동으로 최신 분석기 릴리스를 가져옵니다.

특정한 경우에는 특정 버전을 사용해야 할 수 있습니다. 예를 들어, 나중에 릴리스에서의 회귀를 피해야 할 수 있습니다.

자동 업데이트 동작을 무시하려면 CI/CD 구성 파일에 SAST.gitlab-ci.yml 템플릿을 포함한 후에 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 변수를 사용하여 프라이빗 Go 리포지터리에 사용자 이름과 암호 전달하기

만약 Go 프로젝트가 프라이빗 모듈에 의존한다면, 프라이빗 프로젝트로부터 모듈 가져오기를 참조하여 HTTPS를 통해 인증을 제공하는 방법을 확인하세요.

~/.netrc를 통해 자격 증명을 지정하려면, 다음이 포함된 before_script를 제공하세요:

gosec-sast:
  before_script:
    - |
      cat <<EOF > ~/.netrc
      machine gitlab.com
      login $CI_DEPLOY_USER
      password $CI_DEPLOY_PASSWORD
      EOF

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"

사전 컴파일

대부분의 GitLab SAST 분석기는 소스 코드를 먼저 컴파일하지 않고 직접 스캔합니다. 그러나 기술적인 이유로 일부 분석기는 컴파일된 코드만 스캔할 수 있습니다.

기본적으로, 이러한 분석기는 의존성을 자동으로 가져와 코드를 컴파일하여 스캔할 수 있습니다. 그러나 자동 컴파일은 다음과 같은 경우에 실패할 수 있습니다.

  • 프로젝트가 사용자 지정 빌드 구성을 요구하는 경우.
  • 분석기에 내장되지 않은 언어 버전을 사용하는 경우.

이러한 문제를 해결하기 위해 분석기의 컴파일 단계를 건너뛰고 파이프라인의 이전 단계에서 생성된 아티팩트를 직접 제공할 수 있습니다. 이 전략을 _사전 컴파일_이라고 합니다.

사전 컴파일은 COMPILE CI/CD 변수를 지원하는 분석기에 대해 사용할 수 있습니다. 현재 지원되는 디렉터리은 분석기 설정에서 확인할 수 있습니다.

사전 컴파일 사용 방법:

  1. 프로젝트의 의존성을 프로젝트 작업 디렉터리에 있는 디렉터리에 출력한 후, 설정(artifacts: paths)을 통해 해당 디렉터리를 아티팩트로 저장하세요.
  2. 분석기에 자동 컴파일을 비활성화하기 위해 COMPILE: "false" CI/CD 변수를 제공하세요.
  3. 분석기 작업의 의존성으로 컴파일 단계를 추가하세요.

분석기가 컴파일된 아티팩트를 인식하도록 하려면, 명시적으로 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

Merge Request 파이프라인에서 작업 실행

Merge Request 파이프라인에서 보안 스캔 도구 사용하기를 참조하십시오.

사용 가능한 CI/CD 변수

variables 매개변수를 사용하여 SAST를 구성할 수 있습니다.

caution
GitLab 보안 스캔 도구의 모든 사용자 정의는 기본 브랜치로 변경을 Merge하기 전에 Merge Request에서 테스트되어야 합니다. 이를 하지 않으면 예상치 못한 결과가 발생할 수 있으며, 이는 오검출이 많이 포함된 결과 등을 초래할 수 있습니다.

다음 예제는 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로 구성될 수도 있습니다. 이 경우 인증서의 경로가 필요하며, 텍스트로 구성될 수도 있습니다.

도커 이미지

다음은 도커 이미지와 관련된 CI/CD 변수입니다.

CI/CD 변수 설명
SECURE_ANALYZERS_PREFIX 기본 이미지를 제공하는 도커 레지스트리의 이름을 재정의합니다 (프록시). 분석기 커스터마이징에 대해 자세히 읽으십시오.
SAST_EXCLUDED_ANALYZERS 실행해서는 안 되는 기본 이미지의 이름입니다. 분석기 커스터마이징에 대해 자세히 읽으십시오.
SAST_ANALYZER_IMAGE_TAG 분석기 이미지의 기본 버전을 재정의합니다. 분석기 이미지 버전 고정에 대해 자세히 읽으십시오.
SAST_IMAGE_SUFFIX 이미지 이름에 추가되는 접미사입니다. -fips로 설정하면 FIPS 활성화 이미지가 스캔에 사용됩니다. 자세한 내용은 GitLab 14.10에서 도입됨.

취약점 필터

일부 분석 도구는 특정 임계값 이하의 취약점을 필터링하는 것을 가능하게 합니다.

CI/CD 변수 기본값 설명
SAST_EXCLUDED_PATHS spec, test, tests, tmp 경로를 기반으로 취약점을 출력에서 제외합니다. 쉼표로 구분된 패턴의 디렉터리입니다. 패턴은 와일드카드가 될 수 있습니다 (doublestar.Match에서 지원하는 패턴 참조) 또는 파일 또는 폴더 경로입니다(예: doc,spec). 상위 디렉터리도 패턴과 일치합니다. 빌드 도구에서 사용하는 임시 디렉터리는 잘못된 양성을 생성할 수 있으므로 제외해야 할 수도 있습니다. 제외할 경로를 복사하여 붙여넣은 후 자신만의 경로를 추가하세요. 기본 제외 경로를 지정하지 않으면 기본값이 재정의되어 SAST 스캔에서 제외된 경로는 지정한 경로만 됩니다.
SEARCH_MAX_DEPTH Semgrep 20; 다른 모든 SAST 분석 도구 4 SAST는 리포지터리를 검색하여 사용된 프로그래밍 언어를 감지하고 일치하는 분석 도구를 선택합니다. SEARCH_MAX_DEPTH 값을 설정하여 검색 단계가 얼마나 많은 디렉터리 수준에 걸치는지 지정하세요. 분석 도구가 선택된 후 전체 리포지터리가 분석됩니다.
SAST_BANDIT_EXCLUDED_PATHS   스캔에서 제외할 경로의 쉼표로 구분된 디렉터리입니다. Python의 fnmatch 구문을 사용합니다. 예: '*/tests/*, */venv/*'. GitLab 15.4에서 제거됨.
SAST_BRAKEMAN_LEVEL 1 지정된 신뢰 수준 이하의 Brakeman 취약점을 무시합니다. 정수, 1=낮음 3=높음.
SAST_FLAWFINDER_LEVEL 1 지정된 리스크 수준 이하의 Flawfinder 취약점을 무시합니다. 정수, 0=리스크 없음, 5=높은 리스크.
SAST_GOSEC_LEVEL 0 지정된 신뢰 수준 이하의 Gosec 취약점을 무시합니다. 정수, 0=미정의, 1=낮음, 2=중간, 3=높음. GitLab 15.4에서 제거됨.

분석 도구 설정

몇몇 분석 도구는 CI/CD 변수로 사용자 정의할 수 있습니다.

CI/CD 변수 분석 도구 설명
SCAN_KUBERNETES_MANIFESTS Kubesec 쿠버네티스 매니페스트를 스캔하려면 “true”로 설정합니다.
KUBESEC_HELM_CHARTS_PATH Kubesec kubesec가 스캔하는 쿠버네티스 매니페스트를 생성하기 위해 helm이 사용하는 Helm 차트의 선택적 경로입니다. 의존성이 정의된 경우 before_script에서 필요한 의존성을 가져오기 위해 helm dependency build를 실행해야 합니다.
KUBESEC_HELM_OPTIONS Kubesec helm 실행 파일을 위한 추가적인 인수입니다.
COMPILE Gosec, SpotBugs 프로젝트 컴파일 및 의존성 가져오기를 비활성화하려면 false로 설정합니다. GitLab 13.1에 SpotBugs 분석 도구용으로 도입되었으며, GitLab 14.0에 Gosec 분석 도구용으로 도입되었습니다.
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부터, 지원되는 버전은 1117 (기본값)입니다. 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_GOSEC_CONFIG Gosec GitLab 14.0에서 caution제거됨 - 대신 사용자 정의 규칙 세트를 사용하세요. Gosec의 구성에 대한 경로(선택 사항)입니다.
PHPCS_SECURITY_AUDIT_PHP_EXTENSIONS phpcs-security-audit 추가 PHP 확장 기능의 쉼표로 구분된 디렉터리입니다.
SAST_SEMGREP_METRICS Semgrep 익명화된 스캔 메트릭을 r2c에 전송을 비활성화하려면 “false”로 설정합니다. 기본값: true. GitLab 팀 멤버는 이 비밀 이슈에서 더 많은 정보를 볼 수 있습니다: https://gitlab.com/gitlab-org/gitlab/-/issues/330565에서 Introduced in GitLab 14.0.
SAST_SCANNER_ALLOWED_CLI_OPTS Semgrep 스캔 작업을 실행할 때 기본 보안 스캐너로 전달되는 CLI 옵션(값이 있는 인수 또는 플래그)입니다. 일부 옵션만 허용됩니다. CLI 옵션 및 해당 값은 공백 또는 등호 (=) 문자로 구분합니다. 예: name1 value1 또는 name1=value1. 여러 옵션은 공백으로 구분해야 합니다. 예: name1 value1 name2 value2. GitLab 15.3에 도입됨.
SAST_RULESET_GIT_REFERENCE Semgrep 및 nodejs-scan 사용자 정의 규칙 세트 구성 파일의 경로를 정의합니다. 프로젝트에 커밋된 .gitlab/sast-ruleset.toml 파일이 있는 경우 해당 로컬 구성이 우선하고 SAST_RULESET_GIT_REFERENCE에서 파일을 사용하지 않습니다. 이 변수는 Ultimate 티어에서만 사용할 수 있습니다.

보안 스캐너 구성

SAST 분석기는 내부적으로 OSS 보안 스캐너를 사용하여 분석을 수행합니다. 우리는 권장되는 보안 스캐너 구성을 설정하여 튜닝에 대해 걱정할 필요가 없도록 합니다. 그러나 기본 스캐너 구성이 귀하의 요구 사항에 맞지 않을 수 있는 드문 경우가 있습니다.

스캐너의 동작을 일부 사용자 정의하려면 기본 스캐너에 제한된 세트의 플래그를 추가할 수 있습니다. 이러한 플래그를 SAST_SCANNER_ALLOWED_CLI_OPTS CI/CD 변수에 지정합니다. 이러한 플래그는 스캐너의 CLI 옵션에 추가됩니다.

분석기 CLI 옵션 설명
Semgrep --max-memory 단일 파일에서 규칙을 실행할 때 사용할 최대 시스템 메모리를 설정합니다. MB로 메트릭됩니다.
Flawfinder --neverignore 보안 문제를 절대 무시하지 않습니다. 심지어 주석에 ‘무시’ 지시문이 있더라도 추가적인 취약성 결과를 감지할 수 있습니다.
SpotBugs -effort 분석 노력 수준을 설정합니다. 유효한 값은 min, less, more, max이며, 스캔의 정밀도와 감지하는 취약성 수에 따라 점점 늘어납니다. 기본값은 프로젝트의 크기에 따라 스캔을 완료하는 데 더 많은 메모리와 시간이 필요할 수 있는 max로 설정됩니다. 메모리 또는 성능 문제가 발생하는 경우 분석 노력 수준을 낮추십시오. 예: -effort less.

사용자 지정 CI/CD 변수

언급된 SAST 구성 CI/CD 변수에 추가하여 사용자 정의 변수SAST 공급 자체 템플릿이 사용된 경우에만 기본 SAST 분석기 이미지로 전파됩니다.

실험적 기능

실험적 기능을 일찍 이용할 수 있습니다. 실험적 기능은 언제든지 추가, 제거 또는 일반 기능으로 승격될 수 있습니다.

사용할 수 있는 실험적 기능은 다음과 같습니다:

  • iOS 및 Android 앱을 스캔하는 것을 가능하게 하는 MobSF 분석기를 활성화합니다.

이러한 기능들은 이전에 실험적이었지만 이제 일반적으로 사용할 수 있습니다:

실험적 기능 활성화

실험적 기능을 활성화하려면 다음을 .gitlab-ci.yml 파일에 추가하십시오:

include:
  - template: Jobs/SAST.gitlab-ci.yml

variables:
  SAST_EXPERIMENTAL_FEATURES: "true"

오프라인 환경에서 SAST 실행

인터넷을 통한 외부 리소스에 제한적으로 또는 가끔 접근할 수 있는 환경에 있는 오픈소스 GitLab 인스턴스를 위해 SAST 작업이 성공적으로 실행되기 위해서는 일부 조정이 필요합니다. 자세한 내용은 오프라인 배치를 참조하십시오.

오프라인 SAST 요구 사항

오프라인 환경에서 SAST를 사용하려면 다음이 필요합니다:

  • docker 또는 kubernetes executor를 사용하는 GitLab Runner.
  • SAST 분석기 이미지의 로컬에서 사용 가능한 사본을 가진 Docker 컨테이너 레지스트리.
  • 패키지의 인증 검사 구성 (선택 사항).

GitLab Runner는 기본적으로 always pull_policy를 가집니다, 즉 로컬 사본이 있는 경우에도 GitLab 컨테이너 레지스트리에서 Docker 이미지를 가져오려고 시도합니다. 오프라인 환경에서는 로컬에서만 사용 가능한 Docker 이미지를 사용하려면 GitLab Runner pull_policyif-not-present로 설정할 수 있습니다(https://docs.gitlab.com/runner/executors/docker.html#using-the-if-not-present-pull-policy). 그러나 CI/CD 파이프라인에서 업데이트된 스캐너를 사용하는 것이 가능하도록 하기 위해 오프라인 환경이 아니라면 pull policy 설정을 always로 유지하는 것이 권장됩니다.

GitLab SAST 분석기 이미지를 로컬 Docker 레지스트리에서 사용 가능하도록 만들기

جrase: gitlab/지원되는 언어 및 프레임워크를 모두 갖는 SAST를 사용하려면 다음 기본 SAST 분석기 이미지들을 지역 Docker 컨테이너 레지스트리로부터 registry.gitlab.com을 불러오십시오:

registry.gitlab.com/security-products/brakeman:3
registry.gitlab.com/security-products/flawfinder:3
registry.gitlab.com/security-products/kubesec:3
registry.gitlab.com/security-products/nodejs-scan:3
registry.gitlab.com/security-products/phpcs-security-audit:3
registry.gitlab.com/security-products/pmd-apex:3
registry.gitlab.com/security-products/security-code-scan:3
registry.gitlab.com/security-products/semgrep:3
registry.gitlab.com/security-products/sobelow:3
registry.gitlab.com/security-products/spotbugs:3

사용자 정의 인증 기관 지원이 필요한 경우

사용자 정의 인증 기관을 지원하는 기능은 다음 버전에서 소개되었습니다.

분석 도구 버전
bandit1 v2.3.0
brakeman v2.1.0
eslint1 v2.9.2
flawfinder v2.3.0
gosec1 v2.5.0
kubesec v2.1.0
nodejs-scan v2.9.5
phpcs-security-audit v2.8.2
pmd-apex v2.1.0
security-code-scan v2.7.3
semgrep v0.0.1
sobelow v2.2.0
spotbugs v2.7.1
  1. 이러한 분석 도구는 GitLab 14.8에 폐기되었으며, GitLab 15.4에서 지원 종료되었습니다.

로컬 SAST 분석 도구를 사용하도록 SAST CI/CD 변수 설정

.gitlab-ci.yml 파일에 다음 구성을 추가하십시오. SECURE_ANALYZERS_PREFIX를 로컬 도커 컨테이너 레지스트리로 변경해야 합니다:

include:
  - template: Jobs/SAST.gitlab-ci.yml

variables:
  SECURE_ANALYZERS_PREFIX: "localhost:5000/analyzers"

이제 SAST 작업은 인터넷 액세스 없이 코드를 스캔하고 보안 보고서를 생성하기 위해 로컬 SAST 분석 도구의 로컬 사본을 사용해야 합니다.

패키지의 인증 검사 구성

SAST 작업이 패키지 관리자를 호출하는 경우 해당 패키지의 인증 검사를 구성해야 합니다. 오프라인 환경에서는 외부 소스의 인증 검사가 불가능합니다. 자체 서명된 인증서를 사용하거나 인증 검사를 비활성화해야 합니다. 지침은 패키지 관리자의 문서를 참조하십시오.

SELinux에서 SAST 실행

기본적으로 GitLab 인스턴스에서 호스팅되는 SELinux에서 SAST 분석 도구가 지원됩니다. SAST 작업을 재정의하여 before_script를 추가하는 것은 SELinux에서 호스팅되는 러너가 제한된 권한을 갖기 때문에 작동하지 않을 수 있습니다.