인프라스트럭처 코드 스캐닝
인프라스트럭처 코드(IaC) 스캐닝은 CI/CD 파이프라인에서 실행되며, 인프라 정의 파일에 대한 알려진 취약점을 검사합니다. 기본 브랜치에 커밋되기 전에 취약점을 식별하여 애플리케이션의 위험에 미리 대처하세요.
IaC 스캐닝 분석기는 JSON 형식의 보고서를 작업 아티팩트로 출력합니다.
GitLab Ultimate를 사용하면 IaC 스캐닝 결과도 처리되어 다음과 같은 작업을 수행할 수 있습니다:
- 병합 요청에서 결과를 확인합니다.
- 승인 워크플로우에서 사용합니다.
- 취약점 보고서에서 검토합니다.
스캐너 활성화
사전 요구 사항:
- IaC 스캐닝은 AMD64 아키텍처를 요구합니다. Microsoft Windows는 지원되지 않습니다.
- 일관된 성능을 보장하기 위해 최소 4GB RAM이 필요합니다.
-
.gitlab-ci.yml
파일에test
단계가 필요합니다. - GitLab 자체 관리에서는
docker
또는kubernetes
실행기가 있는 GitLab Runner가 필요합니다. - GitLab.com의 SaaS 러너를 사용하는 경우 기본적으로 활성화되어 있습니다.
프로젝트의 IaC 스캐닝을 활성화하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 빌드 > 파이프라인 편집기를 선택합니다.
-
.gitlab-ci.yml
파일의 하단에 다음을 복사하여 붙여넣습니다.include
라인이 이미 존재하는 경우 아래의template
라인만 추가합니다.include: - template: Jobs/SAST-IaC.gitlab-ci.yml
-
유효성 검사 탭을 선택한 다음 파이프라인 유효성 검사를 선택합니다.
시뮬레이션이 성공적으로 완료되었습니다라는 메시지가 파일이 유효함을 나타냅니다. - 편집 탭을 선택합니다.
- 변경 사항 커밋을 선택합니다.
이제 파이프라인에는 IaC 스캐닝 작업이 포함됩니다.
지원되는 언어 및 프레임워크
IaC 스캐닝은 다양한 IaC 구성 파일을 지원합니다. 지원되는 구성 파일이 프로젝트에서 감지되면 KICS를 사용하여 스캔됩니다. IaC 구성 파일이 혼합된 프로젝트도 지원됩니다.
지원되는 구성 형식:
- Ansible
- AWS CloudFormation
-
Azure Resource Manager
- Dockerfile
- Google Deployment Manager
- Kubernetes
- OpenAPI
-
Terraform
사용자 지정 레지스트리에 있는 Terraform 모듈은 취약점에 대해 스캔되지 않습니다.
제안된 기능에 대한 자세한 내용은 문제 357004를 참조하십시오.
규칙 사용자 정의
GitLab에서 제공하는 기본 IaC 스캐닝 규칙을 사용자 정의할 수 있습니다.
다음 사용자 정의 옵션은 별도로 또는 함께 사용할 수 있습니다:
규칙 집합 정의
모든 IaC 스캐닝 규칙은 ruleset
섹션에 포함되며, 다음을 포함합니다:
- 규칙에 대한
type
필드. IaC 스캐닝의 경우, 식별자 유형은kics_id
입니다. - 규칙 식별자에 대한
value
필드. KICS 규칙 식별자는 영숫자 문자열입니다.
규칙 식별자를 찾으려면:- JSON 보고서 아티팩트에서 찾습니다.
- KICS 쿼리 목록에서 규칙 이름을 검색하고 표시된 영숫자 식별자를 복사합니다. 규칙 위반이 탐지되면 규칙 이름이 취약점 페이지에 표시됩니다.
규칙 비활성화
특정 IaC 스캐닝 규칙을 비활성화할 수 있습니다.
분석기 규칙을 비활성화하려면:
- 프로젝트의 루트에
.gitlab
디렉터리를 만듭니다. 이미 존재하지 않는 경우에만 생성합니다. -
.gitlab
디렉터리에sast-ruleset.toml
이라는 사용자 정의 규칙 집합 파일을 만듭니다. 이미 존재하지 않는 경우에만 생성합니다. -
ruleset
섹션의 문맥에서disabled
플래그를true
로 설정합니다. - 하나 이상의
ruleset
하위 섹션에서 비활성화할 규칙을 나열합니다.
sast-ruleset.toml
파일을 기본 브랜치에 병합한 후 비활성화된 규칙에 대한 기존 발견 사항은 자동으로 해결됩니다.
다음 예제 sast-ruleset.toml
파일에서 비활성화된 규칙은 식별자의 type
과 value
를 일치시켜 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"
주석을 사용한 스캐닝 비활성화
KICS 주석을 사용하여 KICS 기반 GitLab IaC 스캐닝 분석기가 코드베이스를 스캔하는 방법을 제어할 수 있습니다. 예를 들어:
- 전체 파일의 스캔을 건너뛰려면 파일 상단에
# kics-scan ignore
를 주석으로 추가할 수 있습니다. - 전체 파일에서 특정 규칙을 비활성화하려면 파일 상단에
# kics-scan disable=<kics_id>
를 주석으로 추가할 수 있습니다.
참고:
이 기능은 일부 유형의 IaC 파일에서만 사용할 수 있습니다. 지원되는 파일 유형에 대한 목록은 KICS 문서를 참조하십시오.
규칙 재정의
특정 IaC 스캐닝 규칙을 재정의하여 사용자 정의할 수 있습니다. 예를 들어, 규칙에 더 낮은 심각도를 할당하거나 발견 사항을 수정하는 방법에 대한 자체 문서에 연결할 수 있습니다.
규칙을 재정의하려면:
- 프로젝트의 루트에
.gitlab
디렉터리를 만듭니다. 이미 존재하지 않는 경우에만 생성합니다. -
.gitlab
디렉터리에sast-ruleset.toml
이라는 사용자 정의 규칙 집합 파일을 만듭니다. 이미 존재하지 않는 경우에만 생성합니다. - 하나 이상의
ruleset.identifier
하위 섹션에서 재정의할 규칙을 나열합니다. -
ruleset
섹션의ruleset.override
문맥에서 재정의할 키를 제공합니다. 임의 조합의 키를 재정의할 수 있습니다. 유효한 키는 다음과 같습니다:- description
- message
- name
- severity (유효한 옵션: Critical, High, Medium, Low, Unknown, Info)
다음 예제 sast-ruleset.toml
파일에서 규칙은 식별자의 type
과 value
를 통해 일치시킨 후 재정의됩니다:
[kics]
[[kics.ruleset]]
[kics.ruleset.identifier]
type = "kics_id"
value = "8212e2d7-e683-49bc-bf78-d6799075c5a7"
[kics.ruleset.override]
description = "OVERRIDDEN description"
message = "OVERRIDDEN message"
name = "OVERRIDDEN name"
severity = "Info"
오프라인 구성
Offering: Self-managed
오프라인 환경은 인터넷을 통한 외부 리소스에 대한 제한적, 제한된 또는 간헐적인 접근을 가지고 있습니다. 그러한 환경에 있는 셀프 관리형 GitLab 인스턴스의 경우, IaC는 일부 구성 변경을 요구합니다. 이 섹션의 지침은 오프라인 환경에서 자세히 설명된 지침과 함께 완료되어야 합니다.
GitLab Runner 구성
기본적으로 러너는 로컬 복사본이 있어도 GitLab 컨테이너 레지스트리에서 Docker 이미지를 끌어오려고 합니다. Docker 이미지가 최신 상태로 유지되도록 하려면 이 기본 설정을 사용해야 합니다. 그러나 네트워크 연결이 없으면 기본 GitLab Runner pull_policy
변수를 변경해야 합니다.
GitLab Runner CI/CD 변수 pull_policy
를
if-not-present
로 구성합니다.
로컬 IaC 분석기 이미지 사용
GitLab 컨테이너 레지스트리 대신 로컬 Docker 레지스트리에서 이미지를 얻으려면 로컬 IaC 분석기 이미지를 사용하십시오.
사전 요구 사항:
- 로컬 오프라인 Docker 레지스트리로 Docker 이미지를 가져오는 것은 귀하의 네트워크 보안 정책에 따라 다릅니다. 외부 리소스를 가져오거나 일시적으로 접근하기 위해 수락되고 승인된 프로세스를 찾기 위해 IT 직원과 상담하십시오.
-
registry.gitlab.com
에서 기본 IaC 분석기 이미지를
로컬 Docker 컨테이너 레지스트리로 가져옵니다:registry.gitlab.com/security-products/kics:5
IaC 분석기 이미지는 주기적으로 업데이트되므로 로컬 복사본을 주기적으로 업데이트해야 합니다.
-
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 템플릿은 주요 버전을 지정하고 해당 주요 버전에서 최신 분석기 릴리스를 자동으로 가져옵니다. 경우에 따라 특정 버전을 사용해야 할 수 있습니다. 예를 들어, 이후 릴리스에서 회귀를 피해야 할 수도 있습니다.
특정 분석기 버전을 사용하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 빌드 > 파이프라인 편집기를 선택합니다.
-
SAST_ANALYZER_IMAGE_TAG
CI/CD 변수를SAST-IaC.gitlab-ci.yml
템플릿을 포함한 줄 뒤에 추가합니다.참고:
이 변수를 특정 작업에만 설정하십시오. 최상위에서 설정하면 설정한 버전이 다른 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 스캐닝 발견 사항이 예기치 않게 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 스캐닝 필수 조건에 대한 자세한 내용은 스캐너 활성화를 참조하십시오.