온콜 런북
프로덕션 TRUSCA 스택에 대해 가장 빈번한 4개의 PagerDuty 알림에 대한 빠른 참조 플레이북입니다. 각 시나리오는 다음을 나열합니다:
- 증상 — 페이지를 트리거한 것
- 고객 영향 — 사용자가 지금 할 수 있는 / 할 수 없는 것
- 진단 — 실행할 정확한 명령(호스트 + 컨테이너)
- 복구 — 순서대로 수행할 조치
- 에스컬레이션 — 포털 개발팀을 깨워야 하는 시점
모든 명령은 docker-compose V1(하이픈) 과 bash 호스트 셸을 가정합니다.
Super-admin 토큰 발급(대부분 curl 예시에서 사용)
# EMAIL/PASSWORD 를 설치 시 생성한 super-admin 으로 교체하세요.
EMAIL=admin@example.com
PASSWORD=...
ACCESS_TOKEN=$(curl -fsS -X POST "https://<your-host>/api/auth/login" \
-H "Content-Type: application/json" \
-d "{\"email\":\"$EMAIL\",\"password\":\"$PASSWORD\"}" | jq -r '.access_token')
시나리오 1 — Trivy DB stale 또는 누락
증상
PagerDuty: TRUSCA Trivy DB last refresh > 14 days 또는 TRUSCA Trivy DB missing on worker. 곧 도착하는 /admin/health → Vulnerability data 카드(roadmap)가 이를 구동합니다.
고객 영향
- 신규 스캔 큐잉은 여전히 가능합니다 —
cdxgen+ scancode가 SBOM과 라이선스 finding을 계속 생성합니다. - DB refresh가 성공할 때까지 신규 CVE 탐지가 멈춥니다.
- 기존
vulnerability_findings행은 변경 없음 — 갭은 forward-only.
진단
# 1. DB가 디스크에 있는가?
docker-compose -f docker-compose.yml exec worker \
ls -lh /var/lib/trivy/db/
# 2. DB 메타데이터(Created 타임스탬프)
docker-compose -f docker-compose.yml exec worker \
cat /var/lib/trivy/db/metadata.json
# 3. 최근 download / refresh 로그
docker-compose -f docker-compose.yml logs --tail=500 worker | grep trivy_db
docker-compose -f docker-compose.yml logs --tail=500 beat | grep trivy_db_refresh
# 4. ghcr.io로 outbound HTTPS 도달 가능?
docker-compose -f docker-compose.yml exec worker \
curl -fsS https://ghcr.io/v2/ -o /dev/null -w "%{http_code}\n"
복구(순서대로)
- 일회성 refresh 강제(권장 — 단일 명령, 재시작 없음):
docker-compose -f docker-compose.yml exec worker \celery -A apps.backend.tasks.celery_app call tasks.trivy_db.refreshsleep 30docker-compose -f docker-compose.yml exec worker \cat /var/lib/trivy/db/metadata.json | jq '.Created'
- 비우고 재다운로드(메타데이터 손상 시):
부팅 시docker-compose -f docker-compose.yml exec worker \rm -rf /var/lib/trivy/dbdocker-compose -f docker-compose.yml restart worker
trivy --download-db-only가 실행되어 1~3분 내 디렉터리를 재채움. - 미러 폴백(워커에서
ghcr.io도달 불가 시):TRIVY_DB_REPOSITORY를 사내 미러로 설정 — 취약점 데이터 — Air-gapped 운영 참조.
복구 후 자동 재매칭 beat이 다음 사이클에서 기존 스캔에 대해 누락된 CVE를 가져옵니다 — 운영자 액션 불필요.
에스컬레이션
- 두 번의 refresh 시도가 같은 오류로 실패하거나,
- 최근
trivy registry login후에도 사내 미러가unauthorized를 반환하거나, metadata.json은 존재하지만 여러 생태계의 spot 스캔에서Results가 빈 경우(스키마 불일치 시사).
포털 개발팀 호출 시 첨부: 워커 로그(docker-compose logs --tail=2000 worker), metadata.json 내용, 워커 내부에서 trivy --version 출력.