IaC 스캐닝

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

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

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

GitLab Ultimate와 함께 IaC 스캐닝 결과도 처리되어 다음을 수행할 수 있습니다:

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

스캐너 활성화

선행 조건:

  • IaC 스캐닝은 AMD64 아키텍처를 필요로 합니다. Microsoft Windows는 지원되지 않습니다.
  • 일관된 성능을 보장하기 위해 최소 4GB RAM이 필요합니다.
  • .gitlab-ci.yml 파일에서 test 단계가 필요합니다.
  • GitLab self-managed의 경우, docker 또는 kubernetes executor를 사용하는 GitLab Runner가 필요합니다.
  • 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 1
  • Dockerfile
  • Google Deployment Manager
  • Kubernetes
  • OpenAPI
  • Terraform 2
각주:
  1. IaC 스캐닝은 JSON 형식의 Azure Resource Manager 템플릿을 분석할 수 있습니다. Bicep 언어로 템플릿을 작성한 경우, IaC 스캐닝이 분석을 수행하기 전에 Bicep 파일을 JSON으로 변환해야 합니다. (Bicep)
  2. 사용자 정의 레지스트리에서의 Terraform 모듈은 취약점에 대해 스캔되지 않습니다. 제안된 기능에 대해 [issue 357004](https://gitlab.com/gitlab-org/gitlab/-/issues/357004)를 참고할 수 있습니다.

규칙 사용자 정의

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

GitLab 14.8에서 규칙 재정의 지원이 도입되었습니다.

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 파일을 기본 브랜치에 병합한 후, 비활성화된 규칙에 대한 기존 발견 사항은 자동으로 처리됩니다.

다음 예에서 sast-ruleset.toml 파일에서 비활성화된 규칙은 식별자의 typevalue를 일치시켜 kics 분석기에 할당됩니다:

[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"

규칙 재정의

특정 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"

특정 분석기 버전 사용

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 활성화 이미지 사용

History

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

자동 취약점 해결

  • GitLab 15.9에 도입되었으며, 프로젝트 수준의 플래그인 sec_mark_dropped_findings_as_resolved와 함께 도입되었습니다.
  • GitLab 16.2에 일반적으로 사용 가능해졌으며, 기능 플래그 sec_mark_dropped_findings_as_resolved가 제거되었습니다.

IaC(Infrastructure as Code) 스캐닝은 다음 경우에 취약점을 자동으로 해결합니다.

  • 미리 정의된 규칙을 비활성화하는 경우(#disable-rules).
  • 기본 규칙 세트에서 규칙을 제거하는 경우.

나중에 규칙을 다시 활성화하면 결과가 다시 열리고 심사를 받습니다.

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

JSON 형식 보고서

IaC 스캐너는 기존 SAST 보고서 형식으로 JSON 보고서 파일을 생성합니다. 자세한 내용은 이 보고서의 스키마를 참조하세요.

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

  • CI 파이프라인 페이지.
  • 머지 리퀘스트의 파이프라인 탭에서 artifacts: pathsgl-sast-report.json설정합니다.

자세한 내용은 아티팩트 다운로드를 참조하세요.

문제 해결

IaC 스캐닝 작업 중 다음과 같은 문제가 발생할 수 있습니다.

IaC 스캐닝 결과가 예상치 못하게 No longer detected으로 표시됨

이전에 감지된 결과가 예상치 못하게 No longer detected으로 표시되면, 스캐너의 업데이트로 인한 것일 수 있습니다. 업데이트로 인해 효과가 없거나 잘못된 양성이라고 판단된 규칙이 비활성화되고 결과가 No longer detected로 표시됩니다.

GitLab 15.3에서는 IaC 스캐너에서 비밀 감지가 비활성화되었기 때문에 “비밀 및 암호” 패밀리의 IaC 결과가 No longer detected으로 표시됩니다.

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

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