Zum Hauptinhalt springen

Trivy

Trivy는 컨테이너 이미지, 파일시스템, Git 저장소의 취약점을 스캔하는 보안 도구입니다. Lumie 인프라에서는 Trivy Operator를 통해 Kubernetes 클러스터 내 모든 이미지를 자동으로 스캔합니다.

아키텍처

구성 요소

Trivy Operator

  • 역할: Kubernetes 리소스 모니터링 및 스캔 작업 관리
  • 이미지: zot.lumie-infra.com/aquasec/trivy-operator:0.30.0
  • 리소스: CPU 50m, Memory 384Mi

Trivy Scanner

  • 역할: 실제 취약점 스캔 수행
  • 이미지: zot.lumie-infra.com/aquasec/trivy:0.68.2
  • 모드: Standalone (독립 실행)
  • 스토리지: 5Gi PVC (취약점 DB 캐시)

스캔 기능

취약점 스캔 (Vulnerability Scanning)

컨테이너 이미지의 OS 패키지 및 애플리케이션 의존성 취약점을 탐지합니다.

지원 대상:

  • OS 패키지: Alpine, Debian, Ubuntu, RHEL, CentOS
  • 언어별 의존성: Java (JAR), Python (pip), Node.js (npm), Go modules
  • 애플리케이션: WordPress, Ruby gems, PHP Composer

설정 감사 (Configuration Audit)

Kubernetes 리소스의 보안 설정을 검사합니다.

검사 항목:

  • Pod Security Standards 위반
  • 리소스 제한 누락
  • 보안 컨텍스트 설정
  • 네트워크 정책 부재

운영 설정

스캔 정책

# TTL 기반 주기적 재스캔 비활성화 (새 이미지 배포 시에만 스캔)
extraEnv:
- name: OPERATOR_SCANNER_REPORT_TTL
value: ""

operator:
scannerReportTTL: "" # 빈 값 = TTL 비활성화
scanJobTimeout: 10m
scanJobsConcurrentLimit: 2 # 동시 스캔 작업 제한

스캔 범위

operator:
vulnerabilityScannerEnabled: true # 취약점 스캔 활성화
configAuditScannerEnabled: true # 설정 감사 활성화
rbacAssessmentScannerEnabled: false # RBAC 평가 비활성화
infraAssessmentScannerEnabled: false # 인프라 평가 비활성화
clusterComplianceEnabled: false # 클러스터 컴플라이언스 비활성화
exposedSecretScannerEnabled: false # 노출된 시크릿 스캔 비활성화
sbomGenerationEnabled: false # SBOM 생성 비활성화

네임스페이스 제외

시스템 네임스페이스는 스캔에서 제외합니다:

excludeNamespaces: "kube-system,kube-public,kube-node-lease"

스캔 결과

VulnerabilityReport CRD

각 이미지에 대한 취약점 스캔 결과가 CRD로 저장됩니다:

# 취약점 리포트 확인
kubectl get vulnerabilityreports

# 특정 워크로드의 취약점 확인
kubectl get vulnerabilityreports -l trivy-operator.resource.name=my-deployment

ConfigAuditReport CRD

Kubernetes 리소스의 설정 감사 결과:

# 설정 감사 리포트 확인
kubectl get configauditreports

# 특정 네임스페이스의 설정 문제 확인
kubectl get configauditreports -n my-namespace

스캔 작업 관리

스캔 작업 리소스

trivy:
resources:
requests:
cpu: 100m
memory: 500Mi
limits:
memory: 500Mi # CPU limit 없음 (스캔 성능 향상)

스토리지 설정

trivy:
mode: Standalone
storageClassEnabled: true
storageSize: "5Gi" # 취약점 DB 캐시용

모니터링

Prometheus 메트릭

serviceMonitor:
enabled: true

주요 메트릭:

  • trivy_operator_vulnerability_id_total: 발견된 취약점 수
  • trivy_operator_image_scan_duration_seconds: 이미지 스캔 소요 시간
  • trivy_operator_config_audit_total: 설정 감사 결과 수

대시보드 쿼리

# 심각도별 취약점 수
sum by (severity) (trivy_operator_vulnerability_id_total)

# 네임스페이스별 취약점 분포
topk(10, sum by (namespace) (trivy_operator_vulnerability_id_total))

# 스캔 실패율
rate(trivy_operator_scan_job_result_total{result="Error"}[5m])

보안 설정

Pod Security Context

podSecurityContext:
runAsUser: 65534
runAsNonRoot: true
fsGroup: 65534

securityContext:
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL

RBAC 권한

Trivy Operator는 클러스터 전체 리소스 읽기 권한이 필요합니다:

rbac:
create: true

# ClusterRole 권한:
# - pods, deployments, replicasets 읽기
# - vulnerabilityreports, configauditreports 생성/수정
# - jobs 생성 (스캔 작업용)

취약점 대응

심각도 분류

심각도설명대응 방안
CRITICAL즉시 악용 가능한 취약점즉시 패치 또는 이미지 교체
HIGH높은 위험도 취약점1주일 내 패치
MEDIUM중간 위험도 취약점1개월 내 패치
LOW낮은 위험도 취약점다음 정기 업데이트 시 패치

취약점 조회

# 특정 이미지의 취약점 상세 확인
kubectl get vulnerabilityreport <report-name> -o yaml

# CRITICAL/HIGH 취약점만 필터링
kubectl get vulnerabilityreports -o json | \
jq '.items[] | select(.report.summary.criticalCount > 0 or .report.summary.highCount > 0)'

예외 처리

특정 취약점을 무시해야 하는 경우 .trivyignore 파일 사용:

# .trivyignore 파일 예시
CVE-2023-1234 # 패치 불가능한 베이스 이미지 취약점
CVE-2023-5678 # 사용하지 않는 기능의 취약점

CI/CD 통합

Tekton Pipeline 통합

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: trivy-scan
spec:
params:
- name: image
type: string
steps:
- name: scan
image: zot.lumie-infra.com/aquasec/trivy:0.68.2
script: |
trivy image --exit-code 1 --severity HIGH,CRITICAL $(params.image)

GitHub Actions 통합

- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'zot.lumie-infra.com/lumie/backend:latest'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'

문제 해결

스캔 실패 디버깅

# 스캔 작업 로그 확인
kubectl logs -n trivy-system -l app.kubernetes.io/name=trivy-operator

# 실패한 스캔 작업 확인
kubectl get jobs -n trivy-system --field-selector status.successful=0

# 특정 스캔 작업 로그 확인
kubectl logs -n trivy-system job/scan-vulnerabilityreport-<hash>

성능 최적화

# 동시 스캔 작업 수 조정
kubectl patch configmap trivy-operator -n trivy-system --patch '
data:
scanJob.concurrentLimit: "4"
'

# 스캔 타임아웃 조정
kubectl patch configmap trivy-operator -n trivy-system --patch '
data:
scanJob.timeout: "15m"
'

스토리지 관리

# 취약점 DB 캐시 크기 확인
kubectl exec -n trivy-system deployment/trivy-operator -- du -sh /tmp/trivy

# 캐시 정리 (필요시)
kubectl delete pvc -n trivy-system trivy-db

관련 문서