IaC 스캔
Dockerfile에 USER root가 그대로 남아 있거나, Kubernetes 매니페스트에 권한 제한이 빠져 있다면 어떻게 알 수 있을까요? IaC(Infrastructure as Code) 스캔은 인프라를 정의한 코드를 검사하여 보안 설정 오류를 자동으로 찾아냅니다.
요즘 인프라는 코드로 정의됩니다. Dockerfile, Kubernetes 매니페스트, Terraform 파일이 곧 인프라의 설계도입니다. 이 설계도에 잘못된 설정이 있으면 컨테이너가 과도한 권한으로 실행되거나, 외부에 불필요한 포트가 열리는 등 보안 사고로 이어질 수 있습니다. IaC 스캔은 인프라가 배포되기 전에 코드 수준에서 문제를 발견합니다.

개요
- 분석 대상: Git 저장소의 인프라 정의 코드 (Dockerfile, Kubernetes 매니페스트, Terraform 등)
- 분석 엔진: Checkov
- 분석 기준: Checkov 내장 정책 (CIS Benchmark 기반 베스트 프랙티스)
- 결과 형식: 정책 체크 항목별 통과/실패 판정
SAST는 애플리케이션 소스 코드의 취약한 로직을 찾고, IaC 스캔은 인프라 설정 코드의 잘못된 구성을 찾습니다. 둘 다 코드를 정적으로 분석하지만 검사 대상이 다릅니다.
Step 1: IaC 스캔 진입
- 사이드바의 "보안" 그룹 > [보안 분석] 메뉴를 클릭합니다.
- 페이지 상단의 카드 캐러셀에서 분석할 서비스를 선택합니다.
- IaC 탭을 선택합니다.
/security?id={서비스ID}&area=iac URL로 진입하면 해당 서비스의 IaC 탭이 바로 열립니다.
Step 2: 스캔 입력 항목
IaC 탭 상단의 트리거 바에서는 다음 항목을 사용합니다.
- Git 저장소 URL (필수): 인프라 코드가 있는 저장소 URL
- 브랜치 (선택, 기본
main): 분석할 브랜치명 - Git 토큰 (선택, Private Repo용): 저장소 읽기 권한이 있는 토큰
Git URL, 브랜치, 토큰은 설정 탭에서 SAST/IaC/시크릿 공통으로 등록할 수 있습니다. 설정 탭에 등록해두면 IaC 스캔 시 자동으로 사용됩니다.
Git 토큰을 직접 입력하지 않으면, 백엔드는 설정 탭이나 기관/조직 설정에 저장된 토큰을 자동으로 사용합니다.
Step 3: 스캔 실행
스캔 시작 버튼을 클릭하면 Checkov가 저장소를 클론하여 인프라 정의 파일을 분석합니다. 진행률은 WebSocket을 통해 실시간으로 표시됩니다.
Checkov는 저장소에서 다음과 같은 인프라 정의 파일을 자동으로 탐지하여 검사합니다.
- Dockerfile: 베이스 이미지, 사용자 권한, 노출 포트 등
- Kubernetes 매니페스트 (
*.yaml): Pod 보안 컨텍스트, 리소스 제한, 권한 설정 등 - Terraform (
*.tf): 클라우드 리소스 설정, 네트워크 규칙, 암호화 설정 등
스캔이 완료되면 결과 화면이 자동으로 갱신됩니다.
Step 4: 결과 확인
4.1 결과 요약
스캔이 완료되면 다음 정보를 확인할 수 있습니다.
- 총 체크 수: Checkov가 수행한 정책 체크 항목의 총 개수
- 통과 / 실패: 통과한 항목과 실패한 항목의 수
- 심각도별 분류: 실패한 항목의 심각도 분포 (Critical/High/Medium/Low/Unknown) — 심각도가 확인되지 않은 항목은 Unknown으로 분류됩니다.
4.2 실패 항목 상세
실패한 체크 항목을 클릭하면 다음 정보를 확인할 수 있습니다.
- 파일 위치: 문제가 발견된 파일 경로와 라인 번호
- 정책 ID 및 설명: 어떤 Checkov 정책에 위배되었는지
- 심각도: 문제의 심각도
- 권장 조치: 설정을 어떻게 수정해야 하는지 안내
4.3 스캔 이력
IaC 탭의 스캔 이력 테이블에서는 시점별 정책 위반 추세를 확인할 수 있습니다. 매 스캔마다 결과가 누적되므로 보안 개선 진척도를 한눈에 파악할 수 있습니다.
- 스캔 일시: 각 스캔 실행 시각
- Critical/High/Medium/Low: 각 심각도별 위반 건수
- 위반 총계: 누적 위반 수와 이전 스캔 대비 증감 표시 (▲/▼)
- 보는 중: 현재 결과 영역에 표시 중인 시점을 마크
이력 테이블의 행을 클릭하면 그 시점의 상세 결과(실패한 체크 항목 목록)가 결과 영역에 표시됩니다. 특정 시점 이후의 변화를 비교 분석할 때 유용합니다.
주요 탐지 항목
Dockerfile
- root 사용자 실행:
USER지시어 없이 컨테이너가 root로 실행되는 경우 - 고정되지 않은 베이스 이미지 태그:
latest태그 사용으로 재현성이 깨지는 경우 - 불필요한 패키지 설치: 공격 표면을 넓히는 패키지 포함
Kubernetes 매니페스트
- 권한 상승 허용:
allowPrivilegeEscalation이 제한되지 않은 경우 - 리소스 제한 누락: CPU/메모리 limit가 설정되지 않은 경우
- 읽기 전용 루트 파일시스템 미설정:
readOnlyRootFilesystem이 적용되지 않은 경우
Terraform
- 암호화 미설정: 스토리지나 데이터베이스 암호화가 비활성화된 경우
- 과도하게 개방된 네트워크 규칙: 보안 그룹이
0.0.0.0/0에 포트를 노출하는 경우
컨테이너를 root로 실행하면 컨테이너 탈출(escape) 시 호스트가 위험해질 수 있습니다. Dockerfile에 USER 지시어를 추가하고, Kubernetes에서는 securityContext로 권한을 제한하세요.
문제 해결
스캔 실패
-
코드 접근 불가: Git 토큰에 저장소 읽기 권한이 있는지 확인하세요. 설정 탭이나 기관 설정의 저장된 토큰이 자동으로 사용됩니다.
-
인프라 파일 없음: 저장소에 Dockerfile, Kubernetes 매니페스트, Terraform 파일이 없으면 검사 대상이 없어 결과가 비어 있을 수 있습니다.
-
타임아웃: 대용량 저장소의 경우 분석 시간이 오래 걸릴 수 있습니다. 분석 범위를 특정 브랜치로 제한하세요.
과다 탐지
Checkov 내장 정책은 엄격한 베스트 프랙티스를 기준으로 하므로 실패 항목이 많을 수 있습니다. Critical/High 심각도의 항목부터 우선 처리하세요.