"베이스 OS 교체"를 독립 레버로 두던 기존 표현을 없앤다 — 이 저장소의 베이스 교체 이력을 전부 찾아보면 예외 없이 hardened-containers 자체 빌드 커밋이다(argocd· keycloak·cnpg-postgresql/etcd·apisix). 다른 배포판의 backport를 실제로 쓰려면 그 배포판 위에 앱을 다시 얹어야 하므로 그 자체가 이미 자체 빌드다. 빌드 없이 끝나는 진짜 무료 치환은 태그 교체와, 관리가 끊긴 벤더 이미지(bitnamilegacy 등)를 활성 벤더의 기존 이미지로 바꾸는 것뿐이다. dip-catalog는 이제 이미지를 전혀 빌드하지 않는다(자체 빌드는 hardened-containers로 완전히 이관됨) — 이 사실을 CLAUDE.md·관련 skill에 명시한다. 유일한 예외인 apisix keycloak-authz는 빌드가 아니라 이미 private으로 빌드된 이미지의 태그 반영이라 원칙에 위배되지 않는다. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
3.4 KiB
name, description
| name | description |
|---|---|
| sbom-cve-gate | 카탈로그 이미지의 SBOM 생성·CVE 스캔·게이트 판정을 실행하거나 결과를 해석할 때 사용한다. "SBOM 만들어줘", "취약점 스캔 돌려줘", "CVE 게이트 확인", "이 이미지 CRITICAL 몇 개야", "예외 등록" 같은 요청이 해당한다. scripts/pipeline/(extract-helm-images.sh, generate-sbom.sh, scan-sbom.sh, cve-gate.py)과 sbom.yml 워크플로를 다룬다. |
SBOM·CVE 게이트 실행
extract-helm-images.sh → generate-sbom.sh → scan-sbom.sh(+CoverageProbe) → cve-gate.py
실행 경로 2가지
기본은 GitHub 워크플로다 — 파이프라인은 도구가 설치된 컨테이너(vars.SBOM_PIPELINE_IMAGE)
안에서 돈다.
gh workflow run helm-catalog-sbom --repo <org>/dip-catalog -f limit=3 # 빠른 검증
gh workflow run helm-catalog-sbom --repo <org>/dip-catalog # 전체(limit=0)
gh run watch --repo <org>/dip-catalog
로컬에서 돌릴 때도 같은 컨테이너를 쓴다(정확한 docker run 명령은
doc/sbom-pipeline.md "로컬/컨테이너 실행" 참고).
레지스트리 인증이 필요하다 — TRIVY_USERNAME/TRIVY_PASSWORD(단일) 또는 DOCKER_CONFIG(다중).
빠른 검증은 generate 단계에 LIMIT=3.
결과 해석 시 반드시 볼 것
CoverageProbe를 먼저 본다. findings 0건이 "진짜 0건"인지 "스캐너가 그 배포판을 모르는
것"인지 구분하는 유일한 수단이다.
| 값 | 의미 |
|---|---|
ok |
데이터 있음 — 0건은 진짜 0건 |
none |
데이터 없음 → 게이트가 차단한다(거짓 clean) |
n/a |
OS 패키지 없음(distroless 등) |
게이트는 고유 CVE 단위로 집계하고 max(벤더 등급, NVD 등급) 를 실효 등급으로 쓴다 —
벤더가 하향 평가한 CVE를 놓치지 않기 위함이다(.claude/pitfalls.md "스캐너 결과를 그대로
믿지 말 것"). 승인 예외는 doc/cve-exceptions.json(근거·만료일 필수, .trivyignore 안 씀).
현재 상태 — 게이트는 warn-only다
sbom.yml은 cve-gate.py를 --warn-only로 호출한다. 게이트가 실패해도 워크플로/PR을
막지 않는다. 45+ 카탈로그 차트가 아직 이 게이트로 트리아지된 적이 없어, 강제 전환 전에
전체 스캔 1회로 현황 파악이 선행돼야 한다.
최신 미결 사항·전환 판단 근거는 MEMORY.md를 본다 — 이 skill에 중복 기록하지 않는다.
차단 CVE 대응 우선순위
무료 치환(태그 교체 · 이미지 좌표 교체) → 자체 빌드(hardened-containers) → 예외 승인
"베이스 OS 교체"라는 독립 레버는 없다 — 실제로 해보면 항상 자체 빌드로 귀결된다.
레버 판단 상세는 cve-remediation skill이 갖는다. 자체
빌드로 가야 한다면 별도 레포 hardened-containers에서 한다 — 그 레포의
docs/image-authoring/README.md가 절차 단일 출처다. 이 레포는 이미지를 빌드하지
않는다. 판정 로직 상세는 scripts/pipeline/cve-gate.py의 모듈 docstring을 1차
출처로 본다.
참고
- doc/sbom-pipeline.md — 파이프라인 상세(단계별 입출력, 실행 이미지)
doc/cve-exceptions.json— 승인 예외- .claude/pitfalls.md — 스캐너 신뢰 관련 실측 함정