Ниже — подробная, практическая статья по интеграции Superset с Microsoft Active Directory.
Примечание: инструкция рассчитана на запуск Superset в Kubernetes с помощью Helm. Так же это применимо и для minikube
Краткий обзор (TL;DR)
-
Создать сервисный аккаунт в AD (bind user) — не использовать личный аккаунт администратора.
-
В Kubernetes хранить секреты (
bind DN
, пароль) вk8s Secret
. -
Обновить
values.yml
Helm-чарта: поменять образ наpartonen/superset
, передать переменные окружения / секреты и маунтsuperset_config.py
. -
В
superset_config.py
настроить Flask-AppBuilder LDAP (AUTH_LDAP), сопоставление полей пользователей и маппинг AD-групп → роли Superset. -
Развернуть Helm, проверить логи, протестировать вход LDAP-пользователем.
-
Включить безопасное соединение (TLS/LDAPS) в проде; отладку — только временно.
Требования и предпосылки
-
Kubernetes-кластер с доступом
kubectl
и права на создание Secrets/ConfigMaps. -
Helm-чарт для Superset (вы используете Helm + values.yml).
-
Доступ к Active Directory (адрес AD/LDAPS, порт, базовый DN).
-
Созданный сервисный аккаунт в AD (bind user) с правом поиска в нужной OU.
-
SSL-сертификаты для LDAPS (если используете TLS/LDAPS).
Шаг 1 — Подготовка Active Directory (анонимно)
-
Создайте в AD аккаунт типа служебного
svc_superset
(не админ), и поместите его в OU, где он может читать атрибуты пользователей и группы.
Плейсхолдеры:-
Bind DN:
CN=svc_superset,OU=svc,OU=users,DC=corp,DC=example,DC=com
→ замените на ваш DN. -
Bind password: никогда не храните в репозитории — используйте Kubernetes Secret.
-
-
Определите OU/users search base и формат UID для пользователей (обычно
sAMAccountName
для AD).-
Search base:
OU=People,DC=corp,DC=example,DC=com
(пример).
-
-
Решите, как будете маппить AD-группы на роли Superset (например
AD_Group_Superset_Admins
→ рольAdmin
в Superset).
Шаг 2 — Создание Kubernetes Secret (без паролей в репозитории)
Создайте Secret, где хранится BIND_DN
и BIND_PASSWORD
. Ниже — пример команды (замените значения на реальные при выполнении):
Важно:
REPLACE_WITH_BIND_PASSWORD
— замените командой на реальный пароль только в момент создания. Не сохраняйте пароль в коде.
Шаг 3 — Настройка Helm values.yml (замена образа)
В вашем values.yml
Helm-чарта замените образ Superset на нужный:
Если ваш чарт отличается по структуре — адаптируйте. Главное:
image.repository: partonen/superset
.
Шаг 4 — Подготовка superset_config.py
Поместите superset_config.py
в ConfigMap (или в образ, если билдите собственный). Ниже — подробный пример конфигурации LDAP для Flask-AppBuilder / Superset. Пароли/секреты заменены на чтение из переменных окружения.
Пояснения:
-
AUTH_ROLES_MAPPING
— сопоставляет AD-группы (DN) ролям Superset. Подставьте те DN, которые возвращаетmemberOf
в вашем AD. -
AUTH_USER_REGISTRATION
: еслиTrue
, то при первом логине пользователя он будет автоматически создан в Superset. Если вы хотите ручную проверку — ставьтеFalse
. -
Все секреты читаются из переменных окружения, поэтому в Helm/values нужно пробросить их из Kubernetes Secret (см. предыдущий раздел).
Шаг 5 — Развёртывание (примерная последовательность)
-
Создайте ConfigMap с
superset_config.py
:
-
Убедитесь, что Secret
superset-ldap
создан (см. Шаг 2). -
Подкорректируйте
values.yml
(см. Шаг 3), затем примените Helm:
(замените ./superset-chart
на реальный путь/имя чарта)
-
Просмотрите логи пода:
Или конкретного пода:
Шаг 6 — Тестирование входа и валидация
-
Попробуйте войти в Superset через веб-интерфейс с AD-пользователем (sAMAccountName).
-
Проверьте, создался ли пользователь в Superset и была ли назначена ожидаемая роль.
-
Если пользователь не создаётся — проверьте логи (Flask-AppBuilder, Superset) — обычно там видно ошибку поиска/bind.
-
Для отладки LDAP отдельно можно использовать
ldapsearch
илиldap3
скрипт из-под того же сервера/пода, где запускается Superset, чтобы убедиться, что bind и поиск работают.
Примеры команд (запускать на машине, имеющей доступ к AD; при использовании LDAPS указывайте порт 636 и TLS):
(в Kubernetes можно запустить временный debug-pod и выполнить аналогичную проверку внутри кластера)
Шаг 7 — Безопасность и рекомендации
-
LDAPS/TLS: в проде используйте
ldaps://
(порт 636) или StartTLS, валидируйте сертификат AD. Не используйте plaintext LDAP через интернет. -
Секреты: храните пароли в Kubernetes Secret, можно дополнительно зашифровать через External Secrets/SealedSecrets/Vault.
-
Минимальные привилегии: сервисный аккаунт должен иметь только права на поиск (read) и доступ к атрибутам.
-
Логирование: временно включайте LDAP debug (см.
LDAP_DEBUG
), но отключайте в проде, т.к. логи могут содержать чувствительную информацию. -
RBAC: стройте маппинг AD-групп → ролям Superset заранее и документируйте его.
-
Мониторинг: контролируйте неудачные входы, количество созданных пользователей и аудит.
Частые ошибки и диагностика
-
Bind failed / invalid credentials: проверьте
LDAP_BIND_DN
и пароль в Secret; проверьте, может ли данный DN логиниться снаружи (ldapsearch). -
Search base неверен: проверьте
AUTH_LDAP_SEARCH
— если он слишком узкий, нужные пользователи не найдутся. -
memberOf пуст / нет групп: некоторые AD конфигурации не возвращают
memberOf
в результатах. Проверьте, какие атрибуты возвращает сервер — возможно, придётся делать дополнительный поиск групп по membership. -
TLS/сертификаты: при LDAPS ошибка валидации сертификата — добавьте CA в доверенные сертификаты внутри контейнера или используйте verified chain.
-
Пользователь застрял в «машинном» статусе: убедитесь, что
AUTH_USER_REGISTRATION
иAUTH_USER_REGISTRATION_ROLE
выставлены так, как вы хотите.
Полезный контрольный список перед запуском
-
Создан сервисный AD-аккаунт (bind DN) с правами поиска.
-
Secret в k8s содержит
LDAP_BIND_DN
иLDAP_BIND_PASSWORD
. -
ConfigMap с
superset_config.py
добавлен и монтируется в контейнер. -
values.yml
обновлён —image.repository: partonen/superset
. -
Helm-релиз обновлён и поды поднялись (
kubectl get pods
). -
Логи проверены на ошибки bind/search.
-
Тестовый пользователь из AD успешно логинится и получает нужную роль.
Пример анонимизированных фрагментов (подытог)
Пример команды создания Secret (замените значения):
Ключевая часть values.yml
:
Ключевые настройки в superset_config.py
(коротко):
Комментарии
Отправить комментарий