Weaviate RBAC
GenD prod 의 Weaviate (v1.36.12) RBAC 모델 + 사용자별 권한 활성화 절차.
Refs: 결정 epic #753 (closed), design doc
docs/DESIGN_WEAVIATE_RBAC_MIGRATION.md.
현 운영 모델 (2026-05-04 기준)
핵심:
- weaviate RBAC 활성 (
AUTHORIZATION_ENABLE_RBAC=true) + 3 role 등록 (gend-viewer,gend-analyst,gend-engineer) service-account-weaviate가AUTHORIZATION_RBAC_ROOT_USERS멤버 → 모든 권한- gend-api 가 항상 root 토큰으로 weaviate 호출
- 사용자별 권한 차등은 application-layer
vector_policy_enforcer가 단독 책임
3 Role permission 매트릭스
| Role | DocsPublic | DocsInternal | DocsRestricted |
|---|---|---|---|
gend-viewer | read | — | — |
gend-analyst | read | read | — |
gend-engineer | read+write | read+write | read+write |
service-account-weaviate (root) | * | * | * |
각 role 의 정확한 permission JSON 은 infra/weaviate/rbac-init-job.yaml 의 ConfigMap 참조.
가설 1 (group→role 자동 매핑) 미동작
검증 결과 (2026-05-04):
- audience=
weaviate토큰의/v1/users/own-info응답 groups: ["gend-viewer"]정확히 표시 (Keycloak claim 그대로)roles: null❌ — 자동 매핑 X
→ Keycloak group 멤버십을 weaviate role 권한으로 자동 변환하지 않음.
사용자별 RBAC 활성화 결정 트리
직접 호출 use case 발생 시점
다음 케이스 발생 시 본 가이드의 절차로 활성화:
- JupyterHub 사용자가 notebook에서
weaviate-clientPython lib 으로 직접 vector search - Superset / 외부 BI 도구 가 weaviate 를 데이터 source 로 추가
- 외부 RAG 서비스 (서드파티) 가 weaviate API 직접 호출
현 시점 (2026-05-04) 에는 위 use case 모두 발생 X — gend-api REST 경유로 충분.
Tier 2: Manual assign script (5명 이하)
scripts/weaviate-rbac/assign-user-role.sh 으로 운영자가 1 사용자씩 등록.
사전 조건
kubectl --context aks-genos-prod권한- Keycloak realm
gend에 사용자 생성 + 그룹 멤버 등록 완료 weaviate-api-credentials.client-secretSealedSecret 존재gend-realm-sync.client-secretSealedSecret 존재
실행
./scripts/weaviate-rbac/assign-user-role.sh <username> <role>
# 예시
./scripts/weaviate-rbac/assign-user-role.sh alice gend-viewer
./scripts/weaviate-rbac/assign-user-role.sh bob gend-engineer
동작 (실제 구현)
gend-realm-syncmaster client 으로 Keycloak admin token 발급- Keycloak realm
gend에서 user 존재 확인 (없으면 fail) - weaviate root 토큰 (service-account-weaviate,
client_credentials) 발급 - weaviate role 존재 확인 (
GET /v1/authz/roles/{role}) — rbac-init-job 적용 안 됐으면 fail POST /v1/authz/users/{username}/assignbody{"roles": [<role>]}호출GET /v1/authz/users/{username}으로 assign 결과 검증
본 스크립트는 weaviate client 의 directAccessGrantsEnabled 토글을 하지 않음
— root 토큰 (client_credentials) 만으로 assign 가능. 사용자 토큰 발급은 본
스크립트 범위 외 (audience mapper 또는 token-exchange 별도 절차).
Revoke
./scripts/weaviate-rbac/revoke-user-role.sh <username> <role>
POST /v1/authz/users/{username}/revoke 호출.
Audience 발급
사용자가 weaviate 를 직접 호출하려면 토큰의 aud claim 이 weaviate 여야 함.
gend-ui 토큰은 [gend-api, account] 라 미달. 두 옵션:
- Keycloak audience mapper 추가 (권장):
gend-uiclient 에 audience mapper 추가 → 토큰에weaviateaudience 포함. 모든 사용자 토큰에 영구 적용. - Token-exchange grant: gend-api 가 사용자 토큰을 weaviate audience 로 변환. gend-api 측 로직 추가 필요.
Tier 3a: CronJob sync 자동화 (5~20명, 정기)
# infra/weaviate/rbac-sync-cronjob.yaml (예시 — 본 PR 미포함)
spec:
schedule: "*/5 * * * *" # 5분 간격
jobTemplate:
spec:
template:
spec:
containers:
- name: sync
command:
- sh
- -c
- |
# 1. Keycloak group 멤버 list 조회 (gend-viewer/analyst/engineer)
# 2. weaviate /v1/authz/roles/{role}/users 조회
# 3. diff 처리: assign / revoke
본격 구현은 use case 발생 시 별도 epic + sub-issue 로 진행.
Tier 3b: Keycloak SPI (즉시 반영 필요)
Keycloak custom Service Provider Interface (Java extension) 으로 group 변경 이벤트 listen → weaviate REST API 즉시 호출. 운영 부담 큼 (Java 빌드, Keycloak 이미지 커스터마이즈, 호환성 관리). 20+ 사용자 또는 즉시 반영 SLA 시에만 권장.
참고
- design doc:
docs/DESIGN_WEAVIATE_RBAC_MIGRATION.md(epic 결정 사항 + 검증 절차) - 검증 결과 PR: #763
- vector_policy_enforcer:
apps/api/src/gend_api/services/vector_policy_enforcer.py - rbac-init-job:
infra/weaviate/rbac-init-job.yaml