33e91c0536
업스트림 quay.io/argoproj/argocd 의 차단 CVE 는 대부분 OS 패키지가 아니라 바이너리에
정적 링크된 Go 모듈이라, 상위 태그 교체(이미 최신)로도 베이스 OS 교체로도 잡히지 않는다.
부분 조치는 효과가 없었다 — 같은 stdlib·x/crypto 취약점이 다섯 바이너리(argocd·helm·
kustomize·git-lfs·pebble)에 각각 들어있어 본체만 고치면 거의 줄지 않는다. 업스트림
Dockerfile 이 helm/kustomize/git-lfs 를 hack/install.sh 로 **미리 빌드된 릴리스 바이너리**
로 내려받기 때문에 그 바이너리의 Go 버전을 우리가 통제할 수도 없다. 그래서 넷 다 소스에서
다시 컴파일한다.
- images/argocd/ 신규 (Go 4개 + C 2개 + Node UI — 기존 자체 빌드 중 가장 크다)
- 최종 베이스 ubuntu → SUSE BCI(원칙 2). ubuntu 가 딸려오던 pebble 도 함께 사라진다
- tini·connect-proxy 는 SLE_BCI 에 없어 소스 빌드 — 기능을 빼지 않기 위해
- UI 는 업스트림과 동일하게 node 로 빌드(Go embed 라 생략 불가)
- manifests/helm/argo-cd/10.4.0/custom-values.yaml 이 이 이미지를 가리킨다
global.image 하나로 argocd 바이너리를 쓰는 5개 컴포넌트가 공유한다
재사용 설계 — Dockerfile 에 버전을 박지 않는다
---------------------------------------------
이 이미지는 앞으로도 CVE 조치를 반복해서 받는다. 모듈 목록·패키지 목록을 전부 값으로 빼서
다음 조치에서 바뀌는 것이 source.build.env 한 곳뿐이게 했다. 이전 방식이라면 모듈 하나
추가에 build.env·ARG 선언·go get 목록·BUILD_ARGS 네 곳을 고쳐야 했다.
- scripts/build/suggest-go-upgrades.py 신규 — 스캔 리포트의 FixedVersion 에서
GO_MODULE_UPGRADES / GO_BUILDER_TAG 를 산출한다. 사람이 CVE 를 훑어 최대값을 고르지
않는다. 빌드 시점에 최신을 당기는 방식(go get -u)은 재현성을 버리므로 택하지 않았다 —
값은 제안만 하고 채택은 사람이 커밋한다.
- images/argocd/go-mod-upgrade.sh 신규 — 목록 하나를 네 프로젝트에 재사용한다.
go get 은 의존성에 없는 모듈도 go.mod 에 추가하므로 그래프에 있는 것만 골라 적용한다.
실측 함정 — verify.sh 에 반영했다
--------------------------------
차트의 repo-server init 컨테이너가 `cp --update=none` 을 쓴다. 이 형식은 GNU coreutils
9.3+ 에서만 되는데, BCI 15.7 로 빌드한 이미지가 게이트도 verify.sh 도 통과하고 **배포
시점에** Init:CrashLoopBackOff 로 죽었다. BCI 16.0(coreutils 9.6)으로 올려 해소했고,
verify.sh 가 이 명령과 copyutil 흐름을 직접 재현하도록 해서 다음엔 빌드 단계에서 걸린다.
16.0 의 패키지 가용성과 trivy 커버리지(CoverageProbe=ok, EOSL 아님)도 확인했다.
검증
----
게이트 PASS — 실효 CRITICAL/HIGH 0건, CoverageProbe ok
기능 VERIFY-OK (심볼릭 링크 9개 · 번들 도구 3종 · LFS 필터 · copyutil 흐름)
배포 docker.io/paasup 에 push 후 운영 argocd 교체 — 파드 8종 Running,
admin 로그인, Application 2건 Synced/Healthy, repo-server 렌더링 확인
(서버가 go1.26.6 · helm v4.2.4 로 보고 — 우리 빌드가 맞다)
카탈로그 차단은 574 → 239 건이 됐고(7.7.0 삭제 · dex 비활성 · 이 커밋), 남은 239 건은
전부 동결된 7.8.11 몫이다. 운영에 쓰는 10.4.0 은 0 건이다. 경과·미결은 MEMORY.md.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
80 lines
3.6 KiB
YAML
80 lines
3.6 KiB
YAML
# PaaSup 배포 기준 오버라이드.
|
|
#
|
|
# 실제 배포 값 주입은 dipup 의 pkg/assets/helm/values/argo-cd-values.yaml.tpl 이 담당한다.
|
|
# 이 파일은 "PaaSup 이 실제로 어떤 key 를 쓰는가"의 기준이며(Breaking Change 판정 근거),
|
|
# 도메인·시크릿 같은 환경별 값은 placeholder 로 둔다. 비밀값을 커밋하지 않는다.
|
|
|
|
global:
|
|
image:
|
|
# 자체 빌드(대응 우선순위 c) — 업스트림 v3.5.1 의 차단 CVE 대부분이 바이너리에 정적
|
|
# 링크된 Go 모듈이라 상위 태그 교체·베이스 OS 교체로 해소되지 않았다. 번들 도구
|
|
# (helm/kustomize/git-lfs)까지 최신 툴체인으로 다시 컴파일했다.
|
|
# 빌드 정의: images/argocd/. 상위 태그가 이 문제를 해결하면(대응 우선순위 a)
|
|
# 업스트림으로 되돌리는 것이 우선이다.
|
|
#
|
|
# 이 값은 argocd 바이너리를 쓰는 5개 컴포넌트(server/repo-server/application-controller/
|
|
# applicationset/notifications)가 공유한다 — 컴포넌트별 image 블록이 비면 global 을
|
|
# 상속한다. dex·redis 는 각자 별도 이미지라 영향받지 않는다.
|
|
repository: docker.io/paasup/argocd
|
|
tag: "3.5.1-security-hardened-20260819"
|
|
|
|
configs:
|
|
params:
|
|
# ArgoCD v3.0 부터 리소스 health 를 Application CR 에 저장하지 않는다(기본 false).
|
|
# dip-console-api 의 analyzeApplicationIssues 가 .status.resources[].health 를 읽으므로
|
|
# 켜두지 않으면 카탈로그 오류 상세에서 리소스 이슈가 비어 나온다.
|
|
controller.resource.health.persist: "true"
|
|
|
|
cm:
|
|
create: true
|
|
url: https://argocd.example.org
|
|
# Keycloak OIDC 연동.
|
|
# issuer/clientSecret/rootCA 는 환경별 값이라 배포 시 주입한다 — dipup 의
|
|
# argo-cd-values.yaml.tpl 이 리터럴로 채운다. 아래 `$oidc.keycloak.clientSecret` 은
|
|
# argocd-secret 의 동명 key 를 참조하는 ArgoCD 표기로, 값을 파일에 남기지 않으려면
|
|
# 이 형태를 쓴다.
|
|
oidc.config: |
|
|
name: Keycloak
|
|
issuer: https://keycloak.example.org/realms/paasup
|
|
clientID: argocd
|
|
clientSecret: $oidc.keycloak.clientSecret
|
|
requestedScopes: ["openid", "profile", "email", "groups"]
|
|
# 사설 CA 를 쓰는 Keycloak 이면 rootCA 를 함께 넣는다.
|
|
# rootCA: |
|
|
# -----BEGIN CERTIFICATE-----
|
|
|
|
rbac:
|
|
create: true
|
|
policy.csv: |
|
|
g, paasup, role:admin
|
|
|
|
dex:
|
|
# PaaSup 은 configs.cm.oidc.config 로 Keycloak 에 직접 연결하므로 dex 를 거치지 않는다.
|
|
# ArgoCD 는 oidc.config 가 있으면 dex 를 우회하고, dex.config 를 쓸 때만 dex 가 관여한다.
|
|
# 차트 기본값이 true 라 그동안 쓰이지도 않는 dex 파드가 떠 있었고, CVE 게이트에서
|
|
# 차단 57 건(argo-cd 10.4.0 전체 98 건의 58%)을 혼자 만들고 있었다.
|
|
# dex 기반 SSO 로 전환하려면 이 값을 true 로 되돌리고 configs.cm.dex.config 를 채운다.
|
|
enabled: false
|
|
|
|
server:
|
|
# apisix 가 TLS 를 종료하고 백엔드로 평문을 보내므로 서버는 평문으로 띄운다.
|
|
# 지정하지 않으면 리다이렉트 루프가 발생한다.
|
|
extraArgs:
|
|
- --insecure
|
|
|
|
ingress:
|
|
enabled: true
|
|
annotations:
|
|
# apisix ingress controller — https 리다이렉트 플러그인
|
|
k8s.apisix.apache.org/plugin-config-name: https-redirect
|
|
# cert-manager 설정
|
|
cert-manager.io/cluster-issuer: "selfsigned-issuer"
|
|
cert-manager.io/duration: 8760h
|
|
cert-manager.io/renew-before: 720h
|
|
hostname: argocd.example.org
|
|
ingressClassName: "apisix"
|
|
extraTls:
|
|
- hosts:
|
|
- argocd.example.org
|
|
secretName: argocd-tls
|