2026년 하루 평균 보고된 CVE가 전년 대비 131% 증가했습니다.

종속성

컨테이너 스캔

컨테이너 스캔은 컨테이너 이미지에서 알려진 취약점, 오래된 패키지, 위험한 구성을 검사합니다. 이미지는 애플리케이션과 기반 운영체제, 그리고 그 사이의 모든 것을 묶어 두므로, 스캔은 애플리케이션 자체의 종속성보다 훨씬 넓은 범위를 다룹니다. 또한 완성된 이미지를 읽기 때문에, 이미지가 어떻게 만들어졌는지에 대해 알 수 있는 것은 제한됩니다.

업데이트

컨테이너 스캔의 작동 방식

  1. 이미지를 풉니다. 스캐너는 이미지의 레이어를 실행하지 않고 읽습니다.
  2. 내용을 나열합니다. 운영체제 패키지 데이터베이스와, 이미지에 복사된 package-lock.json 같은 애플리케이션 매니페스트를 읽습니다.
  3. 데이터를 대조합니다. 패키지를 배포판과 권고 데이터베이스의 취약점 데이터와 비교합니다.
  4. 구성을 검사합니다. 일부 도구는 root로 실행되거나 레이어에 시크릿이 남아 있는 것 같은 문제도 표시합니다.

스캔을 실행할 위치

단계 얻을 수 있는 것 한계
CI, 이미지 빌드 후 이미지를 푸시하기 전에 빌드를 실패 처리 그날 권고의 스냅샷
레지스트리 새 권고가 나올 때마다 저장된 이미지를 재스캔 이미지가 게시된 후에야 문제를 발견
Kubernetes 어드미션 배포 시점에 스캔되지 않았거나 실패한 이미지를 차단 정책과 예외 처리 방법이 필요
런타임 지금 어떤 이미지가 실행 중이고 무엇이 로드되었는지 표시 클러스터에 에이전트가 필요

컨테이너 스캔 도구

  • 오픈 소스: Trivy와 Grype가 흔히 쓰이는 무료 선택지이며, 둘 다 CI에 쉽게 통합됩니다.
  • 레지스트리와 플랫폼 내장: Docker Scout와 주요 클라우드 레지스트리가 스캔을 제공합니다.
  • 상용 플랫폼: Snyk와 Anchore는 정책, 보고, 워크플로를 더합니다.

발견 사항을 줄이는 법

  • 더 작은 베이스 이미지로 시작하세요. slim 또는 distroless 이미지는 패키지가 적어, 해당되는 권고도 적습니다.
  • 정기적으로 다시 빌드하세요. 베이스 이미지는 패치되며, 3월에 깨끗했던 이미지가 지금도 깨끗하지는 않습니다.
  • 멀티 스테이지 빌드를 사용하세요. 컴파일러와 빌드 도구는 최종 이미지에 넣지 마세요.
  • 베이스 이미지를 다이제스트로 고정하세요. 태그는 모르는 사이에 바뀔 수 있지만, 다이제스트는 바뀌지 않습니다.
  • 우선순위를 정하세요. 많은 발견 사항은 아직 수정 버전이 없거나 애플리케이션이 전혀 사용하지 않는 패키지에 있습니다. 취약점 우선순위를 정하는 방법을 참조하세요.

같은 수단은 이미지 밖에서도 통합니다. 취약점 노이즈를 줄이는 방법에서 실행하는 모든 스캐너에 맞게 이를 순서대로 정리했습니다.

컨테이너 스캔이 볼 수 없는 것

  • 컴파일된 코드. 이미지 안의 Go나 Rust 바이너리에는 메타데이터가 제한적으로만 들어 있어, 스캐너가 무엇이 들어갔는지 추론해야 합니다.
  • 패키지 기록이 없는 파일. curl로 추가하거나 레이어에 복사한 소프트웨어는 패키지 데이터베이스에 항목이 없습니다.
  • 빌드가 사용하고 버린 것. 멀티 스테이지 빌드는 이미지를 만든 도구를 버립니다. 그중 하나가 손상되었더라도 최종 이미지에는 아무 흔적이 없습니다.
  • 출처. 스캔은 이미지를 설명할 뿐, 이미지를 만든 빌드를 설명하지는 않습니다.

자세한 내용은 Docker 이미지 SBOM이 놓치는 것을, 선택지는 최고의 SBOM 도구를 참조하세요.

최근 사례로 PHP2Shell을 참조하세요. 공식 php 이미지는 PHP를 소스에서 컴파일하므로 런타임에 패키지 기록이 없고, 이미지마다 버전을 직접 물어봐야 합니다.

이미지 스캔과 빌드 기록

직접 빌드하지 않은 이미지, 그리고 클러스터와 구성에는 스캐너가 적합한 도구입니다. 직접 빌드하는 이미지에 대해서는 CRACI가 다른 길을 택합니다. GitHub Actions 러너로서 베이스 이미지와 그 운영체제 레이어를 포함해 빌드에 들어오는 것을 보므로, 나중에 추론하는 대신 들어간 것을 기록합니다. 그리고 새 취약점이 게시될 때마다 그 SBOM을 계속 검사합니다.

CRACI는 직접 빌드하지 않은 이미지, 클러스터, VM 이미지, 잘못된 구성은 스캔하지 않습니다. Trivy는 이를 스캔하므로 그런 용도에는 Trivy를 계속 사용하세요. CRACI vs Trivy를 참조하세요.

컨테이너 스캔: 자주 묻는 질문

컨테이너 스캔이란 무엇인가요?

컨테이너 이미지에서 알려진 취약점, 오래된 패키지, 위험한 구성을 검사하는 과정이며, 대개 이미지를 실행하지 않고 수행합니다.

컨테이너 이미지는 언제 스캔해야 하나요?

이미지를 빌드한 후 CI에서, 그리고 새 권고가 나올 때마다 레지스트리에서 다시 스캔하세요. 한 번만 스캔하면 금세 낡는 스냅샷만 남습니다.

가장 좋은 무료 컨테이너 스캐너는 무엇인가요?

Trivy와 Grype가 가장 널리 쓰이는 무료 선택지입니다. 둘 다 CI에서 실행되며 운영체제 패키지와 애플리케이션 패키지를 다룹니다.

이미지 스캔과 SBOM은 어떻게 다른가요?

SBOM은 이미지에 무엇이 들어 있는지 나열하고, 스캔은 그 내용에 알려진 문제가 있는지 검사합니다. 많은 스캐너는 먼저 SBOM을 만든 다음 권고와 대조합니다.

컨테이너 이미지에 왜 그렇게 많은 취약점이 있나요?

대부분 운영체제 패키지를 가져오는 베이스 이미지 때문입니다. 더 작은 베이스 이미지와 정기적인 재빌드로 대부분을 없앨 수 있습니다.

컨테이너 스캐너가 컴파일된 바이너리를 읽을 수 있나요?

부분적으로 가능합니다. Go와 Rust 바이너리에는 일부 종속성 메타데이터가 들어 있을 수 있지만, 많은 컴파일된 코드는 스캐너에 단서를 거의 주지 않아 무엇이 들어갔는지 추론해야 합니다.

이미지에 무엇이 들어갔는지 확인하세요

CRACI에서 이미지를 빌드하고, 기록된 SBOM을 컨테이너 스캐너의 보고 내용과 비교해 보세요.

데모 예약