본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 3장: 이미지 스캐닝과 취약점 관리
2026년 3월 11일·인프라·

3장: 이미지 스캐닝과 취약점 관리

Trivy, Grype, Snyk 컨테이너 스캐너를 비교하고, CI/CD 파이프라인에 취약점 스캐닝 게이트를 통합하여 안전한 이미지만 배포하는 방법을 다룹니다.

15분513자8개 섹션
securitykubernetesdevopsinfrastructure
공유
container-security3 / 10
12345678910
이전2장: 컨테이너 이미지 보안 기초다음4장: SBOM 생성과 관리

학습 목표

  • 컨테이너 이미지 스캐닝의 원리와 필요성을 이해합니다.
  • Trivy, Grype, Snyk의 특징과 차이점을 비교합니다.
  • **CVSS(Common Vulnerability Scoring System)**와 **EPSS(Exploit Prediction Scoring System)**를 활용한 취약점 우선순위 결정 방법을 익힙니다.
  • GitHub Actions에서 자동 스캐닝 파이프라인을 구축합니다.

이미지 스캐닝이란

이미지 스캐닝은 컨테이너 이미지에 포함된 패키지와 라이브러리를 분석하여 알려진 취약점을 탐지하는 과정입니다. 스캐너는 이미지의 각 레이어를 풀어서 설치된 패키지 목록을 추출하고, CVE(Common Vulnerabilities and Exposures) 데이터베이스와 대조합니다.

스캐닝 시점은 크게 세 가지로 나뉩니다.

  • 빌드 시: CI 파이프라인에서 이미지 빌드 직후 스캐닝
  • 레지스트리 저장 시: 이미지가 레지스트리에 푸시될 때 자동 스캐닝
  • 실행 시: 클러스터에서 실행 중인 이미지를 주기적으로 재스캐닝
Info

빌드 시점에 취약점이 없었더라도, 새로운 CVE가 발표되면 기존 이미지에 취약점이 생길 수 있습니다. 레지스트리의 주기적 재스캐닝이 필요한 이유입니다.


주요 스캐너 비교

Trivy

Trivy는 Aqua Security가 개발한 오픈소스 스캐너로, CNCF 프로젝트로 채택되었습니다. 컨테이너 이미지뿐만 아니라 파일시스템, Git 저장소, IaC(Infrastructure as Code) 설정, 쿠버네티스 클러스터까지 스캔할 수 있는 종합 보안 도구입니다.

Trivy 기본 사용법
bash
# 이미지 스캔
trivy image myapp:latest
 
# 심각도 필터링 (HIGH, CRITICAL만)
trivy image --severity HIGH,CRITICAL myapp:latest
 
# JSON 형식 출력
trivy image --format json --output result.json myapp:latest
 
# 파일시스템 스캔
trivy fs --scanners vuln,secret,misconfig .
 
# 쿠버네티스 클러스터 스캔
trivy k8s --report summary cluster

Trivy의 주요 강점은 다음과 같습니다.

  • 설치가 간단하고 별도 서버 없이 CLI로 동작합니다.
  • OS 패키지와 언어별 패키지(npm, pip, Go modules 등)를 모두 스캔합니다.
  • 시크릿 탐지, IaC 설정 오류 검사, 라이선스 확인까지 지원합니다.
  • SBOM 생성과 스캐닝을 하나의 도구로 처리할 수 있습니다.

Grype

Grype는 Anchore에서 개발한 오픈소스 취약점 스캐너입니다. Syft와 함께 사용하면 SBOM 생성부터 취약점 분석까지 파이프라인을 구성할 수 있습니다.

Grype 사용법
bash
# 이미지 스캔
grype myapp:latest
 
# SBOM을 입력으로 스캔
syft myapp:latest -o spdx-json > sbom.json
grype sbom:sbom.json
 
# 심각도 기준으로 실패 처리
grype myapp:latest --fail-on high

Grype의 특징은 Syft로 생성한 SBOM을 입력으로 받아 스캔할 수 있다는 점입니다. SBOM 생성과 스캐닝을 분리함으로써 각 단계를 독립적으로 관리할 수 있습니다.

Snyk Container

Snyk Container는 상용 서비스로, 취약점 탐지뿐만 아니라 수정 권장사항까지 제공합니다.

Snyk Container 사용법
bash
# 이미지 스캔
snyk container test myapp:latest
 
# 베이스 이미지 업그레이드 권장사항 포함
snyk container test myapp:latest --file=Dockerfile
 
# 지속적 모니터링 등록
snyk container monitor myapp:latest

Snyk의 차별점은 "이 취약점을 해결하려면 베이스 이미지를 어떤 버전으로 올려야 하는가"와 같은 구체적인 수정 가이드를 제공한다는 것입니다.

스캐너 비교표

항목TrivyGrypeSnyk Container
라이선스Apache 2.0Apache 2.0상용 (무료 플랜 있음)
OS 패키지OOO
언어별 패키지OOO
IaC 스캐닝OXO (별도 제품)
시크릿 탐지OXX
SBOM 생성OX (Syft 필요)X
수정 가이드부분적XO (상세)
오프라인 모드OOX

취약점 우선순위 결정

스캐닝 결과에서 수십에서 수백 개의 취약점이 나올 수 있습니다. 모든 취약점을 동시에 해결하는 것은 불가능하므로, 효과적인 우선순위 결정이 필수적입니다.

CVSS와 EPSS

CVSS는 취약점의 기술적 심각도를 0.0~10.0 점수로 나타냅니다. 그러나 CVSS 점수가 높다고 해서 반드시 실제 공격에 악용되는 것은 아닙니다.

EPSS는 해당 취약점이 향후 30일 내에 실제로 악용될 확률을 예측합니다. CVSS와 EPSS를 함께 사용하면 더 실질적인 우선순위를 정할 수 있습니다.

조합CVSSEPSS대응
긴급 대응높음 (7.0+)높음 (0.5+)즉시 패치
계획적 해결높음 (7.0+)낮음다음 릴리즈에 포함
모니터링낮음높음 (0.5+)모니터링 강화
수용 가능낮음낮음정기 업데이트 시 처리

오탐 관리

스캐너가 실제로는 영향이 없는 취약점을 보고하는 경우가 있습니다. 이를 **False Positive(오탐)**이라 합니다. 오탐을 효과적으로 관리하는 방법은 다음과 같습니다.

Trivy에서는 .trivyignore 파일로 특정 CVE를 무시할 수 있습니다.

.trivyignore
text
# 이 취약점은 우리 환경에서 영향 없음 (해당 기능 미사용)
CVE-2024-12345
 
# 업스트림 패치 대기 중, 2026-04-01까지 유예
CVE-2024-67890 exp:2026-04-01
Warning

오탐 무시 처리는 반드시 이유와 만료일을 기록해야 합니다. 무분별한 무시 처리는 실제 취약점을 놓치는 원인이 됩니다.


정책 기반 차단

취약점 스캐닝 결과에 따라 이미지 배포를 자동으로 차단하는 정책을 설정할 수 있습니다. 이를 **Scanning Gate(스캐닝 게이트)**라고 합니다.

정책 예시

일반적으로 다음과 같은 정책을 사용합니다.

  • CRITICAL 취약점: 수정 버전이 있는 경우 즉시 차단
  • HIGH 취약점: 수정 버전이 있으면 차단, 없으면 경고
  • MEDIUM 이하: 경고만 발생, 배포는 허용
Trivy 정책 기반 스캔
bash
# CRITICAL, HIGH 취약점이 있으면 종료 코드 1 반환
trivy image --severity CRITICAL,HIGH --exit-code 1 myapp:latest
 
# 수정 가능한 취약점만 대상으로 차단
trivy image --severity CRITICAL,HIGH \
  --ignore-unfixed \
  --exit-code 1 \
  myapp:latest

--ignore-unfixed 플래그는 아직 패치가 제공되지 않은 취약점을 무시합니다. 패치할 수 없는 취약점으로 인해 배포가 무한정 차단되는 상황을 방지합니다.


GitHub Actions 통합

CI/CD 파이프라인에 스캐닝을 통합하면 취약한 이미지가 프로덕션에 도달하기 전에 차단할 수 있습니다.

.github/workflows/image-scan.yml
yaml
name: Container Image Scan
 
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
 
jobs:
  build-and-scan:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write
 
    steps:
      - name: Checkout
        uses: actions/checkout@v4
 
      - name: Build image
        run: docker build -t myapp:${{ github.sha }} .
 
      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: myapp:${{ github.sha }}
          format: sarif
          output: trivy-results.sarif
          severity: CRITICAL,HIGH
          exit-code: "1"
          ignore-unfixed: true
 
      - name: Upload Trivy scan results to GitHub Security
        uses: github/codeql-action/upload-sarif@v3
        if: always()
        with:
          sarif_file: trivy-results.sarif
 
      - name: Run Grype as secondary scanner
        uses: anchore/scan-action@v4
        if: always()
        with:
          image: myapp:${{ github.sha }}
          fail-build: true
          severity-cutoff: high
          output-format: sarif

이 워크플로우의 핵심 포인트를 살펴보겠습니다.

  1. 이중 스캐닝: Trivy와 Grype를 함께 사용하여 하나의 스캐너가 놓치는 취약점을 다른 스캐너가 잡아냅니다.
  2. SARIF 출력: GitHub Security 탭에서 취약점을 직접 확인하고 관리할 수 있습니다.
  3. 종료 코드 제어: exit-code: "1"로 설정하여 취약점 발견 시 워크플로우가 실패하도록 합니다.
  4. if: always(): Trivy가 실패해도 Grype 스캔과 결과 업로드가 계속 실행됩니다.

PR 코멘트로 스캔 결과 표시

PR 코멘트 추가 (워크플로우 일부)
yaml
      - name: Run Trivy with table output
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: myapp:${{ github.sha }}
          format: table
          output: trivy-table.txt
          severity: CRITICAL,HIGH
 
      - name: Comment PR with scan results
        if: github.event_name == 'pull_request'
        uses: marocchino/sticky-pull-request-comment@v2
        with:
          header: trivy-scan
          path: trivy-table.txt

PR에 스캔 결과를 코멘트로 남기면, 리뷰어가 별도 도구 없이 취약점 현황을 바로 확인할 수 있습니다.


레지스트리 스캔 자동화

CI/CD 외에도 컨테이너 레지스트리에서 주기적으로 이미지를 재스캔하는 것이 중요합니다. 새로운 CVE가 발표되면 기존에 안전하던 이미지도 취약해질 수 있기 때문입니다.

cronjob-registry-scan.yaml
yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: registry-scan
  namespace: security
spec:
  schedule: "0 6 * * *"  # 매일 오전 6시
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: scanner
              image: aquasec/trivy:latest
              command:
                - trivy
                - image
                - --severity
                - CRITICAL,HIGH
                - --format
                - json
                - --output
                - /reports/daily-scan.json
                - registry.example.com/myapp:production
              volumeMounts:
                - name: reports
                  mountPath: /reports
          volumes:
            - name: reports
              persistentVolumeClaim:
                claimName: scan-reports
          restartPolicy: OnFailure
Tip

Amazon ECR, Google Artifact Registry, Harbor 등 주요 컨테이너 레지스트리는 내장 스캐닝 기능을 제공합니다. 자체 스캐닝 인프라를 구축하기 전에 레지스트리의 기본 기능을 먼저 확인하세요.


정리

이번 장에서는 이미지 스캐닝과 취약점 관리의 전체 흐름을 다루었습니다.

  • Trivy는 종합적인 오픈소스 스캐너로 가장 범용적이며, Grype는 SBOM 기반 스캐닝에 적합하고, Snyk은 수정 가이드가 뛰어납니다.
  • CVSS와 EPSS를 조합하여 취약점의 실질적인 우선순위를 결정합니다.
  • CI/CD 파이프라인에 스캐닝 게이트를 설정하여 취약한 이미지의 배포를 자동 차단합니다.
  • 레지스트리의 주기적 재스캐닝으로 새로 발표된 CVE에 대응합니다.

다음 장에서는 이미지에 포함된 모든 구성 요소를 목록화하는 **SBOM(소프트웨어 자재 명세서)**을 다룹니다. SBOM이 왜 필요한지, SPDX와 CycloneDX 형식의 차이, 그리고 Syft와 Trivy로 SBOM을 생성하고 관리하는 방법을 실습합니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#security#kubernetes#devops#infrastructure

관련 글

인프라

4장: SBOM 생성과 관리

SBOM(소프트웨어 자재 명세서)의 개념과 필요성, SPDX와 CycloneDX 형식을 비교하고, Syft와 Trivy로 SBOM을 생성하여 공급망 가시성을 확보하는 방법을 실습합니다.

2026년 3월 13일·14분
인프라

2장: 컨테이너 이미지 보안 기초

최소 베이스 이미지, 멀티스테이지 빌드, 루트 없는 컨테이너 등 Dockerfile 보안 모범 사례와 불변 이미지 전략을 실습합니다.

2026년 3월 9일·14분
인프라

5장: Sigstore와 Cosign — 이미지 서명

Sigstore 에코시스템(Cosign, Fulcio, Rekor)으로 컨테이너 이미지에 키리스 서명을 적용하고, SLSA 프레임워크 기반의 빌드 출처 증명을 구현합니다.

2026년 3월 15일·15분
이전 글2장: 컨테이너 이미지 보안 기초
다음 글4장: SBOM 생성과 관리

댓글

목차

약 15분 남음
  • 학습 목표
  • 이미지 스캐닝이란
  • 주요 스캐너 비교
    • Trivy
    • Grype
    • Snyk Container
    • 스캐너 비교표
  • 취약점 우선순위 결정
    • CVSS와 EPSS
    • 오탐 관리
  • 정책 기반 차단
    • 정책 예시
  • GitHub Actions 통합
    • PR 코멘트로 스캔 결과 표시
  • 레지스트리 스캔 자동화
  • 정리