Commit Graph

446 Commits

Author SHA1 Message Date
wbsong111 16321b52c7 dipup 사용 차트를 카탈로그에 동기화 (7개 갱신 + 5개 신규)
dipup 이 go:embed 로 직접 보관·관리하던 Helm 차트를 카탈로그로 옮기는 첫 단계다.
두 저장소가 각자 CVE/SBOM 파이프라인을 운영하는 이중화를 해소하려면, 먼저 카탈로그가
dipup 과 같은 차트·같은 이미지를 보게 만들어야 한다.

배경: CVE 파이프라인 구성 이전에 두 곳에서 같은 차트를 유지하기 어려워 dipup 이 별도로
차트를 관리해 왔고, 그 결과 버전이 갈라졌다. 겹치는 10개 중 버전까지 일치하는 것은
postgresql-ha·dnsup 2개뿐이었다.

## 버전 갱신 (7개) — 신규 버전 디렉토리 추가, 구버전은 보존

| 차트 | 기존 | 신규 | appVersion |
|---|---|---|---|
| apisix | 2.14.0 | 2.16.0 | 3.16.0 → 3.17.0 |
| argo-cd | 7.7.0 | 7.8.11 | v2.13.0 → v2.14.5 |
| cert-manager | v1.16.1 | v1.21.0 | 동일 |
| gitea | 12.4.0 | 12.6.0 | 1.24.6 → 1.26.1 |
| harbor | 1.16.2 | 1.19.1 | 2.12.2 → 2.15.1 |
| kyverno | 3.4.1 | 3.8.2 | v1.14.1 → v1.18.2 |
| rancher | 2.10.1 | 2.14.3 | v2.10.1 → v2.14.3 |

차트 본문은 dipup 이 임베딩한 .tgz 를 그대로 전개했다(네트워크 pull 이 아니라 dipup 이
실제 배포하는 바이트와 동일함을 보장하기 위함). BUILD-README/CUSTOM-README/custom-values
3개 파일은 구버전에서 승계했다.

## 신규 추가 (5개)

infisical-standalone 1.9.0, longhorn 109.3.1+up1.11.2, longhorn-crd 109.3.1+up1.11.2,
metallb 0.16.1, secrets-operator v0.10.33.

longhorn/longhorn-crd 는 업스트림이 아니라 Rancher 패키징 차트(109.x 라인, Rancher 2.14
계열과 짝)다. BUILD-README 의 `helm repo add` 라인은 chart_version_detector 가 파싱하는
계약이라 실제 업스트림 repo 를 검증해 기재했고, 감지기로 현재/최신 버전이 정상 조회되는
것을 확인했다.

## custom-values — 버전과 결합된 이미지 핀 정리

카탈로그 스캐너가 dipup 의 effective image 를 보게 하려면 이미지 핀이 맞아야 한다.

- **kyverno: 승계본이 3.8.2 에서 깨져 재작성.** 3.4.1 은 정리 훅이
  `registry: ~ / repository: bitnami/kubectl` 이라 bitnamilegacy 오버라이드가 맞았지만,
  3.8.2 는 `registry: ghcr.io / repository: kyverno/readiness-checker` 로 바뀌었다.
  그대로 옮기면 ghcr.io/bitnamilegacy/kubectl 이라는 없는 좌표가 된다. 해당 오버라이드를
  제거하고, 3.8.2 에서 삭제된 policyReportsCleanup 키도 함께 뺐다. 남는 조치는 tag 고정뿐
  (기본 tag 가 비어 latest 로 떨어짐 → v1.18.2 로 고정).
- apisix: 3.16.0-keycloak-authz → 3.17.0-keycloak-authz (차트 appVersion 과 함께 이동)
- gitea: image.tag 1.26.4 핀 추가 — 차트 기본 1.26.1 대비 CRITICAL 2→0, HIGH 44→12
- infisical: image.tag v0.162.7 핀 — 기본 v0.158.x 는 stale Debian base 로 OS 기인 CVE
  다수(fixable CRITICAL 53→5, HIGH 491→55). redis/postgresql 은 bitnamilegacy 좌표로.
- longhorn: 실측 기반 리소스 튜닝(manager request, guaranteedInstanceManagerCPU,
  systemManagedCSIComponentsResourceLimits). replica 수처럼 노드 수에 의존하는 값은
  넣지 않았다 — 소비 측에서 주입한다.

## 검증

12개 차트 전부 `helm template --kube-version 1.34.1` 렌더 성공. 렌더 결과 이미지가
dipup 배포 이미지와 일치함을 확인(paasup/apisix:3.17.0-keycloak-authz,
gitea:1.26.4-rootless, readiness-checker:v1.18.2, infisical:v0.162.7).

## 범위에서 뺀 것

- **keycloak**: 카탈로그는 codecentric(app 17.0.1-legacy), dipup 은 bitnami(app 26.2.4)로
  계보가 다르다. 이슈 #1(bitnami 대체 방안 검토)의 결론이 나온 뒤 처리한다.
- **rancher-monitoring(-crd)**: 14c05f1 에서 불필요 판단으로 제거된 차트이고
  victoria-metrics 스택으로 대체 예정이라 추가하지 않는다.
- **dip-api/dip-console**: 자체 개발 차트로 각 앱 저장소가 출처다. 대조 결과 앱 저장소와
  dipup 사본이 일치해 카탈로그가 개입할 이유가 없다.
- **postgresql-ha/dnsup**: 이미 버전이 일치해 작업 대상이 아니었다.

## 후속 과제

dnsup 은 카탈로그·dipup 사본(1.0.1)이 원본(dip-console-api helm/dnsup 1.0.0)보다 앞서
있다. 1.0.1 에만 있는 service.LoadBalancerIP·service.annotations 지원을 원본으로 백포트한
뒤, 카탈로그에서 dnsup 을 제거하는 것이 자체 개발 차트 출처 원칙에 맞다.
2026-08-06 09:42:24 +09:00
wbsong111 9d5a10b09c Merge pull request #15 from paasup/feat/chart-to-cnpg-migration
카탈로그 앱 내장 bitnami postgresql → cnpg-cluster 전환 (1차 5개 차트)
2026-08-05 15:49:22 +09:00
wbsong111 01ec67ae1f 파이프라인 실행 절차를 Claude Code Skill 3종으로 등록
세 파이프라인의 실행법이 문서에만 있어 "그 문서를 읽어야만" 알 수 있었다.
관련 작업 시 자동 로드되도록 Skill 로 등록한다.

- catalog-update-pipeline: agent/update_catalog 파이프라인. CATALOG_ROOT 가
  개인 로컬 경로로 하드코딩돼 있어 오버라이드 필수라는 점, create_pr 단계가
  주석 처리돼 PR 이 생성되지 않는다는 점을 명시했다.
- sbom-cve-gate: SBOM·스캔·게이트. CoverageProbe(ok/none/n-a) 해석과 게이트가
  현재 warn-only 라는 점을 명시했다.
- self-build-image: 자체 빌드. 오케스트레이터는 하나뿐이라는 원칙과 전역 ARG
  선언, 게이트 PASS 가 동작을 보장하지 않는다는 점을 명시했다.

Skill 은 절차 본문을 복제하지 않고 권위 문서를 가리킨다 — 문서가 단일 출처이고
Skill 은 실행 계약과 함정·현재 상태만 담는다.

함께 고친 stale 문서(image-authoring.md):
- "images/ 디렉토리 자체가 없다" → 실제로는 이미지 3종이 있고 push 까지 됐다
- "자동화된 배포 테스트 절차는 아직 없다" → deploy-test-procedure.md 와
  전용 스크립트가 있다

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 15:37:57 +09:00
wbsong111 9fd826c524 mlflow ingress 를 apisix 로 교체 (airflow/superset 과 동일 수정)
mlflow 도 ingressClassName 이 비어 있어 이 클러스터(apisix 전용)에서 Ingress 가
CLASS: <none> 으로 뜨고 어떤 컨트롤러도 처리하지 않았다 — ingress 경유 접근이
아예 불가능한 상태였다. path: / 도 exact 매치라 앱 리다이렉트 이후 404 가 난다.

전환 대상 4개 중 3개(airflow/superset/mlflow)가 같은 문제를 갖고 있었다.

실측 검증: /health OK, UI 200, experiments API 가 cnpg DB 에서 Default 실험을
반환 — ingress → 앱 → cnpg 전 경로 확인.

관련: #14

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 15:27:12 +09:00
wbsong111 3ee1c1ee23 카탈로그 앱 내장 bitnami postgresql → cnpg-cluster 전환 (1차 5개 차트)
이슈 #9에서 결정된 CloudNativePG 채택을 카탈로그 앱에 확장 적용한다.
airflow/lakekeeper/mlflow/superset/flowise 5개 차트가 내장하던 bitnami
postgresql 서브차트를 끄고 앱 전용 cnpg-cluster 인스턴스를 외부 DB로 쓰도록
전환했다. 5개 모두 dev 클러스터 격리 네임스페이스에서 배포 테스트로 실측 검증했다.

gitea/keycloak/dnsup 는 서브차트가 아니라 공유 postgresql-ha 를 외부 참조하며
paasup/dipup 레포 관리 대상이라 제외했다 — 인수인계 문서만 추가했다.

배포 구조:
- ArgoCD ApplicationSet 으로 DB(syncWave 0) → 앱(syncWave 1) 순서를 보장한다.
  기존 openmetadata/victoria-metrics 관례를 따랐다. cnpg-cluster 차트는 범용
  상태로 유지하고 앱별 값은 manifests/applicationset/<app>/ 에 둔다.

검증 중 발견해 함께 고친 문제:
- lakekeeper: cnpg 의 -ro 는 replica 전용이라 instances:1 에서 엔드포인트가
  0개다. 읽기 연결을 -r(전체 라운드로빈)로 교체했다.
- airflow/superset: ingressClassName 누락 + kong 애노테이션 잔존으로 이
  클러스터(apisix 전용)에서 ingress 접근이 아예 불가능했다. apisix + regex
  path 로 교체했다.
- 배포 테스트가 PV 만 지우고 Longhorn Volume CR 을 남겨 storageScheduled 가
  누적됐다(orphan 112개 ~1TB 로 배포 차단). 두 스크립트의 정리 로직을 고쳤다.

재사용 구조화:
- .claude/skills/chart-to-cnpg/ 신규. 남은 4개 차트(langflow-ide, langfuse,
  litellm, nemo)에 같은 절차를 재사용한다. flowise 에 실제 적용해 검증했다.
- 배포 테스트 공통 절차는 .claude/deploy-test-procedure.md, 환경 함정은
  .claude/pitfalls.md 로 단일화하고 앱별 README 는 참조만 남겼다.

관련: #9, #14

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 15:17:46 +09:00
wbsong111 35ce2bb80d Merge pull request #13 from paasup/build/cloudnative-pg-20260804063006
cloudnative-pg: 1.30.0-security-hardened-20260803 → 20260804
2026-08-04 15:39:45 +09:00
wbsong111 6acf239f6b Merge pull request #11 from paasup/build/etcd-20260804060806
etcd: 3.7.1-security-hardened-20260803 → 20260804
2026-08-04 15:39:41 +09:00
wbsong111 6e6d006057 Merge pull request #12 from paasup/fix/self-build-no-pr-create
self-build-image: 자동 PR 생성 제거 → 브랜치 push + compare 링크 안내
2026-08-04 15:39:12 +09:00
github-actions[bot] 6f61c02aaf cloudnative-pg 이미지 태그 갱신: 1.30.0-security-hardened-20260803 → 1.30.0-security-hardened-20260804
게이트 PASS(build-image.yml, workflow_dispatch 트리거)로 확인된 태그로 교체한다.

Co-Authored-By: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 06:30:06 +00:00
wbsong111 d449504088 self-build-image: 자동 PR 생성 제거, 브랜치 push + compare 링크 안내로 대체
GITHUB_TOKEN 으로 PR 을 생성하는 것 자체를 조직 정책이 막는다는 것을 실측으로
확인했다(run 30882785612, GraphQL: "GitHub Actions is not permitted to create
or approve pull requests") — 리포 설정으로 못 바꾸는 제약이라 gh pr create
호출을 워크플로에서 없앤다. 브랜치 커밋·push 까지는 그대로 자동화하고, PR 오픈은
Job Summary 에 남는 compare 링크로 사람이 직접 하도록 바꿨다. 더 이상 쓰지
않는 pull-requests: write 권한도 제거.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 15:26:17 +09:00
github-actions[bot] b4a0b87842 etcd 이미지 태그 갱신: 3.7.1-security-hardened-20260803 → 3.7.1-security-hardened-20260804
게이트 PASS(build-image.yml, workflow_dispatch 트리거)로 확인된 태그로 교체한다.

Co-Authored-By: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 06:08:06 +00:00
wbsong111 d7744c3cfc Merge pull request #10 from paasup/feat/introduce-cve-gate
CVE/SBOM 게이트 도입 + 자체 빌드 이미지 프레임워크
2026-08-04 14:40:30 +09:00
wbsong111 14c05f1e61 카탈로그에서 kong·unitycatalog·rancher-monitoring(-crd) 제거
불필요 판단으로 4개 차트 디렉토리를 통째로 삭제한다:
- manifests/helm/kong/2.46.0
- manifests/helm/unitycatalog/0.2.0 (define-chart-resources.md에도 "사용 여부
  검토 필요"로 이미 표시돼 있었음)
- manifests/helm/rancher-monitoring/104.1.2+up57.0.3
- manifests/helm/rancher-monitoring-crd/104.1.2+up57.0.3

문서 정리:
- doc/define-chart-resources.md: 4개 차트의 리소스 프로파일 섹션 + 요약 테이블
  행 삭제(섹션 번호는 재정렬하지 않음 — 범위 밖의 큰 변경이라 별도로 둠)
- doc/change-bitnami-image.md: kong·unity catalog 섹션 삭제(bitnami 이미지
  치환 대상이 더 이상 없음)

doc/chart-restructure-plan.md는 건드리지 않았다 — 2026-01-19 charts/→manifests/
디렉토리 이전을 기록한 변경 이력이라, 그 시점에 실재했던 차트 목록을 지금 기준
으로 고치면 역사 기록이 왜곡된다.

manifests/applicationset 등 다른 배포 경로에서 이 4개 차트를 참조하는 곳이
없음을 확인했다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 13:04:57 +09:00
wbsong111 4e2e57cebc cve-gate.py: 요약 표를 차트별로 정렬 + 이미지 다중 차트 귀속 보정
render_summary_table() 을 이미지 알파벳순(리포트 파일명 순) 대신 차트 이름
오름차순으로 묶고, 같은 차트 안에서는 실효 CRITICAL/HIGH 내림차순으로 정렬한다.
scan-sbom.sh 의 trivy-summary.md 는 이미 차트별로 묶여 있는데 cve-gate.md/brief 는
아니어서 두 리포트의 정렬 기준이 서로 달랐다.

이 과정에서 report_stem_to_image() 와 같은 종류의 문제를 발견해 같이 고쳤다 —
이미지 하나가 여러 차트에 쓰이면 리포트 파일명→차트 매핑이 마지막 차트만 남겨,
차트별로 묶었을 때 다른 차트의 노출이 조용히 빠졌을 것이다(scan-sbom.sh 에서
실측으로 확인된 것과 동일한 패턴). 신규 charts_of_image() 로 sbom-index.tsv 를
전부 읽어 이미지→차트 목록을 보존하고, render_summary_table 표시에서만 이걸로
펼친다 — 게이트 판정(evaluate 등)에 쓰이는 대표 차트/버전은 안 건드린다.

로컬에서 (a) flowise/cnpg-cluster/etcd 3개 차트 실제 데이터로 정렬 확인
(b) 이미지 하나가 차트 두 개에 쓰이는 합성 케이스로 양쪽에 다 나오는지 확인.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 11:43:21 +09:00
wbsong111 d714667f81 generate-sbom.sh: 재시도 로그의 unbound variable 버그 수정
"실패 \$nf개" — \$nf 뒤에 중괄호 없이 한글이 바로 붙어 있어, LANG=C.UTF-8 로케일에서
bash가 변수명 경계를 잘못 인식해 "nf<한글 바이트>: unbound variable"로 죽었다
(set -u). 로컬에서 flowise 차트 SBOM 생성 중 실제로 재현됨 — SBOM 생성 자체(6/6
성공)는 끝난 뒤 재시도 필요 여부를 보고하는 로그 문장에서만 발생해 데이터 손상은
없었다. \${nf}개 로 중괄호 처리해 고쳤다. 같은 패턴(바인딩 안 된 \$var 뒤에 한글이
구분자 없이 붙는 경우)이 다른 파이프라인 스크립트에도 있는지 전수 검색했고 이
한 곳뿐이었다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 11:22:21 +09:00
wbsong111 9b76b6f2a1 scan-sbom.sh: 취약점 요약을 차트별로 묶고 차트 합계 행 추가
trivy-summary.md/tsv 를 이미지 심각도 건수 내림차순 flat 목록 대신 차트 이름별로
묶고, 차트마다 합계 행(이미지 수 + 심각도별 합)을 붙인다.

- 이미지 하나가 여러 차트에 쓰이면(예: busybox) 예전엔 sbom-index.tsv 를 접어(마지막
  차트만 남김) 요약해 다른 차트의 노출이 조용히 빠졌다 — 이제 $INDEX 를 직접 읽어
  차트마다 한 행씩 보여준다(CHARTMAP 중간 파일은 더 필요 없어져 제거).
- 카탈로그는 같은 차트의 여러 버전을 동시에 보관하는 "버전 보관소"라, 요약 표는
  차트 이름별 최신 버전만 표시한다(표를 "차트 종류" 단위로 읽기 쉽게 하려는 목적).
  구버전은 표에서만 빠지고 실제 스캔·게이트 판정 대상에서는 빠지지 않는다 —
  cve-gate.md/json 은 전 버전을 그대로 판정한다. 몇 건이 빠졌는지는 요약 상단에 표시.

로컬에서 (a) 이미지 하나가 차트 두 개에 쓰이는 경우 양쪽 합계에 정확히 반영되는지
(b) 같은 차트 이름에 버전이 두 개일 때 최신만 남고 구버전 건수가 안내되는지
(c) 실제 flowise 차트(이미지 6개) 대상 로컬 파이프라인 실행
으로 확인했다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 11:22:07 +09:00
wbsong111 aadbf866fb cve-gate.py: Job Summary용 축약 리포트(--brief-md) 추가 — 1MB 제한 대응
전체 카탈로그(45+ 차트) 스캔을 실제로 CI에서 돌려보니 GITHUB_STEP_SUMMARY 가
1MB 제한에 걸려 cve-gate.md(2.2MB) 업로드가 중단됐다 — CVE 개별 상세(차단
항목·벤더 하향 등급 등)가 이미지당 CVE 수에 비례해 불어나는 게 원인이다.

render_summary_table()로 차트·이미지별 건수 표를 뽑아 render_md(전체)와
render_brief_md(신규, Job Summary용) 양쪽에서 재사용한다. brief 는 건수 표 +
누락/커버리지 이상 건수만 담고, CVE 개별 상세는 아티팩트(cve-gate.md/json)를
보라고 안내한다 — 이미지 수에는 선형으로 늘지만 이미지당 CVE 수에는 무관해
카탈로그가 커져도 1MB 제한에 걸리지 않는다.

sbom.yml 의 Job Summary 스텝을 --brief-md 출력으로 교체했다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-03 16:46:01 +09:00
wbsong111 6bdea97e51 자체 빌드 이미지 3종 docker.io/paasup 재빌드·push + 카탈로그 values 갱신
cloudnative-pg·cnpg-postgresql·etcd 를 REGISTRY=docker.io/paasup 로 재빌드해
verify.sh·게이트(커버리지 ok, 실효 C/H 0/0, PASS) 확인 후 push, docker manifest
inspect 로 레지스트리 존재를 재확인했다. 기존 참조(docker.io/wbsong111, 이전
security-catalog 빌드)는 dip-catalog 자체 파이프라인으로 검증된 적이 없었다.

카탈로그 values(custom-values.yaml/dip-values.yaml)를 patch-catalog-tag.py 로
새 태그로 교체하고 helm template·extract-helm-images.sh 로 렌더링 결과를
재확인했다. 로컬 docker 계정은 paasup push 권한이 확인됐으나 GitHub Actions
시크릿(DOCKERHUB_USER/TOKEN)의 권한은 별도 확인이 필요하다(MEMORY.md).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-03 15:32:27 +09:00
wbsong111 6597059a15 scan-sbom.sh: CoverageProbe 커버리지 자가진단 이식 + 관련 파이프라인 버그 수정
security-catalog 프로젝트에서 자체 빌드 이미지 3종을 실제로 로컬 빌드·게이트
검증하는 과정에서 발견한 문제들:

- extract-helm-images.sh 가 `image:` 필드만 잡고 `imageName:`(CNPG Cluster CRD 관례)
  은 놓쳐, cnpg-cluster 차트의 이미지가 SBOM·스캔·게이트 어디에도 안 나타났다.
- patch-catalog-tag.py 의 split 포맷 패처가 registry 필드가 따로 없고 repository 에
  registry+repo 를 합쳐 쓰는 차트(cloudnative-pg 오퍼레이터, 업스트림 템플릿이
  image.registry 를 아예 참조하지 않음)에서 tag 만 조용히 갱신하고 repository 는
  그대로 남겨 깨진 참조를 만들 수 있었다.
- CoverageProbe(센티널 패키지 주입 재스캔으로 "0건"과 "측정 안 됨"을 구분)가
  이식되지 않아, 전 심각도 0건인 자체 빌드 이미지가 실제로는 깨끗한데도 게이트가
  "데이터 커버리지 이상"으로 오탐 처리했다 — security-catalog 의 scan-sbom.sh 를
  이식해 해소. cve-gate.py 는 이미 이 키를 읽도록 구현돼 있어 소비 쪽 변경은 없다.

rpm(SUSE)·deb(Debian)·apk(Alpine) 세 센티널 경로와 병렬 스캔 회귀를 로컬에서
확인했고, 이식 후 cloudnative-pg·cnpg-postgresql 게이트가 실제로 FAIL→PASS 로
바뀌는 것도 확인했다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-03 15:30:57 +09:00
wbsong111 6878b61efa 자체 빌드 이미지 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>
2026-08-03 12:03:37 +09:00
wbsong111 a168a3c7e6 docs(image-authoring): CoverageProbe cov= 확인 지시 제거 + Dockerfile 경로 주석 정정
scan-sbom.sh 에 커버리지 자가진단이 없는데도 체크리스트가 cov= 확인을 지시해
같은 문서 104-106줄과 모순됐다. 실제 동작(findings 0건 시 보수적 실패)과 판단
방법으로 교체. Dockerfile 헤더 주석의 doc/scripts/ 경로도 scripts/pipeline/ 로
갱신(경로 이전 시 누락됨).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-03 11:25:20 +09:00
wbsong111 100e8cfc61 scan-sbom.sh: macOS(BSD) xargs 병렬 스캔 버그 수정
xargs -I{} 가 탭을 공백으로 바꿔 이미지명·SBOM 경로가 한 덩어리가 되고
"failed to open sbom file" 로 스캔이 실패했다(로컬 macOS 검증 중 발견).
security-catalog 프로젝트에서 이미 확인된 동일 버그 — read 루프 +
배치 wait 방식으로 교체하고, 대상/결과 수 불일치 시 실패시키는 누락
검출 가드를 추가했다(스캔 안 됨이 취약점 없음으로 오인되는 것을 막기 위함).
로컬에서 main 모드로 재검증: 2/2 성공, 이전 우회 실행과 동일한 집계치.
2026-08-03 10:23:12 +09:00
wbsong111 5e1422e0e4 CVE/SBOM 게이트 문서화: CLAUDE.md 3번째 서브시스템 + MEMORY.md 신설
CLAUDE.md 에 CVE/SBOM 게이트 서브시스템 절 추가(기존 7개 설계 원칙·구현
현황은 변경 없음). doc/sbom-pipeline.md 에 게이트 판정 절 + 커버리지
자가진단 미이식 제약 명시. MEMORY.md 신설 — warn-only 상태, 45+ 차트
미검증, 자체 빌드 프레임워크 미사용, SBOM_PIPELINE_IMAGE 재빌드 보류 등
후속 결정 사항 기록.
2026-08-03 10:06:48 +09:00
wbsong111 cb7541647d sbom.yml/cve-edge-post.yml: 스크립트 경로 이전 반영 + 게이트 연결
doc/scripts/* -> scripts/pipeline/* 경로 수정 (두 워크플로 공통).
sbom.yml 에 cve-gate.py 판정 스텝 추가(--warn-only), SEVERITY 를 전
심각도로 덮어써 게이트가 필요한 데이터를 스캔이 누락하지 않게 한다.
cve-edge-post.yml 은 외부 대시보드 전송용이라 게이트 연결은 하지 않는다.
2026-08-03 09:59:43 +09:00
wbsong111 844c567d0d 자체 빌드 이미지 프레임워크 도입 (실사용 이미지 없음)
security-catalog 에서 포팅: build-hardened-image.sh, patch-catalog-tag.py,
build-image.yml(REGISTRY_HOST=docker.io/paasup). images/ 는 아직 비어있다 —
베이스 OS 정책 미결 등은 .claude/image-authoring.md, MEMORY.md 참고.
2026-08-03 09:55:52 +09:00
wbsong111 20d7a41193 CVE 게이트(scripts/pipeline/cve-gate.py) 도입
security-catalog 에서 포팅: 고유 CVE 단위 집계, max(벤더,NVD) 실효 등급,
승인 예외(doc/cve-exceptions.json) 처리. 워크플로 연결은 다음 커밋에서.
2026-08-03 09:25:21 +09:00
wbsong111 39bb879495 scripts/pipeline/ 신설: 기존 SBOM 스캔 스크립트 경로 이동
doc/scripts/ -> scripts/pipeline/ (security-catalog 의 최상위 scripts/ 관례 채택).
스크립트 로직은 변경 없음 (상대경로 깊이 동일).
2026-08-03 09:25:03 +09:00
ychangkim e3e5ba9751 cve-edge-post schedule comment 2026-07-23 13:26:36 +09:00
ychangkim d2d20ce3b2 action summary 2026-07-22 17:43:34 +09:00
ychangkim d6183e98c7 action summary 2026-07-22 17:40:19 +09:00
ychangkim a992b2e12a sbom 기준 체크 2026-07-21 17:51:58 +09:00
ychangkim 392766442b fix: explicitly scan all severities in cve-edge-post trivy scan 2026-07-21 17:36:39 +09:00
ychangkim bec87f12bb feat: emit one CVE result per (catalog, version) instead of per image
Replace the per-image catalogs array with a flat structure: results
are now keyed by (catalog, version), with the same image's scan
counts duplicated across every chart/version that references it.
2026-07-21 17:00:41 +09:00
ychangkim d2e804b482 feat: include short description with each critical CVE in summary
summary now lists only CRITICAL vulnerabilities, formatted as
"CVE-ID: description" pairs joined by "; ". Description comes from
trivy's Title field, falling back to the first sentence of Description.
2026-07-21 13:39:26 +09:00
ychangkim f6eaf3c664 feat: add chart filter input to cve-edge-post workflow
Allow scanning a single catalog (manifests/helm/<chart>/) via the
workflow_dispatch chart input, filtering images_final.tsv by chart
name before the limit is applied. Empty value scans the full catalog
as before.
2026-07-21 10:21:19 +09:00
ychangkim 8b370be748 feat: add chart filter input to cve-edge-post workflow
Allow scanning a single catalog (manifests/helm/<chart>/) via the
workflow_dispatch chart input, filtering images_final.tsv by chart
name before the limit is applied. Empty value scans the full catalog
as before.
2026-07-21 10:20:13 +09:00
ychangkim a1e726b755 fix: use memory cache backend for parallel trivy scans
Parallel trivy image workers sharing the fs cache directory hit
"cache may be in use by another process: timeout" errors. Switch to
--cache-backend memory to avoid bolt-db lock contention, matching the
approach already used in generate-sbom.sh.
2026-07-20 18:12:19 +09:00
ychangkim 9a434bb27a fix: match dockerhub env var names in registry auth script
Python was still reading DOCKERHUB_PAASUP_USER/TOKEN while the env:
block sets DOCKERHUB_USER/TOKEN, silently disabling private registry
auth. Also restore the nvcr.io (NGC) auth entry that was dropped.
2026-07-20 18:10:24 +09:00
ychangkim 607772283d refactor: scan images directly with trivy, output per-image CVE JSON
Skip SBOM generation entirely since cve-edge-post.yml only needs
vulnerability counts, not CycloneDX artifacts — scan each image with
`trivy image` directly and aggregate with python3 (drop jq dependency).
Output is now a JSON array with one entry per image instead of a single
merged summary.
2026-07-20 18:08:06 +09:00
ychangkim 9b6d978e31 chore: pin sbom pipeline image, use paasup dockerhub secrets
Switch cve-edge-post.yml to a fixed docker.io/paasup/sbom-pipeline
image and paasup-specific Docker Hub credentials, dropping the nvcr.io
auth entry.
2026-07-20 17:35:57 +09:00
ychangkim 9b368e4cfc feat: add jq to sbom pipeline image, rename cve workflow
jq is required to aggregate trivy-reports/*.json into the CVE summary
JSON posted to the edge API.
2026-07-20 17:21:39 +09:00
김영창 25e05e0ba2 Create cve-edge-post.yml 2026-07-20 17:14:51 +09:00
wbsong111 16b1b5bed9 Merge pull request #6 from paasup/update-qdrant/1.18.2
feat(catalog): add qdrant 1.18.2 chart
2026-07-14 14:49:40 +09:00
wbsong111 41af7537a0 feat(catalog): add qdrant 1.18.2 chart
- Pull upstream qdrant-helm chart v1.18.2 (appVersion v1.18.2)
- Add PaaSup custom overrides: custom-values.yaml, dip-values.yaml
  (ingress.ingressClassName=apisix), dip resource/volume quotas
- No breaking changes to existing overrides vs 1.12.4; helm lint passes,
  image renders as docker.io/qdrant/qdrant:v1.18.2

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 14:44:13 +09:00
wbsong111 56b8b2e4c6 Merge pull request #4 from paasup/docs/tenant-onboarding-guide
docs: 테넌트 온보딩 가이드 (VictoriaMetrics + Perses 멀티테넌시)
2026-07-09 16:14:04 +09:00
wbsong111 44c3888974 docs: add tenant onboarding guide (VictoriaMetrics + Perses multitenancy)
새 테넌트(accountID) 온보딩 시 계층별 생성 자원(Keycloak/vmagent/otelcol/
Perses)과 유저 RBAC, 오프보딩 절차 정리. demo01/demo02 실측 검증(2026-07-01)
기반. 자원 생성·유저 바인딩은 dip-console 온보딩 자동화 backlog.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 16:09:32 +09:00
wbsong111 ac119a3559 fix(sbom-ci): auth docker.getcollate.io (Docker Hub proxy) + raise trivy timeout
openmetadata 실패의 진짜 원인은 참조 오류가 아니라 docker.getcollate.io(Docker Hub 프록시)의
익명 pull rate limit(TOOMANYREQUESTS)였음. 인증 config 에 getcollate 를 추가(Docker Hub
자격증명)하고, 대용량 이미지 분석을 위해 trivy 타임아웃 기본값을 10m→15m(TRIVY_TIMEOUT).
로컬 검증: 인증+타임아웃으로 openmetadata server SBOM 생성 성공(655 comp).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 16:55:08 +09:00
wbsong111 18ca8cd979 fix(catalog): exclude windowsExporter from rancher-monitoring
Windows 노드 미사용 + Windows 이미지라 trivy 스캔 불가 → windowsExporter.enabled=false
로 SBOM/패키징 대상에서 제외.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 16:32:22 +09:00
wbsong111 1d8e68eaf5 fix(catalog): repoint dead upstream image refs to existing coordinates
미러 없이 이미지 목록으로 오프라인 패키징하므로, 레지스트리에서 사라진 참조는
패키징을 깨뜨림. 존재 검증된 좌표로 정정:
- kafka:      bitnami/kafka        → bitnamilegacy/kafka
- kyverno:    bitnami/kubectl      → bitnamilegacy/kubectl (webhooks/policyReports cleanup)
- strimzi:    defaultImageRegistry ""(→docker.io) → quay.io (strimzi 는 quay 발행)
- nemo:       gcr.io/kubebuilder/kube-rbac-proxy → quay.io/brancz/kube-rbac-proxy
- unitycatalog: tag ""(→appVersion SNAPSHOT, 미발행) → v0.3.0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 16:21:53 +09:00
wbsong111 c36edb3015 sbom-ci: meaningful stage timings, dynamic severity cols, doc update
- scan-sbom: 요약에 단계별 소요(SBOM 생성 vs 취약점 스캔) 표시, 오해 주던 "총 소요"·
  항상 0인 per-SBOM Sec·min/max 라인 제거. 스캔한 SEVERITY 만 동적 컬럼.
- generate-sbom: 생성 소요시간을 .sbom-gen-seconds 로 기록(요약 단계별 시간용).
- doc/sbom-pipeline.md: 실행 이미지(Dockerfile)·빌드/푸시·GitHub 설정·결과 확인/대응 보강.
- .gitignore: .sbom-gen-seconds.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 14:29:07 +09:00