Модуль user-authn реализует единую систему аутентификации, интегрированную с Kubernetes и веб-интерфейсами, используемыми в модулях Deckhouse Platform (DP), например, в модуле console.
Подробнее с настройками модуля и примерами его использования можно ознакомиться в соответствующем разделе документации.
Архитектура модуля
Для упрощения схемы приняты следующие допущения:
- На схеме показано, что контейнеры разных подов взаимодействуют друг с другом напрямую. Фактически они взаимодействуют через соответствующие сервисы Kubernetes (внутренние балансировщики). Названия сервисов не указываются, если они очевидны из контекста. В остальных случаях название сервиса указано над стрелкой.
- Поды могут быть запущены в нескольких репликах, однако на схеме все поды изображены в одной реплике.
В DP для служебных сервисов и пользовательских приложений используются две схемы аутентификации:
- с использованием dex-authenticator;
- с использованием клиента Dex.
Архитектура модуля user-authn на уровне 2 модели C4 и его взаимодействия с другими компонентами DP изображены на следующих диаграммах.
Вариант с использованием dex-authenticator:

Для упрощения на следующих схемах показаны только компоненты и их взаимодействия, отличающие эти схемы от варианта с использованием dex-authenticator.
Вариант с использованием клиента Dex:

При подключении к API Kubernetes с помощью утилиты d8, kubectl или других клиентов Kubernetes с использованием сгенерированного kubeconfig используются отдельные схемы аутентификации:
- аутентификация по токенам, подробно описана в соответствующем разделе документации;
- базовая аутентификация (Basic Authentication), пример настройки базовой аутентификации с использованием провайдера LDAP приведён в разделе документации модуля.
Вариант подключения к API Kubernetes с аутентификацией по токенам:

Вариант подключения к API Kubernetes с базовой аутентификацией:

Компоненты модуля
Модуль состоит из следующих компонентов:
-
Dex — федеративный провайдер OpenID Connect, поддерживающий работу со статическими пользователями и интеграцию с внешними провайдерами аутентификации, такими как SAML, GitLab или GitHub. Модуль использует модифицированную версию Dex для поддержки:
- групп для статических учетных записей пользователей;
- двухфакторной аутентификации (2FA);
- политики паролей;
- принудительного изменения пароля;
- SPNEGO (Kerberos) для LDAP‑коннектора. При использовании этого механизма Dex принимает билеты по заголовку
Authorization: Negotiate, валидирует их по keytab, и завершает вход без отображения формы ввода логина/пароля и т.д.
Актуальный список изменений в Dex приведен в репозитории модуля.
Состоит из следующих контейнеров:
- dex — основной контейнер, реализующий функции Dex;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищенного доступа к метрикам провайдера. Является Open Source-проектом.
-
Dex-authenticator — middleware-сервис для аутентификации запросов к приложениям через сервис аутентификации кластера DP.
При соответствующей настройке Ingress-контроллера (через модуль
auth_requestNGINX) запросы сначала направляются в dex-authenticator для аутентификации.Состоит из следующих контейнеров:
- dex-authenticator — основной контейнер сервиса;
- redis — сайдкар-контейнер c базой данных Redis, используемый для временного хранения ID Token и быстрого доступа к ним (за счет размещения базы в памяти);
- self-signed-generator — init-контейнер, генерирующий самоподписанный сертификат при запуске пода.
-
User-authn-controller — контроллер, состоящий из одного контейнера user-authn-controller и выполняющий следующие операции:
-
управление кастомными ресурсами модуля:
- Group — ресурс, описывающий статическую группу;
- User — ресурс, описывающий статического пользователя;
- UserAccount — ресурс, описывающий представление объектов Dex Password и OfflineSessions для веб-интерфейса DKP;
- UserOperation — ресурс, описывающий операции над пользователем (сброс пароля, сброс 2FA, блокировка/разблокировка);
- DexProviderCheck — ресурс, описывающий проверку доступности конкретного провайдера Dex. Проверка подтверждает, что провайдер существует, активен, Dex доступен, а эндпоинт провайдера достижим. При этом не выполняется полная процедура аутентификации пользователя.
- удаление пользователей с истекшим сроком действия учетной записи (у которых значение поля
status.expireAtраньше текущего времени); - периодическая проверка доступности настроенных внешних провайдеров аутентификации (используя кастомные ресурсы DexProviderCheck);
- выявление конфликтующих настроек TLS-сертификатов в конфигурации подключения стороннего провайдера LDAP и экспорт соответствующей метрики.
User-authn-controller при управлении кастомными ресурсами модуля использует в качестве бэкенда кастомные ресурсы Password, OfflineSession и Refreshtoken API-группы
dex.coreos.com, используемые провайдером Dex как хранилище. -
-
User-api — компонент, реализующий сервис сброса пользователем пароля своей учетной записи. Сервис доступен пользователю только через веб-интерфейс DKP и не требует прав администратора платформы. Сбросить можно пароль только для текущего пользователя. User-api валидирует токены поступающих запросов в dex. Для выполнения данной операции компонент создает кастомный ресурс UserOperation с типом
ResetPassword, который обрабатывается компонентом user-authn-controller.Состоит из следующих контейнеров:
- self-signed-generator — init-контейнер, генерирующий самоподписанный сертификат при запуске пода;
- user-api — основной контейнер сервиса.
-
Basic-auth-proxy — опциональный компонент, состоящий из одного контейнера proxy, который запускается при включении базовой аутентификации в настройках одного из внешних провайдеров. При подключении к API Kubernetes компонент basic-auth-proxy выполняет базовую аутентификацию пользователей во внешних провайдерах через dex, кеширует результаты проверки учётных данных и проксирует аутентифицированные запросы в API Kubernetes.
Взаимодействия модуля
Модуль взаимодействует со следующими компонентами:
- Внешние провайдеры аутентификации.
-
Kube-apiserver:
- управление кастомными ресурсами модуля;
- авторизация запросов на получение метрик.
С модулем взаимодействуют следующие внешние компоненты:
-
Ingress-контроллер — перенаправляет в dex-authenticator запросы на аутентификацию в служебных сервисах DP и в пользовательских приложениях.
-
Пользовательские приложения — могут аутентифицироваться в dex напрямую (без dex-authenticator), если для приложения настроен OAuth2-клиент в Dex. Подробнее с настройкой клиента Dex можно ознакомиться в документации модуля
user-authn. -
Kube-apiserver — обращается в dex при обработке запросов к API Kubernetes, выполняемых с использованием файла kubeconfig:
- при запуске kube-apiserver запрашивает конфигурационный эндпоинт OIDC-провайдера (в данном случае — Dex), чтобы получить информацию об
issuerи параметры для проверки токенов через JWKS-эндпоинт; - при получении запроса с ID token kube-apiserver проверяет его подпись с использованием ключей, полученных с JWKS-эндпоинта, а затем проверяет значения claim’ов токена на соответствие конфигурации сервера.
Подробнее о том, как работает подключение к API Kubernetes с помощью сгенерированного kubeconfig, можно ознакомиться на соответствующей странице документации.
- при запуске kube-apiserver запрашивает конфигурационный эндпоинт OIDC-провайдера (в данном случае — Dex), чтобы получить информацию об
- Prometheus-main — сбор метрик компонентов модуля.
- Веб-интерфейс Deckhouse — пересылает запросы пользователей на сброс пароля.