Trivy 보안 스캔 가이드
Day 4 CI/CD — 컨테이너 이미지 취약점 스캔을 파이프라인에 넣는 방법
목차
왜 Trivy인가
- OS 패키지·언어 의존성·설정 이슈를 한 번에 스캔
- CLI 하나로 로컬·CI 동일 명령 사용
- GitHub Actions / GitLab CI 모두 붙이기 쉬움
설치
# macOS
brew install trivy
# 버전 확인
trivy --version
기본 스캔
# 로컬 이미지
trivy image nginx:latest
# CRITICAL / HIGH 만
trivy image --severity CRITICAL,HIGH my-app:1.0.0
# 결과를 파일로
trivy image -f table -o trivy-report.txt my-app:1.0.0
# JSON (CI 파싱용)
trivy image -f json -o trivy.json my-app:1.0.0
파일시스템·IaC도 가능합니다.
trivy fs .
trivy config ./k8s/
CI 연동 패턴
GitHub Actions (개념)
- name: Build image
run: docker build -t my-app:${{ github.sha }} .
- name: Trivy scan
run: |
trivy image --exit-code 1 --severity CRITICAL,HIGH my-app:${{ github.sha }}
--exit-code 1 이면 CRITICAL/HIGH 발견 시 잡 실패 → 배포 차단.
GitLab CI (개념)
trivy:
stage: test
image: aquasec/trivy:latest
script:
- trivy image --exit-code 1 --severity CRITICAL,HIGH $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
Day 4의 GitHub Public + GitLab Private 흐름에서는:
- GitHub에서 빌드·Trivy
- 통과 시 GitLab Registry 푸시 / 배포 트리거
자세한 하이브리드는 github-public+gitlab-private 참고.
결과 해석
| Severity | 권장 대응 |
|---|---|
| CRITICAL | 배포 차단, 즉시 패치/베이스 이미지 교체 |
| HIGH | 일정 내 패치, 예외는 문서화 |
| MEDIUM 이하 | 백로그 관리 |
베이스 이미지를 alpine / distroless 등으로 바꾸면 노이즈가 줄어드는 경우가 많습니다.
Day 4와의 관계
| 문서 | 역할 |
|---|---|
| Day 4 README | Ingress + 하이브리드 CI 전체 |
| Ingress Nginx | 클러스터 진입점 |
| 이 문서 | 이미지 보안 게이트 |