2417655987
apisix에 얹는 keycloak-authz 커스텀 플러그인 오버레이는 hardened-containers 표준 파이프라인 밖에서 별도로 빌드돼 같은 리포지토리에 -keycloak-authz 접미사를 붙여 추가로 push된다. published.json에는 이 접미사 태그가 절대 안 잡혀서, apply-published-tags.py가 무필터로 ref를 그대로 적용하는 지금 방식으로는 카탈로그가 순정(keycloak-authz 없는) 태그를 가리키게 되는 실질적 회귀가 있었다 (manifests/helm/apisix/2.17.0/custom-values.yaml이 실제로 이 상태였다). scripts/build/resolve-apisix-keycloak-authz-tag.py를 새로 만들어 apply-published-tags.py가 읽기 전에 published.json 사본의 apisix 항목을 제자리에서 고쳐 쓴다 — base 태그에 -keycloak-authz 버전이 실제로 있으면 그걸로 교체하고, 없으면 apisix 항목 자체를 지워 표준 "없다" 분기가 자연히 건너뛰게 한다(순정 태그로 되돌리는 일은 없다). apply-published-tags.py는 한 줄도 안 건드렸다. catalog-tag-update.yml에 이 전처리를 한 스텝만 끼워 넣고, 즉시 1회 실행해 2.17.0의 회귀를 이 커밋에서 바로 고쳤다(3.18.0-security-hardened-20260826 → ...-keycloak-authz). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
219 lines
7.1 KiB
YAML
219 lines
7.1 KiB
YAML
# 차트 2.16.0 의 appVersion 은 3.17.0 이다.
|
|
#
|
|
# 기존엔 dataup experiment/apisix/apisix-plugin 레포에서 apache/apisix:3.17.0-debian
|
|
# 기반으로 keycloak-authz 커스텀 플러그인만 얹어 빌드했다. 이 베이스(Debian) 자체가
|
|
# CVE 게이트를 다수 차단 — 이미 최신 apache/apisix 태그라 태그 교체로도 안 없어지는
|
|
# Debian 베이스 OS 패키지 CVE라, 자체 빌드(SUSE BCI 위에 APISIX-Runtime 전체를 소스에서
|
|
# 재현 + keycloak-authz 오버레이)로 교체했다. 빌드 정의·근거는 별도 레포 hardened-containers
|
|
# 의 images/apisix/(README.md 포함) — 이 레포에는 없다.
|
|
#
|
|
# 차트 업그레이드 시 이 태그도 새 appVersion 에 맞춰 hardened-containers 에서 apisix 를 다시
|
|
# 빌드해 갱신할 것 — dataup 레포 쪽은 더 이상 이 카탈로그가 참조하지 않는다(그 레포
|
|
# 자체는 그대로 둠).
|
|
image:
|
|
repository: docker.io/paasup/apisix
|
|
tag: "3.18.0-security-hardened-20260826-keycloak-authz"
|
|
pullPolicy: IfNotPresent
|
|
|
|
replicaCount: 1
|
|
|
|
resources:
|
|
limits:
|
|
cpu: "1000m"
|
|
memory: "1Gi"
|
|
requests:
|
|
cpu: "250m"
|
|
memory: "512Mi"
|
|
|
|
apisix:
|
|
enableIPv6: false # 기본값: true
|
|
|
|
# apisix.plugins 명시 시 기본 플러그인 목록을 완전히 대체한다. 전체 목록 유지 필수.
|
|
plugins:
|
|
- ai
|
|
- ai-aliyun-content-moderation
|
|
- ai-aws-content-moderation
|
|
- ai-prompt-decorator
|
|
- ai-prompt-guard
|
|
- ai-prompt-template
|
|
- ai-proxy
|
|
- ai-proxy-multi
|
|
- ai-rag
|
|
- ai-rate-limiting
|
|
- ai-request-rewrite
|
|
- api-breaker
|
|
- attach-consumer-label
|
|
- authz-casbin
|
|
- authz-casdoor
|
|
- authz-keycloak
|
|
- aws-lambda
|
|
- azure-functions
|
|
- basic-auth
|
|
- body-transformer
|
|
- cas-auth
|
|
- chaitin-waf
|
|
- clickhouse-logger
|
|
- client-control
|
|
- consumer-restriction
|
|
- cors
|
|
- csrf
|
|
- datadog
|
|
- degraphql
|
|
- echo
|
|
- elasticsearch-logger
|
|
- example-plugin
|
|
- ext-plugin-post-req
|
|
- ext-plugin-post-resp
|
|
- ext-plugin-pre-req
|
|
- fault-injection
|
|
- file-logger
|
|
- forward-auth
|
|
- google-cloud-logging
|
|
- grpc-transcode
|
|
- grpc-web
|
|
- gzip
|
|
- hmac-auth
|
|
- http-dubbo
|
|
- http-logger
|
|
- inspect
|
|
- ip-restriction
|
|
- jwe-decrypt
|
|
- jwt-auth
|
|
- kafka-logger
|
|
- kafka-proxy
|
|
- key-auth
|
|
- lago
|
|
- ldap-auth
|
|
- limit-conn
|
|
- limit-count
|
|
- limit-req
|
|
- loggly
|
|
- loki-logger
|
|
- mcp-bridge
|
|
- mocking
|
|
- multi-auth
|
|
- opa
|
|
- openfunction
|
|
- openid-connect
|
|
- openwhisk
|
|
- prometheus
|
|
- proxy-cache
|
|
- proxy-control
|
|
- proxy-mirror
|
|
- proxy-rewrite
|
|
- public-api
|
|
- real-ip
|
|
- redirect
|
|
- referer-restriction
|
|
- request-id
|
|
- request-validation
|
|
- response-rewrite
|
|
- rocketmq-logger
|
|
- serverless-post-function
|
|
- serverless-pre-function
|
|
- skywalking-logger
|
|
- sls-logger
|
|
- splunk-hec-logging
|
|
- syslog
|
|
- tcp-logger
|
|
- tencent-cloud-cls
|
|
- traffic-split
|
|
- ua-restriction
|
|
- udp-logger
|
|
- uri-blocker
|
|
- wolf-rbac
|
|
- workflow
|
|
- zipkin
|
|
- keycloak-authz # 커스텀 플러그인 — Kong 포팅
|
|
|
|
# Kong keycloak-authz 포팅: X-Access-Token JWT → preferred_username → 외부 API 권한 확인
|
|
customPlugins:
|
|
enabled: true
|
|
luaPath: "/opts/custom_plugins/?.lua"
|
|
plugins:
|
|
- name: keycloak-authz
|
|
attrs: {}
|
|
configMap:
|
|
name: keycloak-authz-plugin
|
|
mounts:
|
|
- key: keycloak-authz.lua
|
|
path: /opts/custom_plugins/apisix/plugins/keycloak-authz.lua
|
|
|
|
ssl:
|
|
enabled: true # 기본값: false
|
|
containerPort: 9443
|
|
|
|
admin:
|
|
# SECURITY: 기본 어드민 키 반드시 교체. 운영 배포 전 Secret 또는 Vault로 주입할 것.
|
|
# 키 생성: openssl rand -hex 16
|
|
credentials:
|
|
admin: "edd1c9f034335f136f87ad84b625c8f1" # 기본값 — 운영 전 변경 필수
|
|
|
|
service:
|
|
type: LoadBalancer # 기본값: NodePort — MetalLB에서 IP 자동 할당
|
|
http:
|
|
enabled: true
|
|
servicePort: 80
|
|
containerPort: 9080
|
|
tls:
|
|
servicePort: 443
|
|
stream:
|
|
enabled: true # 기본값: false — proxy_mode: http&stream 활성화 트리거
|
|
tcp: []
|
|
udp: []
|
|
|
|
# 내장 etcd(bitnami 서브차트)는 기본 비활성. bitnamilegacy/etcd:latest 가 CVE 게이트를
|
|
# 차단(실효 CRITICAL/HIGH 65건, 2026-08-11 실측)하는데 업스트림이 latest 태그만 제공해
|
|
# 태그 교체로 해소가 안 된다(bitnami/containers#83267). 카탈로그의 하드닝된 별도 etcd
|
|
# 차트(manifests/helm/etcd/1.1.12)를 externalEtcd 로 쓴다 — 개발/테스트에서 내장 etcd가
|
|
# 필요하면 enabled: true 로 되돌리되 그 CVE 노출은 그대로 남는다.
|
|
etcd:
|
|
enabled: false
|
|
|
|
# 기본 배포 대상: manifests/helm/etcd/1.1.12 를 릴리스명 "etcd", 네임스페이스
|
|
# "etcd-system" 으로 배포했을 때의 서비스(포트 2379, 평문). 다른 네임스페이스/릴리스명으로
|
|
# 배포했거나 dip-values.yaml 로 TLS(autoTls)를 켰다면 host/tls 설정을 맞게 바꾼다.
|
|
externalEtcd:
|
|
host:
|
|
- http://etcd.etcd-system.svc.cluster.local:2379
|
|
user: ""
|
|
password: ""
|
|
|
|
ingress-controller:
|
|
enabled: true
|
|
ingressClass: apisix # Kong의 'kong' class와 분리
|
|
|
|
# apisix-ingress-controller 서브차트 기본값(2.1.0, apache/apisix-ingress-controller)이
|
|
# 이미 최신 태그인데도 CVE 게이트를 다수 차단(정적 링크된 Go 모듈 다수 — 태그 교체로도
|
|
# 해소 안 됨) — 자체 빌드(취약 모듈만 강제 업그레이드)로 교체해 게이트 PASS. 빌드
|
|
# 정의·근거는 별도 레포 hardened-containers 의 images/apisix-ingress-controller/(이 레포에는 없다).
|
|
#
|
|
# adc 사이드카 — 태그 교체는 유효한 부분 조치였지만 완전 해소는 아니었다(벤더 등급만
|
|
# 보면 통과지만 max(벤더,NVD) 로는 여전히 차단 — Debian 이 "affected, 수정 없음"으로
|
|
# 영구 고정해둔 벤더 하향 등급 사례, cnpg-postgresql 때와 같은 패턴). 자체 빌드
|
|
# (distroless 대신 SUSE BCI + nodejs24, 빌더 스테이지는 업스트림 그대로)로 교체해
|
|
# 게이트 PASS. 빌드 정의·근거는 별도 레포 hardened-containers 의 images/adc/(이 레포에는 없다).
|
|
deployment:
|
|
image:
|
|
repository: docker.io/paasup/apisix-ingress-controller
|
|
tag: "2.1.0-security-hardened-20260825"
|
|
adcContainer:
|
|
image:
|
|
repository: docker.io/paasup/adc
|
|
tag: "0.29.0-security-hardened-20260825"
|
|
|
|
gatewayProxy:
|
|
createDefault: true # 기본값: false — v2.0.1+에서 미설정 시 라우트 등록 안 됨
|
|
publishService: apisix/apisix-gateway # Ingress STATUS에 External IP 반영
|
|
provider:
|
|
type: ControlPlane
|
|
controlPlane:
|
|
endpoints:
|
|
- http://apisix-admin.apisix.svc.cluster.local:9180
|
|
auth:
|
|
type: AdminKey
|
|
adminKey:
|
|
# SECURITY: admin.credentials.admin과 동일 키 — 운영 전 변경 필수
|
|
# 키 생성: openssl rand -hex 16
|
|
value: "edd1c9f034335f136f87ad84b625c8f1"
|