Phase 16: fine-grained RBAC + DB rotation prep #173

Merged
claude merged 1 commits from feat/phase16-rbac-dynamic-secrets into main 2026-02-19 15:34:12 +01:00
Owner

Summary

  • Add infra-operators Keycloak group + K8s RBAC (dev/staging CRUD, prod readonly)
  • Add PostgreSQL NodePort + NetworkPolicy for OpenBao Database engine
  • Extend keycloak-secrets-manager for statefulset restart

Test plan

  • ArgoCD sync all affected apps
  • Verify RBAC resources created
  • Verify PostgreSQL NodePort reachable from node
## Summary - Add infra-operators Keycloak group + K8s RBAC (dev/staging CRUD, prod readonly) - Add PostgreSQL NodePort + NetworkPolicy for OpenBao Database engine - Extend keycloak-secrets-manager for statefulset restart ## Test plan - ArgoCD sync all affected apps - Verify RBAC resources created - Verify PostgreSQL NodePort reachable from node
claude added 1 commit 2026-02-19 15:33:36 +01:00
Phase 16: fine-grained RBAC (infra-operators) + DB rotation prep
All checks were successful
AI Review / AI Code Review (pull_request) Successful in 1s
PR Checks / Validate & Security Scan (pull_request) Successful in 8s
f71c583d69
- Add infra-operators group to Keycloak realm
- Add K8s RBAC: operators get full CRUD in dev/staging, readonly in prod,
  cluster-level readonly for nodes/namespaces/storage, no infra ns access
- Update ArgoCD RBAC: operators → role:readonly
- Update oauth2-proxy: allow infra-operators group
- Add PostgreSQL NodePort (35432) for OpenBao Database engine access
- Update NetworkPolicy: allow NodePort traffic from node CIDR
- Extend keycloak-secrets-manager Role: statefulset get/patch for rotation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Owner

AI Code Review

Обзор PR: Phase 16 RBAC + DB Rotation

Хорошо

  • Least-privilege RBAC: infra-operators разделены на cluster-readonly + per-namespace CRUD (dev/staging) + prod-readonly — правильная градация.
  • NetworkPolicy сегментация: CIDR для SSH-туннеля OpenBao отделён от основного Keycloak трафика.
  • Statefulset patch scope: keycloak-secrets-manager получает минимум прав (get, patch) для перезапуска replicas.

⚠️ Проблемы

1. NodePort селектор может не соответствовать

  • pg-nodeport.yaml селектор: postgresql labels — проверьте, что Bitnami PostgreSQL StatefulSet этими labels маркирован. Если labels отличаются, Service не найдёт endpoints.
  • Действие: Verify в kubectl describe svc keycloak-postgresql-nodeport что есть Endpoints после deply.

2. NetworkPolicy: слишком открыт CIDR блок

  • 10.10.10.0/24 — это весь subnet для OpenBao SSH tunnels? Если есть другие VM на этом subnet, они получат доступ к PostgreSQL.
  • Рекомендация: Уточните, что это именно KVM tunnel subnet, и документируйте в комментарии CIDR источник (например, # OpenBao KVM: 10.10.10.50/32 или конкретный диапазон).

3. RBAC: wildcard в oidc-operators-workload слишком широк

  • resources: ["*"] + verbs: ["*"] в ["", "apps", "batch"] — операторы могут удалять anything (Deployment, StatefulSet, Job).
  • Рекомендация: Явно перечислите ресурсы:
    resources: ["deployments", "statefulsets", "daemonsets", "configmaps", "secrets", "services"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
    
  • Исключите delete для prod (уже readonly, но для dev/staging явность критична).

4. ClusterRole name collision potential

  • Две RoleBinding в разных namespace'ах с одним именем oidc-operators-workload + один ClusterRole — это работает, но может запутать.
  • Рекомендация (опционально): Переименуйте RoleBinding в oidc-operators-workload-dev и oidc-operators-workload-staging для clarity.

5. oauth2-proxy: duplicate group names

  • allowed_groups = ["/infra-admins", "infra-admins", "/infra-operators", "infra-operators"]
  • Почему оба формата (с слешем и без)? Это ошибка или oauth2-proxy требует оба? Уточните логику.

Перед merge

  • Verify: kubectl get svc -n keycloak keycloak-postgresql-nodeport -o wide — endpoints populated?
  • Test: OpenBao SSH tunnel → NodePort:35432 connectivity
  • ArgoCD sync + проверка RBAC: попросите infra-operators залогиниться и confirm доступ в dev (CRUD) vs prod (readonly)

Automated review by Claude Haiku | advisory, does not block merge

## AI Code Review ## Обзор PR: Phase 16 RBAC + DB Rotation ### ✅ Хорошо - **Least-privilege RBAC:** infra-operators разделены на cluster-readonly + per-namespace CRUD (dev/staging) + prod-readonly — правильная градация. - **NetworkPolicy сегментация:** CIDR для SSH-туннеля OpenBao отделён от основного Keycloak трафика. - **Statefulset patch scope:** keycloak-secrets-manager получает минимум прав (`get`, `patch`) для перезапуска replicas. --- ### ⚠️ Проблемы **1. NodePort селектор может не соответствовать** - `pg-nodeport.yaml` селектор: `postgresql` labels — проверьте, что Bitnami PostgreSQL StatefulSet этими labels маркирован. Если labels отличаются, Service не найдёт endpoints. - **Действие:** Verify в `kubectl describe svc keycloak-postgresql-nodeport` что есть Endpoints после deply. **2. NetworkPolicy: слишком открыт CIDR блок** - `10.10.10.0/24` — это весь subnet для OpenBao SSH tunnels? Если есть другие VM на этом subnet, они получат доступ к PostgreSQL. - **Рекомендация:** Уточните, что это именно KVM tunnel subnet, и документируйте в комментарии CIDR источник (например, `# OpenBao KVM: 10.10.10.50/32` или конкретный диапазон). **3. RBAC: wildcard в oidc-operators-workload слишком широк** - `resources: ["*"]` + `verbs: ["*"]` в `["", "apps", "batch"]` — операторы могут удалять anything (Deployment, StatefulSet, Job). - **Рекомендация:** Явно перечислите ресурсы: ```yaml resources: ["deployments", "statefulsets", "daemonsets", "configmaps", "secrets", "services"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] ``` - Исключите `delete` для prod (уже readonly, но для dev/staging явность критична). **4. ClusterRole name collision potential** - Две RoleBinding в разных namespace'ах с одним именем `oidc-operators-workload` + один ClusterRole — это работает, но может запутать. - **Рекомендация (опционально):** Переименуйте RoleBinding в `oidc-operators-workload-dev` и `oidc-operators-workload-staging` для clarity. **5. oauth2-proxy: duplicate group names** - `allowed_groups = ["/infra-admins", "infra-admins", "/infra-operators", "infra-operators"]` - Почему оба формата (с слешем и без)? Это ошибка или oauth2-proxy требует оба? Уточните логику. --- ### ✋ Перед merge - [ ] Verify: `kubectl get svc -n keycloak keycloak-postgresql-nodeport -o wide` — endpoints populated? - [ ] Test: OpenBao SSH tunnel → NodePort:35432 connectivity - [ ] ArgoCD sync + проверка RBAC: попросите infra-operators залогиниться и confirm доступ в dev (CRUD) vs prod (readonly) --- _Automated review by Claude Haiku | advisory, does not block merge_
claude merged commit 0ebcfc6a24 into main 2026-02-19 15:34:12 +01:00
claude deleted branch feat/phase16-rbac-dynamic-secrets 2026-02-19 15:34:12 +01:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: claude/k8s-apps#173
No description provided.