CVE/SBOM 게이트 문서화: CLAUDE.md 3번째 서브시스템 + MEMORY.md 신설
CLAUDE.md 에 CVE/SBOM 게이트 서브시스템 절 추가(기존 7개 설계 원칙·구현 현황은 변경 없음). doc/sbom-pipeline.md 에 게이트 판정 절 + 커버리지 자가진단 미이식 제약 명시. MEMORY.md 신설 — warn-only 상태, 45+ 차트 미검증, 자체 빌드 프레임워크 미사용, SBOM_PIPELINE_IMAGE 재빌드 보류 등 후속 결정 사항 기록.
This commit is contained in:
+30
-10
@@ -24,7 +24,7 @@ manifests/helm/** ──helm template──▶ images_final.tsv ──trivy ima
|
||||
(CVE DB 갱신 시 재pull 없이 재스캔). → 파이프라인 비용의 대부분은 SBOM 생성(이미지 pull)이고 스캔은 초 단위.
|
||||
- 스캔 대상 이미지는 trivy 가 원격에서 받아 분석 후 폐기하므로 호스트/이미지 스토어에 남지 않는다.
|
||||
|
||||
## 스크립트 (`doc/scripts/`)
|
||||
## 스크립트 (`scripts/pipeline/`)
|
||||
|
||||
바이너리(`helm`/`trivy`/`python3`)를 **컨테이너 내부에서 직접 호출**한다(도커 소켓·docker CLI 불필요).
|
||||
|
||||
@@ -45,16 +45,16 @@ manifests/helm/** ──helm template──▶ images_final.tsv ──trivy ima
|
||||
docker run --rm -v "$PWD:/repo" -w /repo \
|
||||
-e TRIVY_CACHE_DIR=/repo/sbom-out/cache -e DOCKER_CONFIG=/repo/sbom-out/.docker \
|
||||
docker.io/wbsong111/sbom-pipeline:latest bash -c '
|
||||
bash doc/scripts/extract-helm-images.sh manifests/helm sbom-out
|
||||
bash doc/scripts/generate-sbom.sh sbom-out/images_final.tsv sbom-out # 인증: DOCKER_CONFIG/TRIVY_USERNAME
|
||||
bash doc/scripts/scan-sbom.sh sbom-out
|
||||
bash scripts/pipeline/extract-helm-images.sh manifests/helm sbom-out
|
||||
bash scripts/pipeline/generate-sbom.sh sbom-out/images_final.tsv sbom-out # 인증: DOCKER_CONFIG/TRIVY_USERNAME
|
||||
bash scripts/pipeline/scan-sbom.sh sbom-out
|
||||
'
|
||||
# 빠른 검증: generate 단계에 -e LIMIT=3
|
||||
```
|
||||
|
||||
## 실행 이미지 (`doc/scripts/Dockerfile`)
|
||||
## 실행 이미지 (`scripts/pipeline/Dockerfile`)
|
||||
|
||||
파이프라인은 **도구가 설치된 컨테이너 안에서** 돈다. 그 이미지는 [doc/scripts/Dockerfile](scripts/Dockerfile)로 빌드한다.
|
||||
파이프라인은 **도구가 설치된 컨테이너 안에서** 돈다. 그 이미지는 [scripts/pipeline/Dockerfile](../scripts/pipeline/Dockerfile)로 빌드한다.
|
||||
|
||||
| 항목 | 값 |
|
||||
|------|------|
|
||||
@@ -63,6 +63,9 @@ docker run --rm -v "$PWD:/repo" -w /repo \
|
||||
| 아키텍처 | **linux/amd64** (GitHub 러너와 일치) |
|
||||
| 현재 이미지 | `docker.io/wbsong111/sbom-pipeline:latest` (public) |
|
||||
|
||||
> 재빌드 후 `paasup` 네임스페이스로 이전 예정 — 미완료(`MEMORY.md` 참고). Dockerfile 내용은
|
||||
> 안 바뀌었으므로 위 이미지는 이 마이그레이션으로 당장 깨지지 않는다.
|
||||
|
||||
> **glibc(debian) 필수**: GitHub Actions 의 `container:` 안에서 `actions/checkout`·`upload-artifact`
|
||||
> (node 기반)가 동작하려면 glibc 이거나 node 가 있어야 한다. `aquasec/trivy` 같은 **alpine(musl)
|
||||
> 이미지는 node 실행 실패** → debian 사용. **amd64 필수**(러너 아키텍처).
|
||||
@@ -71,8 +74,8 @@ docker run --rm -v "$PWD:/repo" -w /repo \
|
||||
|
||||
```bash
|
||||
docker buildx build --platform linux/amd64 \
|
||||
-t docker.io/<org>/sbom-pipeline:latest \
|
||||
-f doc/scripts/Dockerfile --push doc/scripts
|
||||
-t docker.io/paasup/sbom-pipeline:latest \
|
||||
-f scripts/pipeline/Dockerfile --push scripts/pipeline
|
||||
```
|
||||
|
||||
> credsStore(Docker Desktop) 환경에서 `docker-container` 빌더로 `--push` 시 인증 실패하면,
|
||||
@@ -89,6 +92,7 @@ docker buildx build --platform linux/amd64 \
|
||||
- **아티팩트**: 스테이징 디렉토리(`report/`)로 모아 **상대경로**로 업로드(절대경로면 v4 가 전체 경로트리를 보존하므로).
|
||||
- **스캔 주기 원칙**: 인벤토리·SBOM 은 차트 변경 시에만 바뀌지만 **취약점은 새 CVE 로 계속 변하므로 스케줄 전체
|
||||
스캔이 필수**. PR 은 변경 차트만, 스케줄은 전체.
|
||||
- **게이트**: 스캔 뒤 `scripts/pipeline/cve-gate.py` 로 판정(현재 `--warn-only`).
|
||||
|
||||
### 실행
|
||||
|
||||
@@ -98,6 +102,22 @@ gh workflow run helm-catalog-sbom --repo <org>/dip-catalog # 전체
|
||||
gh run watch --repo <org>/dip-catalog
|
||||
```
|
||||
|
||||
## CVE 게이트 (`scripts/pipeline/cve-gate.py`)
|
||||
|
||||
스캔이 끝나면 `cve-gate.py` 가 `trivy-reports/*.json` 을 판정한다: 고유 CVE 단위 집계,
|
||||
`max(벤더 등급, NVD 등급)` 실효 등급, `doc/cve-exceptions.json` 승인 예외 처리. 상세 판정
|
||||
로직·근거는 스크립트 자체의 모듈 docstring을 우선 참고한다.
|
||||
|
||||
현재 `sbom.yml` 은 `--warn-only` 로 호출한다 — 게이트가 실패해도 워크플로/PR 을 막지
|
||||
않는다. 45+ 개 카탈로그 차트가 아직 이 게이트로 트리아지된 적이 없어, 강제 전환 전에
|
||||
먼저 전체 스캔 1회로 현황을 파악해야 한다(`MEMORY.md`).
|
||||
|
||||
> **커버리지 자가진단 미이식 — 알려진 제약.** security-catalog 의 `scan-sbom.sh` 는 SBOM
|
||||
> 사본에 센티널 패키지를 주입해 재스캔하는 `CoverageProbe` 자가진단으로 "0건"과
|
||||
> "측정되지 않음"을 구분한다. dip-catalog 의 `scan-sbom.sh` 는 이 로직이 없다 — 게이트는
|
||||
> 항상 "프로브 이전 리포트" 경로로 판정한다(findings 총계 0건이면 보수적으로 실패,
|
||||
> os-pkgs만 0건이면 경고만). 이식 여부는 미결(`MEMORY.md`).
|
||||
|
||||
## GitHub 설정 (워크플로 활성화에 필요)
|
||||
|
||||
`Settings → Secrets and variables → Actions`
|
||||
@@ -158,8 +178,8 @@ trivy 병렬 실행 시 공유 캐시 bolt 잠금 충돌을 피하려 워커는
|
||||
1. **우선순위**: fix 가능(`--ignore-unfixed`) → KEV/EPSS(실제 악용) → 노출도(인터넷 vs 내부) → 심각도.
|
||||
2. **대응 레버(모두 Git PR)**: 차트/이미지 **버전 업**(최고 레버리지) · **베이스 이미지 교체**(특히 미유지 `bitnamilegacy/*`) ·
|
||||
**소유 이미지(`paasup/*`, `wbsong111/*`) 재빌드** · 좋은 버전 선정 후 **digest 고정**.
|
||||
3. **게이트·억제**: PR 에 "새로 유입되는 fix-available CRITICAL" 차단 게이트(워크플로에 주석으로 준비됨),
|
||||
수용 CVE 는 `.trivyignore`(사유·만료일 명시).
|
||||
3. **게이트·억제**: `scripts/pipeline/cve-gate.py` 가 고유 CVE·실효 등급 기준으로 판정한다(현재
|
||||
warn-only — 위 "CVE 게이트" 절 참고). 수용 CVE 는 `doc/cve-exceptions.json`(근거·만료일 명시).
|
||||
4. 새 CVE 는 계속 나오므로 스케줄 스캔으로 **추세 추적**.
|
||||
|
||||
향후 개선(요약을 행동 가능하게): 이미지별 **fixable(패치 존재) 집계** 컬럼, `.trivyignore` 지원,
|
||||
|
||||
Reference in New Issue
Block a user