С DKP можно использовать аутентификацию при доступе к Kubernetes API. В этом случае, пользователь в веб-интерфейсе kubeconfig DKP может сгенерировать конфигурацию для kubectl, для безопасного доступа к Kubernetes API через балансировщик трафика (Ingress-контроллер).
Чтобы настроить доступ, выполните следующие шаги:
-
Включите публикацию Kubernetes API. Для этого установите параметр
publishAPI.enabled: trueв настройках модуляuser-authnили с помощью веб-интерфейса администратора Deckhouse.Пример конфигурации модуля:
spec: enabled: true version: 2 settings: publishAPI: enabled: true -
Откройте веб-интерфейс kubeconfig. Веб-интерфейс для генерации kubeconfig в DKP активируется автоматически после включения параметра
publishAPIв модулеuser-authn. Этот веб-интерфейс доступен по URL:https://kubeconfig.<publicDomainTemplate>Например, если
publicDomainTemplate:%s.kube.my, то URL будетhttps://kubeconfig.kube.my. -
Сгенерируйте конфигурацию
kubectl. После авторизации в интерфейсе kubeconfig пользователь получит набор команд для настройкиkubectl. Эти команды можно скопировать и вставить в консоль. Аутентификация будет производиться по OIDC-токену, выданному Dex. При поддержке провайдером функции продления сессии конфигурация будет включатьrefresh token, что позволит продлевать доступ без повторной аутентификации. -
Настройте несколько точек подключения к API. В конфигурации модуля
user-authnможно задать несколько точек подключения (kube-apiserver) с описанием и CA-сертификатами для каждой. Это может понадобиться, если кластер доступен через разные сети — например, VPN или публичный IP:settings: kubeconfigGenerator: - id: direct masterURI: https://159.89.5.247:6443 description: "Direct access to kubernetes API"
Как работает защита доступа к Kubernetes API
В Deckhouse Kubernetes Platform вы можете безопасно опубликовать Kubernetes API наружу с помощью Ingress-контроллера, сохранив контроль над доступом. Публикация API и настройка аутентификации осуществляется через модуль user-authn. Вы можете настроить:
- список доверенных IP-адресов или сетей, которым разрешён доступ;
- список групп пользователей, которые имеют право аутентификации;
- Ingress-контроллер, через который будет осуществляться доступ.
Для настройки:
- Включите публикацию API, как в примере выше.
- Настройте ограничения доступа. В конфигурации модуля можно указать:
- список сетевых адресов, которым разрешён доступ (
allowedSourceRanges); - список групп пользователей, которым разрешено подключение к Kubernetes API (
allowedUserGroups); - выбор Ingress-контроллера, через который будет работать публикация (
ingressClass).
- список сетевых адресов, которым разрешён доступ (
- Используйте веб-интерфейс kubeconfig. Пользователи смогут получить безопасный доступ к API через kubeconfig, сгенерированный в веб-интерфейсе (
https://kubeconfig.<publicDomainTemplate>). Этот kubeconfig будет содержать OIDC-токен и настройки подключения через Ingress.
Что будет настроено автоматически при включении публикации API:
- Deckhouse сам настроит необходимые аргументы для kube-apiserver;
- будет сгенерирован сертификат CA и добавлен в kubeconfig;
- будет настроен вход через Dex с поддержкой OIDC.
Доступ с использованием базовой аутентификации (LDAP)
Помимо OIDC можно настроить прямой доступ к Kubernetes API с использованием базовой аутентификации (Basic Authentication, по логину и паролю). В этом случае проверка учетных данных осуществляется через LDAP-совместимую службу каталогов.
Для настройки:
- Включите публикацию API (параметр
publishAPI). - Настройте провайдер LDAP в модуле
user-authnи включите в нём опциюenableBasicAuth: true.
В кластере может быть только один провайдер с включенным параметром enableBasicAuth.
После этого пользователи могут настроить свой kubeconfig, указав логин и пароль LDAP:
apiVersion: v1
kind: Config
clusters:
- name: my-cluster
cluster:
server: https://api.example.com
# Путь к CA сертификату или insecure-skip-tls-verify: true
certificate-authority: /path/to/ca.crt
users:
- name: ldap-user
user:
username: janedoe@example.com
password: userpassword
contexts:
- name: default
context:
cluster: my-cluster
user: ldap-user
current-context: default
SSO по Kerberos (SPNEGO) для LDAP
Dex поддерживает аутентификацию без отображения формы ввода логина/пароля, которая реализуется с помощью механизма Kerberos (SPNEGO) для LDAP‑коннектора. Механизм работает по следующему принципу:
- Браузер, доверяющий хосту Dex, отправляет
Authorization: Negotiate …. - Dex валидирует Kerberos‑билет по keytab и пропускает форму вводу логина/пароля.
- Dex сопоставляет principal с LDAP‑именем, получает группы и завершает OIDC‑поток.
Для настройки SSO по Kerberos (SPNEGO) в LDAP должна быть учетная запись с правами только на чтение (service account). Подробнее о настройке — в разделе «Интеграция по LDAP».
Включение SSO по Kerberos (SPNEGO) для LDAP:
- В инфраструктуре клиента должен быть задан SPN
HTTP/<fqdn-dex>для сервисного аккаунта и сгенерирован keytab. - В кластере создайте секрет в неймспейсе
d8-user-authnс ключомkrb5.keytab. - В ресурсе DexProvider (тип LDAP) включите блок
spec.ldap.kerberosи настройте в нём параметры:enabled: true;keytabSecretName: <имя секрета>;- опционально:
expectedRealm,usernameFromPrincipal,fallbackToPassword.
Dex автоматически смонтирует keytab и начнёт принимать SPNEGO. krb5.conf на сервере не обязателен — билеты проверяются по keytab.
Пример настройки SSO по Kerberos (SPNEGO) для LDAP (расширение спецификации LDAP‑провайдера):
apiVersion: deckhouse.io/v1
kind: DexProvider
metadata:
name: active-directory
spec:
type: LDAP
displayName: Active Directory
ldap:
host: ad.example.com:636
bindDN: cn=Administrator,cn=users,dc=example,dc=com
bindPW: admin0!
userSearch:
baseDN: cn=Users,dc=example,dc=com
username: sAMAccountName
idAttr: uid
emailAttr: mail
nameAttr: cn
groupSearch:
baseDN: cn=Users,dc=example,dc=com
nameAttr: cn
userMatchers:
- userAttr: uid
groupAttr: memberUid
kerberos:
enabled: true
keytabSecretName: dex-kerberos-keytab # Секрет в неймспейсе `d8-user-authn` с ключом 'krb5.keytab'.
expectedRealm: EXAMPLE.COM # Опционально, проверка realm (без учёта регистра).
usernameFromPrincipal: sAMAccountName # localpart|sAMAccountName|userPrincipalName
fallbackToPassword: false # По умолчанию false; если true — при отсутствии/ошибке заголовка `Authorization: Negotiate` будет показана форма ввода логина/пароля.
Примечания:
- Секрет
dex-kerberos-keytabдолжен находиться в неймспейсеd8-user-authnи содержать ключkrb5.keytab. - Один под Dex может обслуживать несколько LDAP+Kerberos провайдеров. У каждого — свой keytab;
krb5.confне требуется (Dex проверяет билеты офлайн по keytab).