diff --git a/apps/django/CONFIGURATION.md b/apps/django/CONFIGURATION.md index 4dfb722..e733dc9 100644 --- a/apps/django/CONFIGURATION.md +++ b/apps/django/CONFIGURATION.md @@ -101,6 +101,7 @@ Module Federation) конфигурируется отдельно на этап | `JWT_PUBLIC_KEY` | string | — | Публичный RSA-ключ проверки | | `JWT_KID` | string | `None` | `kid` в заголовке токена (используется для межсервисных вызовов) | | `DJANGO_JWT_SECRET` | string | `Froom too much love of living` | Легаси-секрет | +| `SERVER_SUPERSET_JWT_SECRET` | string | `""` | hmac-секрет для embedded superset guest token. В контуре wb берётся из vault `secrets/data/vault/apps/superset`, ключ `JWT_SECRET`, через роль `django-superset` | ### Celery (`CELERY_*`) @@ -299,11 +300,18 @@ Module Federation) конфигурируется отдельно на этап | `django-kafka` | `secrets/data/kafka/apps/django` | `KAFKA_BOOTSTRAP_SERVERS/SECURITY_PROTOCOL/SASL_*` | | `django-jwt-private` / `django-jwt-public` | `secrets/data/vault/common/rsa_keys` | `JWT_PRIVATE_KEY` / `JWT_PUBLIC_KEY` | | `django-common` | `secrets/data/vault/common/django_auth` | `ZITADEL_ACCESS_TOKEN` | +| `server_superset_jwt_secret` | `secrets/data/vault/apps/superset` | `SERVER_SUPERSET_JWT_SECRET` для `/api/analytics/widgets//superset_guest_token/` | Контейнер экспортирует эти файлы в окружение до запуска (`set -a; . /vault/secrets/...`). Кроме того, `production.py` из ConfigMap содержит функцию `_load_env_file`, которая подхватывает те же файлы при запуске `manage.py` через `kubectl exec` вне entrypoint. +Для wb superset guest token не использует сервисную учётку Guest Token API: backend +формирует jwt локально и подписывает его `SERVER_SUPERSET_JWT_SECRET`, а superset +проверяет тем же значением через `GUEST_TOKEN_JWT_SECRET = os.getenv("JWT_SECRET")`. +Оба значения должны приходить из одного vault-пути `secrets/data/vault/apps/superset`; +разовый k8s-secret в `django` для этого кейса не используется. + Остальные (несекретные) переменные задаются в блоке `env` контейнеров `backend`/`celery` (`SERVER_*`, `WORKFLOWS_*`, `BIMV2_*`, `MEASUREMENTS_*`, `ZITADEL_HOST`, `KAFKA_TOPICS`, `EAV_ENABLE`, `PDM_SYNC`, `JWT_KID` и др.). diff --git a/apps/django/wb/backend.yaml b/apps/django/wb/backend.yaml index 9b4a356..6209c03 100644 --- a/apps/django/wb/backend.yaml +++ b/apps/django/wb/backend.yaml @@ -26,6 +26,30 @@ spec: remediation: retries: 3 + postRenderers: + - kustomize: + patches: + - target: + group: apps + version: v1 + kind: Deployment + name: backend + patch: |- + - op: add + path: /spec/template/metadata/annotations + value: + vault.hashicorp.com/agent-inject: "true" + vault.hashicorp.com/agent-init-first: "true" + vault.hashicorp.com/agent-pre-populate-only: "true" + vault.hashicorp.com/auth-path: "auth/kubernetes" + vault.hashicorp.com/role: "django-superset" + vault.hashicorp.com/agent-inject-secret-server-superset-jwt-secret: "secrets/data/vault/apps/superset" + vault.hashicorp.com/agent-inject-file-server-superset-jwt-secret: "server_superset_jwt_secret" + vault.hashicorp.com/agent-inject-template-server-superset-jwt-secret: | + {{- with secret "secrets/data/vault/apps/superset" -}} + {{ index .Data.data "JWT_SECRET" }} + {{- end -}} + values: global: env: _default @@ -52,6 +76,14 @@ spec: port: _default: 8000 + command: + _default: + - /bin/sh + - -ec + - | + export SERVER_SUPERSET_JWT_SECRET="$(cat /vault/secrets/server_superset_jwt_secret)" + exec bash /opt/sarex/entrypoint.sh + probes: liveness: enabled: false diff --git a/clusters/wb/infrastructure/patches/superset.yaml b/clusters/wb/infrastructure/patches/superset.yaml index 07d24dd..0a1210c 100644 --- a/clusters/wb/infrastructure/patches/superset.yaml +++ b/clusters/wb/infrastructure/patches/superset.yaml @@ -9,7 +9,7 @@ spec: values: fullnameOverride: superset vault: - enabled: false + enabled: true stronghold: enabled: false extraEnv: @@ -19,11 +19,6 @@ spec: extraEnvRaw: - name: ENABLE_PROXY_FIX value: "true" - - name: JWT_SECRET - valueFrom: - secretKeyRef: - name: jwt-secret - key: jwt_secret supersetNode: connections: redis_host: superset-redis-headless @@ -73,6 +68,10 @@ spec: "EMBEDDED_SUPERSET": True, "ENABLE_TEMPLATE_PROCESSING": True, } + GUEST_ROLE_NAME = "Public" + GUEST_TOKEN_JWT_AUDIENCE = "guest" + GUEST_TOKEN_JWT_SECRET = os.getenv("JWT_SECRET") + GUEST_TOKEN_JWT_EXP_SECONDS = 3600 iframe_config: | X_FRAME_OPTIONS = None HTTP_HEADERS = { diff --git a/infrastructure/superset/base/helmrelease.yaml b/infrastructure/superset/base/helmrelease.yaml index 3069128..69ac390 100644 --- a/infrastructure/superset/base/helmrelease.yaml +++ b/infrastructure/superset/base/helmrelease.yaml @@ -8,7 +8,7 @@ spec: chart: spec: chart: superset-prod - version: "0.13.3" + version: "0.13.4" sourceRef: kind: HelmRepository name: yc-oci-charts