자체 빌드 이미지 3종(cloudnative-pg/cnpg-postgresql/etcd) + 대응 헬름 차트 도입

security-catalog 프로젝트에서 첫 실사용 자체 빌드 이미지 3종을 포팅한다 — 전부
상위 태그·베이스 OS 교체로 해소 안 되는 CVE(Go 모듈 정적 링크 또는 미수정 CRITICAL/
HIGH)를 자체 빌드(소스 컴파일 또는 SUSE BCI 재설치)로 대응한다:

- images/cloudnative-pg: CNPG operator, release-1.30 소스 컴파일 + bci-micro
- images/cnpg-postgresql: PostgreSQL 18.4, bci-base + zypper 재설치
- images/etcd: etcd v3.7.1, 소스 컴파일(x/text 강제 업그레이드) + bci-micro

함께 추가:
- manifests/helm/{cloudnative-pg,cnpg-cluster,etcd} — 위 이미지를 참조하는 카탈로그 차트
- scripts/deploy-test/*.sh, .claude/deploy-test-procedure.md — CVE 0건과 별개로
  "실제로 뜨는가"를 검증하는 배포 스모크 테스트
- .claude/pitfalls.md — 자체 빌드/배포 테스트 중 실측한 함정 모음

검토 중 발견해 반영한 수정:
- cloudnative-pg 차트의 image 블록을 etcd와 동일한 registry/repository/tag 3필드+
  따옴표 포맷으로 통일 — 기존 포맷(repository에 registry+repo 결합, 따옴표 없음)은
  patch-catalog-tag.py 의 split 패처가 tag만 갱신하고 repository는 그대로 남기는
  조용한 부분 치환을 일으켜, 향후 레지스트리 마이그레이션 시 깨진 참조를 만들 수 있었다
- cnpg-cluster 차트의 SLES 커버리지 코멘트를 최신 실측(trivy가 SLES 15.7을 정상
  커버함, 2026-07-29 재측정)에 맞게 정정 — 폐기된 "측정 불가/OVAL 우회 필요" 결론이
  남아있었다
- CLAUDE.md/MEMORY.md 의 "images/ 디렉토리 없음" 서술을 갱신하고, 레지스트리
  마이그레이션(docker.io/wbsong111 → docker.io/paasup)·decisions/analysis 문서 이관·
  리소스 프로파일 추가를 다음 작업으로 기록

이 3개 이미지는 아직 dip-catalog 자체 CI(build-image.yml)로 빌드·게이트·push 를
실행해본 적이 없다 — 현재 참조 태그는 security-catalog 쪽에서 이미 검증된 것이다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
wbsong111
2026-08-03 12:03:37 +09:00
parent a168a3c7e6
commit 6878b61efa
89 changed files with 36608 additions and 11 deletions
+32 -7
View File
@@ -28,12 +28,35 @@ dip-catalog 의 `scan-sbom.sh` 는 이 로직이 없다 — 게이트는 finding
차단 처리하는 구버전 경로로만 동작한다. 45+ 차트 규모에서 이 판정이 오탐을 얼마나
내는지 실측 후 이식 여부를 결정한다.
**자체 빌드 프레임워크(`scripts/build/`, `.github/workflows/build-image.yml`)는 도입만
했고 실사용 이미지가 없다.** `images/` 디렉토리 자체가 아직 없다. 실제 자체 빌드가
필요해지면(게이트가 상위 태그/베이스 OS 교체로 해소 안 되는 차단 CVE 를 찾을 때)
[.claude/image-authoring.md](.claude/image-authoring.md) 절차로 `images/<image>/`
신설한다. 이때 최종 런타임 베이스 OS 정책(security-catalog 는 SUSE BCI 로 고정했으나
dip-catalog 는 아직 미결)을 처음으로 정해야 한다.
**`images/`에 이미지 3종(`cloudnative-pg`, `cnpg-postgresql`, `etcd`)이 security-catalog
프로젝트에서 포팅됐지만 dip-catalog 자체 CI(`build-image.yml`)로는 아직 한 번도
빌드·게이트·push 를 실행해본 적이 없다.** 현재 카탈로그 values(`custom-values.yaml`/
`dip-values.yaml`)가 참조하는 태그는 전부 security-catalog 쪽에서 이미 빌드·게이트
PASS·push 된 실제 이미지(`docker.io/wbsong111/...`)를 그대로 재사용하는 것이다 —
dip-catalog 파이프라인으로 재현·재검증된 적은 없다. 최종 런타임 베이스 OS 정책은
security-catalog 의 SUSE BCI 고정 결정을 그대로 따랐다(ADR 자체는 미이관, 아래 참고).
**레지스트리 마이그레이션(`docker.io/wbsong111` → `docker.io/paasup`)이 필요하다.**
`build-image.yml``REGISTRY_HOST` 는 이미 `docker.io/paasup` 로 설정돼 있지만
(아래 항목 참고) 위 3개 이미지가 실제로 가리키는 곳은 아직 `docker.io/wbsong111` 다.
`REGISTRY=docker.io/paasup` 로 3개 이미지를 재빌드·재게이트·재검증해 PASS 를 확인한
뒤에만 6개 values 파일(`manifests/helm/{cloudnative-pg/0.29.0,cnpg-cluster/1.0.0,
etcd/1.1.12}/{custom-values,dip-values}.yaml`, cnpg-cluster 는 `dip-values.yaml`
`imageName` 오버라이드가 있음)의 이미지 참조를 새 태그로 교체한다. push 자격 증명
확인은 바로 아래 항목과 동일하다.
**`doc/decisions/`·`doc/analysis/` 디렉토리 자체가 dip-catalog 에 없다.** 포팅된 3개
이미지의 README·values 코멘트가 `doc/decisions/000X-*.md`, `doc/analysis/*.md`,
`doc/image-selection.md`, `doc/cve-zero-pipeline.md`, `doc/architecture/build-pipeline.md`
를 근거로 계속 인용하지만 이 경로들은 dip-catalog 에 하나도 없다(security-catalog
프로젝트에만 있음). 당장 급한 건 아니지만, 이 상태로는 이 레포만 보는 사람이 자체 빌드
결정의 CVE 실측·비교 근거를 확인할 방법이 없다 — 각 README 에 이미 요약된 근거(CVE
번호·후보 비교표)를 압축한 로컬 stub ADR 작성을 검토한다.
**`doc/define-chart-resources.md` 에 신규 차트 3종(`cloudnative-pg`, `cnpg-cluster`,
`etcd`) 의 Small/Medium/Large 리소스 프로파일이 없다.** CLAUDE.md 의 "신규 차트 추가"
규칙(리소스 프로파일 필수)을 아직 못 지켰다 — custom-values.yaml 의 기존
requests/limits/storage 값을 근거로 표를 추가하는 별도 작업으로 처리한다.
**`SBOM_PIPELINE_IMAGE` 재빌드가 보류돼 있다.** 이 마이그레이션으로 빌드 컨텍스트 경로가
`doc/scripts/Dockerfile``scripts/pipeline/Dockerfile` 로 바뀌었다. Dockerfile 내용
@@ -43,7 +66,9 @@ Repo Variable `SBOM_PIPELINE_IMAGE` 갱신은 git 커밋으로 되지 않는 수
**`build-image.yml``REGISTRY_HOST``docker.io/paasup` 로 설정했다.** 실제 이미지를
push 하려면 `DOCKERHUB_USER`/`DOCKERHUB_TOKEN` 시크릿이 `paasup` 조직 네임스페이스에
push 권한을 가져야 한다 — **미확인**, 실제 첫 자체 빌드 시도 전에 확인 필요.
push 권한을 가져야 한다 — **미확인**, 실제 첫 자체 빌드 시도 전에 확인 필요. 이제
`images/` 의 3개 이미지가 실사용 후보이므로 위 "레지스트리 마이그레이션" 항목이 이
확인을 실제로 필요로 하는 첫 사례다.
---