Infrastructure as Code 스캔

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

인프라스트럭처 코드 (IaC) 스캔은 CI/CD 파이프라인에서 실행되며, 인프라 정의 파일을 알려진 취약점을 확인합니다. 응용 프로그램의 위험에 대응하기 위해 기본 브랜치에 커밋되기 전에 취약성을 식별합니다.

IaC 스캔 분석기는 job artifacts로 JSON 형식의 보고서를 출력합니다.

GitLab Ultimate을 사용하면 IaC 스캔 결과도 처리할 수 있습니다. 이로써 다음을 수행할 수 있습니다:

  • 합병 요청에서 확인
  • 승인 워크플로에 사용
  • 취약점 보고서에서 검토

스캐너 활성화

필수조건:

  • IaC 스캔은 AMD64 아키텍처를 필요로 합니다. Microsoft Windows는 지원되지 않습니다.
  • 일관된 성능을 보장하기 위해 최소 4GB RAM이 필요합니다.
  • .gitlab-ci.yml 파일에 test 단계가 필요합니다.
  • GitLab Self-managed의 경우 docker 또는 kubernetes executor가 필요합니다.
  • GitLab.com에서 SaaS 러너를 사용하는 경우, 기본적으로 이 기능이 활성화됩니다.

프로젝트의 IaC 스캔을 활성화하려면 다음 단계를 따르세요:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. Build > 파이프라인 편집기를 선택합니다.
  3. 다음을 .gitlab-ci.yml 파일의 맨 아래로 복사하여 붙여넣습니다. include 줄이 이미 있는 경우에는 아래의 template 줄만 추가합니다.

    include:
      - template: Jobs/SAST-IaC.gitlab-ci.yml
    
  4. 검증 탭을 선택한 다음 파이프라인 검증을 선택합니다. 메시지 시뮬레이션이 성공적으로 완료되었습니다는 파일이 유효함을 나타냅니다.
  5. 편집 탭을 선택합니다.
  6. 변경 사항 커밋을 선택합니다.

이제 파이프라인에 IaC 스캔 작업이 포함됩니다.

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

IaC 스캔은 다양한 IaC 구성 파일을 지원합니다. 프로젝트에서 지원되는 구성 파일이 감지되면 KICS를 사용하여 스캔됩니다. IaC 구성 파일이 혼합되어 있는 프로젝트도 지원됩니다.

지원되는 구성 형식:

  • Ansible
  • AWS CloudFormation
  • Azure Resource Manager

    note
    IaC 스캔은 Azure Resource Manager 템플릿을 JSON 형식으로 분석할 수 있습니다. Bicep에서 템플릿을 작성하는 경우, IaC 스캔이 분석하기 전에 Bicep CLI를 사용하여 Bicep 파일을 JSON으로 변환해야 합니다.
  • Dockerfile
  • Google Deployment Manager
  • Kubernetes
  • OpenAPI
  • Terraform

    note
    사용자 정의 레지스트리에 있는 Terraform 모듈은 취약점을 검사할 수 없습니다. 제안된 기능에 대한 자세한 정보는 이슈 357004를 참조하십시오.

규칙 사용자 정의

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

GitLab에서 제공하는 기본 IaC 스캔 규칙을 사용자 정의할 수 있습니다.

다음 사용자 정의 옵션은 별도 또는 함께 사용할 수 있습니다:

  • 사전 정의된 규칙 비활성화
  • 사전 정의된 규칙 재정의

규칙 집합 정의

모든 IaC 스캔 규칙은 ruleset 섹션에 포함되며 다음을 포함합니다:

  • 규칙에 대한 type 필드. IaC 스캔의 경우 식별자 유형은 kics_id입니다.
  • 규칙 식별자를 위한 value 필드. KICS 규칙 식별자는 영숫자 문자열입니다. 규칙 식별자를 찾으려면:

규칙 비활성화

특정 IaC 스캔 규칙을 비활성화할 수 있습니다.

분석기 규칙을 비활성화하려면:

  1. 프로젝트의 루트에 .gitlab 디렉터리를 생성합니다(존재하지 않는 경우).
  2. 사용자 정의 규칙 집합 파일을 .gitlab 디렉터리에 sast-ruleset.toml라는 이름으로 생성합니다(존재하지 않는 경우).
  3. ruleset 섹션의 컨텍스트에서 disabled 플래그를 true로 설정합니다.
  4. 하나 이상의 ruleset 하위 섹션에 비활성화할 규칙을 나열합니다.

다음 예제 sast-ruleset.toml 파일에서 비활성화된 규칙은 kics 분석기에 할당되며 typevalue가 일치합니다:

[kics]
  [[kics.ruleset]]
    disable = true
    [kics.ruleset.identifier]
      type = "kics_id"
      value = "8212e2d7-e683-49bc-bf78-d6799075c5a7"

  [[kics.ruleset]]
    disable = true
    [kics.ruleset.identifier]
      type = "kics_id"
      value = "b03a748a-542d-44f4-bb86-9199ab4fd2d5"

주석을 사용한 스캔 비활성화

KICS 주석를 사용하여 KICS 기반의 GitLab IaC 스캔 분석기가 코드베이스를 스캔하는 방법을 제어할 수 있습니다. 예를 들어:

  • 전체 파일을 스캔하지 않으려면 파일 상단에 # kics-scan ignore 주석을 추가할 수 있습니다.
  • 전체 파일에서 특정 규칙을 비활성화하려면 파일 상단에 # kics-scan disable=<kics_id> 주석을 추가할 수 있습니다.
note
이 기능은 일부 유형의 IaC 파일에만 사용할 수 있습니다. 지원되는 파일 유형 목록은 KICS 설명서를 참조하십시오.

규칙 재정의

특정 IaC 스캔 규칙을 재정의하여 사용자 정의할 수 있습니다. 예를 들어, 규칙의 심각도를 낮추거나 자체 문서로의 링크를 생성할 수 있습니다.

규칙을 재정의하려면:

  1. 프로젝트 루트에 .gitlab 디렉토리를 생성합니다(이미 존재하지 않은 경우).
  2. .gitlab 디렉토리에 sast-ruleset.toml이라는 사용자 정의 규칙 세트 파일을 생성합니다(이미 존재하지 않은 경우).
  3. 하나 이상의 ruleset.identifier 섹션에서 재정의할 규칙을 나열합니다.
  4. ruleset 섹션의 ruleset.override 컨텍스트에서 재정의할 키를 제공합니다. 키는 임의의 조합으로 재정의할 수 있습니다. 유효한 키는 다음과 같습니다:
    • description
    • message
    • name
    • severity (유효한 옵션: Critical, High, Medium, Low, Unknown, Info)

다음의 sast-ruleset.toml 파일 예제에서는 규칙을 일치시키고 typevalue에 따라 재정의합니다:

[kics]
  [[kics.ruleset]]
    [kics.ruleset.identifier]
      type = "kics_id"
      value = "8212e2d7-e683-49bc-bf78-d6799075c5a7"
    [kics.ruleset.override]
      description = "재정의된 설명"
      message = "재정의된 메시지"
      name = "재정의된 이름"
      severity = "Info"

오프라인 구성

Tier: PREMIUM Offering: Self-managed

오프라인 환경은 인터넷을 통해 외부 리소스에 제한적이거나 일시적으로 액세스할 수 있는 환경입니다. 이러한 환경에서 Self-managed GitLab 인스턴스를 위해 IaC는 일부 구성 변경이 필요합니다. 이 섹션의 지침은 오프라인 배포의 세부 지침과 함께 완료해아합니다.

GitLab Runner 구성

기본적으로 Runner는 로컬 복사본이 있는 경우에도 GitLab 컨테이너 레지스트리에서 Docker 이미지를 가져오려고 합니다. Docker 이미지가 항상 최신 상태로 유지되도록 하기 위해 기본 설정을 사용해야 합니다. 그러나 네트워크 연결이 없는 경우 기본 GitLab Runner pull_policy 변수를 변경해야 합니다.

GitLab Runner CI/CD 변수 pull_policyif-not-present로 구성합니다.

로컬 IaC 분석기 이미지 사용

GitLab 컨테이너 레지스트리 대신 로컬 Docker 레지스트리에서 이미지를 가져오려면 로컬 IaC 분석기 이미지를 사용하세요.

전제 조건:

  • 로컬 오프라인 Docker 레지스트리로 Docker 이미지를 가져오는 것은 네트워크 보안 정책에 따라 다릅니다. 외부 리소스에 대한 임시 액세스 또는 가져오는 프로세스를 찾기 위해 IT 직원과 상담하십시오.
  1. 기본 IaC 분석기 이미지를 registry.gitlab.com에서 로컬 Docker 컨테이너 레지스트리로 가져옵니다:

    registry.gitlab.com/security-products/kics:5
    

    IaC 분석기 이미지는 주기적으로 업데이트됩니다 따라서 로컬 복사본을 주기적으로 업데이트해야 합니다.

  2. CI/CD 변수 SECURE_ANALYZERS_PREFIX를 로컬 Docker 컨테이너 레지스트리로 설정합니다.

    include:
      - template: Jobs/SAST-IaC.gitlab-ci.yml
    
    variables:
      SECURE_ANALYZERS_PREFIX: "localhost:5000/analyzers"
    

이제 IaC 작업은 인터넷 액세스 없이 로컬 복사본의 분석기 Docker 이미지를 사용해아합니다.

특정 분석기 버전 사용

GitLab 관리 CI/CD 템플릿은 주요 버전을 지정하고 해당 주요 버전에서 최신 분석기 릴리스를 자동으로 가져옵니다. 경우에 따라 특정 버전을 사용해야 할 수 있습니다. 예를 들어, 나중에 릴리스에서의 회귀를 피해야 하는 경우입니다.

특정 분석기 버전을 사용하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동하여 이동을 선택하고 프로젝트를 찾습니다.
  2. 빌드 > 파이프라인 편집기를 선택합니다.
  3. SAST-IaC.gitlab-ci.yml 템플릿을 포함한 라인 뒤에 SAST_ANALYZER_IMAGE_TAG CI/CD 변수를 추가합니다.

    참고: 이 변수는 특정 작업에서만 설정합니다. 최상위 레벨에서 설정하면 설정한 버전이 다른 SAST 분석기에도 사용됩니다.

    태그를 다음과 같이 설정합니다:

    • 3과 같은 주요 버전. 이 경우 파이프라인에서 이 주요 버전에서 릴리스된 모든 부수 또는 패치 업데이트를 사용합니다.
    • 3.7과 같은 부수 버전. 이 경우 파이프라인에서 이 부수 버전에서 릴리스된 모든 패치 업데이트를 사용합니다.
    • 3.7.0과 같은 패치 버전. 이 경우 파이프라인은 어떠한 업데이트도 받지 않습니다.

다음 예제는 특정 부수 버전의 IaC 분석기를 사용하는 방법입니다:

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

kics-iac-sast:
  variables:
    SAST_ANALYZER_IMAGE_TAG: "3.1"

지원되는 배포

GitLab 스캐너는 사이즈와 유지보수를 위해 기본 Alpine 이미지로 제공됩니다.

FIPS 활성화 이미지 사용

표준 이미지 외에도 GitLab은 FIPS 활성화 Red Hat UBI 버전의 스캐너 이미지를 제공합니다.

파이프라인에서 FIPS 활성화 이미지를 사용하려면 SAST_IMAGE_SUFFIX-fips로 설정하거나 표준 태그와 -fips 확장을 수정합니다.

다음 예제는 SAST_IMAGE_SUFFIX CI/CD 변수를 사용하는 방법입니다.

variables:
  SAST_IMAGE_SUFFIX: '-fips'

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

자동 취약점 해결

아직 관련성이 있는 취약점에 중점을 두실 수 있도록 IaC 스캔은 다음과 같은 경우에 자동으로 해결됩니다:

  • 사전 정의된 규칙을 비활성화합니다.
  • 기본 규칙 세트에서 규칙을 제거합니다.

규칙을 나중에 다시 활성화하면 결과는 재검토를 위해 다시 열립니다.

자동으로 취약점을 해결할 때 취약점 관리 시스템에 노트가 추가됩니다.

보고서 JSON 형식

IaC 스캐너는 기존의 SAST 보고서 형식으로 JSON 보고서 파일을 출력합니다. 자세한 정보는 이 보고서의 스키마를 참조하십시오.

JSON 보고서 파일은 다음에서 다운로드할 수 있습니다.

  • CI 파이프라인 페이지
  • 병합 요청의 파이프라인 탭에서 artifacts: paths를 설정하여 gl-sast-report.json으로 설정합니다.

자세한 정보는 아티팩트 다운로드를 참조하십시오.

문제 해결

IaC 스캔을 수행하는 동안 다음과 같은 문제가 발생할 수 있습니다.

IaC 스캔 결과가 예기치 않게 더 이상 감지되지 않음으로 표시됨

이전에 감지된 결과가 예상치 못하게 더 이상 감지되지 않음으로 표시된 경우, 이는 스캐너의 업데이트 때문일 수 있습니다. 업데이트로 인해 효과가 없거나 거짓 양성으로 판명된 규칙들이 비활성화되고 결과가 더 이상 감지되지 않음으로 표시됩니다.

GitLab 15.3에서는 IaC 스캐너의 시크릿 감지가 비활성화되었으므로, “비밀 및 시크릿” 패밀리의 IaC 결과가 더 이상 감지되지 않음으로 표시됩니다.

작업 로그에 exec /bin/sh: exec format error 메시지 표시

작업 로그에 exec /bin/sh: exec format error라는 오류가 표시될 수 있습니다. 이 문제는 AMD64 아키텍처 이외의 아키텍처에서 IaC 스캐닝 분석기를 실행하려고 시도할 때 발생합니다. IaC 스캔의 사전 요구사항에 대한 자세한 내용은 스캐너 활성화를 참조하십시오.