직접 만든 이미지에도 수십~수백 개의 알려진 취약점(CVE)이 들어 있을 수 있습니다. 대부분 내 코드가 아니라 베이스 이미지와 OS 패키지에서 옵니다. trivy는 이걸 몇 초 만에 스캔해 알려줍니다.
설치하고 바로 스캔
# 설치 (예: 바이너리)
brew install trivy # 또는 apt/yum 패키지
# 로컬 이미지 스캔
trivy image myapp:latest
처음 실행하면 취약점 DB를 받고, 이미지의 OS 패키지·언어 의존성을 분석해 결과를 출력합니다.
결과 읽는 법
myapp:latest (debian 12.4)
Total: 47 (UNKNOWN: 0, LOW: 30, MEDIUM: 12, HIGH: 4, CRITICAL: 1)
Library: libssl3
Vulnerability: CVE-2024-XXXX
Severity: CRITICAL
Installed: 3.0.11-1 Fixed: 3.0.13-1
핵심은 4개 컬럼입니다.
| 컬럼 | 의미 |
|---|---|
| Severity | 심각도 (CRITICAL/HIGH부터 대응) |
| Installed Version | 현재 설치된 취약 버전 |
| Fixed Version | 고쳐진 버전(있으면 업그레이드 가능) |
| CVE | 취약점 식별자 |
Fixed Version이 비어 있으면 아직 패치가 없는 것이라, 당장 고칠 수 없습니다.
노이즈 줄이고 진짜 문제만 보기
# CRITICAL·HIGH만, 패치 가능한 것만
trivy image --severity CRITICAL,HIGH --ignore-unfixed myapp:latest
--ignore-unfixed는 "고칠 수 없는" 취약점을 빼줘서 실제로 대응 가능한 항목에 집중하게 해줍니다.
취약점 줄이는 순서
① 베이스 이미지부터 교체 — 대부분의 CVE는 OS 패키지에서 옵니다. debian 풀 이미지를 slim이나 distroless로 바꾸면 패키지 수가 줄어 취약점이 크게 감소합니다.
② 베이스 이미지 최신 태그로 — node:20.1 대신 패치된 node:20처럼 갱신된 태그를 받고 다시 빌드합니다.
③ 패키지 개별 업그레이드 — Fixed Version이 있는 OS 패키지는 빌드 시 업그레이드합니다.
④ 남는 건 무시 목록으로 관리 — 대응 불가하거나 영향 없는 CVE는 .trivyignore에 CVE ID를 적어 결과에서 제외하되, 이유를 주석으로 남깁니다.
CI 게이트로 막기
CRITICAL 취약점이 있으면 빌드를 실패시켜 배포를 막습니다.
trivy image --exit-code 1 --severity CRITICAL myapp:latest
--exit-code 1이면 해당 심각도가 발견될 때 비정상 종료해 CI가 멈춥니다.
체크리스트
trivy image --severity CRITICAL,HIGH --ignore-unfixed myapp:latest
trivy image --exit-code 1 --severity CRITICAL myapp:latest # CI 게이트
docker history myapp:latest # 어느 레이어발인지
가벼운 베이스 이미지로 바꿔가며 취약점 수가 줄어드는 걸 직접 확인하는 실습은 도커 트랙에서 회원가입 없이 무료로 해볼 수 있습니다.