Trivy(Aquasecurity)는 컨테이너 이미지, 파일 시스템, Git 저장소, Kubernetes 클러스터, IaC 템플릿 등 다양한 대상에서 취약점(CVE), IaC misconfiguration, 비밀 정보를 탐지하는 오픈소스 보안 스캐너입니다. 단일 바이너리로 배포되며, 빠른 속도와 높은 탐지율로 업계 표준으로 자리잡았습니다.
OS 패키지, 언어별 라이브러리( pip, npm, gem, cargo … )의 CVE를 빠르게 탐지합니다.
Terraform, CloudFormation, Dockerfile, Kubernetes manifest의 잘못된 설정을 감사합니다.
SPDX, CycloneDX 형식의 소프트웨어 자재 명세서를 자동 생성하여 공급망 보안을 지원합니다.
기존 스캐너(Clair, Snyk, Grype) 대비 Trivy의 강점은 속도, 단일 바이너리, 폭넓은 대상에 있습니다. 아래 비교표를 확인하세요.
| 특성 | Trivy | Clair | Grype | Snyk (유료) |
|---|---|---|---|---|
| 설치 방식 | 단일 바이너리 | Docker / 복잡한 클러스터 | 바이너리 + DB 업데이트 | npm / 유료 에이전트 |
| 대상 범위 | 이미지, fs, Git, K8s, IaC | 이미지 전용 | 이미지, fs | 이미지, 코드, IaC |
| SBOM | SPDX, CycloneDX | 제한적 | CycloneDX | CycloneDX (유료) |
| 속도 (이미지 1GB) | ~8초 | ~25초 | ~12초 | ~15초 (클라우드) |
| 오픈소스 | ✅ Apache 2.0 | ✅ Apache 2.0 | ✅ Apache 2.0 | ❌ 부분 유료 |
💡 AI/데이터 파이프라인에서는 학습 이미지, 모델 서빙 이미지의 취약점을 CI 단계에서 빠르게 걸러낼 수 있어 MLOps 보안에 최적입니다.
Trivy는 내부적으로 취약점 DB를 주기적으로 업데이트하며, 스캔 시점의 DB 스냅샷을 이용합니다. 아래 아키텍처는 동작 흐름을 나타냅니다.
핵심 용어:
⚠ 중요: 오프라인 환경에서는 trivy image --offline-scan 또는
--cache-dir로 DB를 사전 다운로드해야 합니다.
macOS / Linux 권장 방법:
# macOS (Homebrew)
brew install trivy
# Linux (스크립트)
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh
# 검증
trivy --version
Python 환경에서 라이브러리로 사용하려면:
# pip 설치 (실험적)
pip install trivy
프로젝트 루트에 trivy.yaml을 두면 자동 로드됩니다.
# trivy.yaml
severity: HIGH,CRITICAL
exit-code: 1
ignorefile: .trivyignore
format: table
vuln-type: os,library
scan:
skip-dirs:
- /usr/lib
- /node_modules
CLI – 이미지 스캔
# 가장 기본적인 명령어
trivy image python:3.12-slim
# 심각도 필터 + JSON 출력
trivy image --severity HIGH,CRITICAL --format json python:3.12-slim
Python SDK 예제
import trivy
# 이미지 스캔 (간략)
results = trivy.scan_image("python:3.12-slim")
for vuln in results.get("vulnerabilities", []):
print(f"{vuln['PkgName']} : {vuln['VulnerabilityID']} ({vuln['Severity']})")
# 파일 시스템 스캔
fs_results = trivy.scan_filesystem("/path/to/project")
print(fs_results["metadata"])
💡 팁: CI/CD 파이프라인에서는 --exit-code 1 옵션을 사용하여
취약점 발견 시 파이프라인을 실패시킬 수 있습니다.
주요 CLI 옵션과 환경 변수를 표로 정리했습니다.
| 옵션 / 환경변수 | 설명 | 예시 |
|---|---|---|
--severity |
출력할 심각도 수준 (UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL) | --severity HIGH,CRITICAL |
--exit-code |
취약점 발견 시 exit code 설정 (기본 0) | --exit-code 1 |
--format |
출력 형식 (table, json, sarif, html, cyclonedx, spdx) | --format json |
--cache-dir |
DB 캐시 디렉토리 경로 (기본 ~/.cache/trivy) | TRIVY_CACHE_DIR=/data/trivy-cache |
--ignorefile |
무시할 취약점 목록 파일 | .trivyignore |
TRIVY_DB_REPOSITORY |
취약점 DB 미러 URL (오프라인) | ghcr.io/aquasecurity/trivy-db |
원인: 최초 DB 다운로드가 느리거나 네트워크 제한.
해결: trivy image --download-db-only로 미리 받아두거나,
사내 미러(TRIVY_DB_REPOSITORY) 사용.
원인: Docker Hub 외 레지스트리 접근 실패.
해결: --image-config docker 또는 환경변수
DOCKER_CONFIG 설정.
원인: 특정 CVE가 실제 환경에 영향 없음.
해결: .trivyignore에 ID 추가
CVE-2023-xxxxx.
원인: 캐시 디렉토리가 너무 큼.
해결: trivy image --clear-cache 또는
TRIVY_CACHE_DIR을 SSD로 지정.
🔥 자주 겪는 문제: FATAL image scan error: scan error: unable to initialize a scanner: unable to parse image
→ 이미지가 손상되었거나 OCI 형식이 아닙니다. docker pull로 재시도하거나
--platform 옵션을 명시하세요.
📚 추가 학습: Trivy Operator(K8s), Trivy SBOM 생성,
trivy fs --ignore-unfixed 등 심화 기능은 공식 문서를 참고하세요.