[DevSecOps 워크플로우 #3] GitHub Actions에서 IaC 보안 스캐닝 자동화 – Checkov 활용
안녕하세요, DevSecOps 워크플로우 전문가, 정보맛집 도비네입니다! ✨
최근 클라우드 환경에서는 인프라를 코드로 관리하는 IaC(Infrastructure as Code) 방식이 대세가 되었습니다. Terraform, CloudFormation, Kubernetes YAML 등으로 인프라를 정의하고 배포하면서, 인프라의 일관성과 배포 속도를 높일 수 있게 되었죠. 하지만 이 IaC 코드에 보안 취약점이나 잘못된 설정이 포함된다면, 배포되는 모든 인프라에 심각한 보안 문제가 발생할 수 있습니다.
이번 글에서는 IaC 코드의 보안 취약점과 설정 오류를 개발 단계에서부터 자동으로 검사하여, 안전한 인프라를 구축하는 방법을 알려드립니다. 특히, GitHub Actions 워크플로우에 Checkov라는 인기 있는 IaC 보안 스캐닝 도구를 통합하는 실무적인 방법을 상세히 다룹니다. 지금 바로 확인해 보세요! 👇
목차
IaC(Infrastructure as Code) 보안의 중요성
IaC는 인프라를 코드로 정의하고 버전 관리하며 자동화된 방식으로 배포하는 것을 의미합니다. 이는 개발 속도를 높이고 휴먼 에러를 줄이는 데 큰 장점이 있습니다. 하지만 동시에 새로운 보안 위협 요소를 만들어내기도 합니다.
✅ IaC 보안이 중요한 이유:
- 설정 오류의 확산: IaC 코드에 한 번의 잘못된 보안 설정이 들어가면, 해당 코드로 배포되는 모든 인프라에 동일한 취약점이 반복적으로 생성됩니다. 이는 공격자가 쉽게 악용할 수 있는 넓은 공격 표면을 만듭니다.
- 규제 준수: 많은 보안 규제(예: GDPR, HIPAA, 금융보안원 가이드라인)는 클라우드 인프라의 안전한 설정을 요구합니다. IaC 보안 스캐닝은 이러한 규제 준수 여부를 자동으로 검증하는 데 도움을 줍니다.
- Shift-Left Security: 보안 문제를 운영 단계에서 발견하면 수정 비용과 시간이 많이 듭니다. IaC 보안 스캐닝을 통해 개발 초기 단계(코드 작성 시점)에서 문제를 발견하고 수정하여 'Shift-Left' 보안을 실현할 수 있습니다.
Checkov이란?
Checkov는 Bridgecrew(Palo Alto Networks)에서 개발한 오픈소스 IaC 정적 분석 도구입니다. Terraform, CloudFormation, Kubernetes, Dockerfile 등 다양한 IaC 프레임워크의 코드를 스캔하여 보안 취약점, 규정 준수 위반, 잘못된 설정 등을 탐지합니다.
✅ Checkov의 주요 특징:
- 다양한 IaC 지원: Terraform, CloudFormation, Kubernetes, Azure Resource Manager, Serverless Framework, Dockerfile 등 폭넓은 IaC 유형을 지원합니다.
- 정책 기반 검사: 수백 가지의 내장된 보안 정책을 통해 일반적인 클라우드 보안 모범 사례 및 규정 준수 요구사항을 검사합니다.
- 쉬운 통합: CLI 도구로 제공되어 CI/CD 파이프라인에 쉽게 통합할 수 있습니다.
- 오픈소스: 활발한 커뮤니티 지원과 지속적인 업데이트가 이루어집니다.
GitHub Actions 워크플로우에 Checkov 통합하기
이제 GitHub Actions 워크플로우에 Checkov를 통합하여 IaC 보안 스캐닝을 자동화하는 방법을 살펴보겠습니다.
1. GitHub Actions 워크플로우 파일 생성
프로젝트 루트 디렉토리에 .github/workflows/
폴더를 만들고, 예를 들어 iac-security-scan.yml
파일을 생성합니다.
2. 워크플로우 내용 작성
다음은 Terraform 코드를 Checkov으로 스캔하는 GitHub Actions 워크플로우 예시입니다. 코드가 푸시(push
)되거나 풀 리퀘스트(pull_request
)가 생성될 때 자동으로 실행되도록 설정합니다.
name: IaC Security Scan with Checkov
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
checkov_scan:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x' # Checkov requires Python
- name: Install Checkov
run: pip install checkov
- name: Run Checkov Scan
run: |
# Terraform 코드 디렉토리를 스캔합니다.
# -d: 스캔할 디렉토리 (예: ./terraform)
# --output: 결과 출력 형식 (예: cli, json, junitxml)
# --soft-fail: 발견된 취약점이 있어도 워크플로우를 실패시키지 않음 (선택 사항)
checkov -d ./terraform --output cli --output-file-path checkov_results.txt
# Checkov이 실패 코드를 반환하면 GitHub Actions도 실패하도록 설정
# continue-on-error: true 를 사용하면 실패해도 워크플로우는 계속 진행됩니다.
# continue-on-error: true
- name: Upload Checkov Results
uses: actions/upload-artifact@v4
with:
name: checkov-results
path: checkov_results.txt
if: always() # 스캔 결과가 있든 없든 항상 업로드
코드 설명:
on: push / pull_request
:main
브랜치에 코드가 푸시되거나 풀 리퀘스트가 생성될 때 워크플로우가 트리거됩니다.actions/checkout@v4
: GitHub 저장소 코드를 워크플로우 환경으로 가져옵니다.actions/setup-python@v5
: Checkov 실행에 필요한 Python 환경을 설정합니다.pip install checkov
: Checkov 도구를 설치합니다.checkov -d ./terraform --output cli --output-file-path checkov_results.txt
:./terraform
디렉토리의 IaC 코드를 스캔하고, 결과를 텍스트 파일로 저장합니다. 필요에 따라-f
옵션으로 특정 파일만 스캔하거나,--framework
옵션으로 특정 IaC 프레임워크만 지정할 수 있습니다.actions/upload-artifact@v4
: 스캔 결과를 아티팩트로 업로드하여 워크플로우 실행 후에도 결과를 확인할 수 있도록 합니다.
3. 결과 확인 및 조치
워크플로우가 실행되면 GitHub Actions 탭에서 결과를 확인할 수 있습니다. Checkov이 탐지한 취약점이나 설정 오류는 워크플로우 로그에 표시되며, 아티팩트로 업로드된 결과 파일에서도 상세 내용을 볼 수 있습니다. 발견된 문제점은 개발자가 코드를 수정하여 해결해야 합니다.
정리 및 실무 팁
GitHub Actions에 Checkov를 통합하는 것은 IaC 보안을 강화하는 효과적인 DevSecOps 실천 방법입니다.
- CI/CD 파이프라인에 통합: IaC 코드 변경 시 자동으로 보안 검사가 이루어지도록 CI/CD 파이프라인의 필수 단계로 포함하세요.
- 정책 사용자 정의: 기본 정책 외에 조직의 보안 정책이나 규제 요구사항에 맞춰 Checkov 사용자 정의 정책을 생성하여 활용할 수 있습니다.
- 결과 시각화 및 알림: 스캔 결과를 Slack, Jira 등 다른 도구와 연동하여 보안 팀에 자동으로 알리거나 대시보드에서 시각화하면 관리 효율성을 높일 수 있습니다.
- 코드 리뷰와 연계: 풀 리퀘스트 시 Checkov 스캔 결과를 확인하고, 문제가 발견되면 머지(Merge)를 제한하는 등 코드 리뷰 프로세스와 연계하여 보안 게이트를 강화하세요.
IaC는 인프라 관리를 혁신했지만, 그만큼 보안에 대한 새로운 접근 방식이 필요합니다. 오늘 도비네가 알려드린 Checkov을 활용한 IaC 보안 스캐닝 자동화 가이드가 여러분의 DevSecOps 여정을 더욱 안전하고 효율적으로 만드는 데 도움이 되기를 바랍니다! 🛡️
도움이 되셨다면 댓글이나 구독 부탁드립니다! 🙏