f5b8e4b91f
hardened-containers가 이미 rescan.yml로 매일 자율 재스캔·재빌드하고, sbom.yml이 custom-values.yaml 기준으로 자체 빌드 이미지를 다른 카탈로그 이미지와 동일하게 스캔하고 있어 self-build-drift-check.yml의 트리거·전용 스캔이 순수 중복이었다 (SECURITY_IMAGES_DISPATCH_TOKEN도 등록된 적 없어 트리거 스텝은 항상 실패하던 죽은 코드). check-rebuild-needed.py가 더하던 fixable/no-fix 구분도 cve-gate.py 리포트에 이미 있어 흡수할 필요 없이 삭제했다. 근거는 ADR 0005. 곁들여 CI 위생 문제(trivy DB 캐시 없음, concurrency 없음, catalog-tag-update.yml의 브랜치 누적)를 함께 고치고, hardened-containers의 docs/image-authoring.md가 docs/image-authoring/ 로 분할된 것을 반영해 관련 링크를 정정했다. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
67 lines
3.1 KiB
Markdown
67 lines
3.1 KiB
Markdown
---
|
|
name: sbom-cve-gate
|
|
description: 카탈로그 이미지의 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`)
|
|
안에서 돈다.
|
|
|
|
```sh
|
|
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](../../../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](../../../MEMORY.md)를 본다 — 이 skill에
|
|
중복 기록하지 않는다.
|
|
|
|
## 차단 CVE 대응 우선순위
|
|
|
|
```
|
|
상위 태그 교체 → 베이스 OS 교체 → 자체 빌드 → 예외 승인
|
|
```
|
|
|
|
자체 빌드로 가야 한다면 별도 레포 `hardened-containers`에서 한다 — 그 레포의
|
|
`docs/image-authoring/README.md`가 절차 단일 출처다. 판정 로직 상세는
|
|
`scripts/pipeline/cve-gate.py`의 모듈 docstring을 1차 출처로 본다.
|
|
|
|
## 참고
|
|
|
|
- [doc/sbom-pipeline.md](../../../doc/sbom-pipeline.md) — 파이프라인 상세(단계별 입출력, 실행 이미지)
|
|
- `doc/cve-exceptions.json` — 승인 예외
|
|
- [.claude/pitfalls.md](../../pitfalls.md) — 스캐너 신뢰 관련 실측 함정
|