Модуль включен по умолчанию в наборе модулей Default. Модуль выключен по умолчанию в наборах модулей: Managed, Minimal.

Как явно включить или отключить модуль…

Чтобы явно включить или выключить модуль user-authn, установите spec.enabled в true или false в ModuleConfig/user-authn (создайте, при необходимости), или воспользуйтесь командой deckhouse-controller module в поде d8-system/deckhouse.

Пример включения модуля:

  • с помощью ресурса ModuleConfig:

    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: user-authn
    spec:
      enabled: true
    
  • с помощью команды deckhouse-controller (требуется kubectl, настроенный на работу с кластером):

    kubectl -ti -n d8-system exec deploy/deckhouse -c deckhouse -- deckhouse-controller module enable user-authn
    

Пример выключения модуля:

  • с помощью ресурса ModuleConfig:

    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: user-authn
    spec:
      enabled: false
    
  • с помощью команды deckhouse-controller (требуется kubectl, настроенный на работу с кластером):

    kubectl -ti -n d8-system exec deploy/deckhouse -c deckhouse -- deckhouse-controller module disable user-authn
    

Чтобы настроить модуль, используйте custom resource ModuleConfig с именем user-authn (подробнее о настройке Deckhouse…).

Пример ресурса ModuleConfig/user-authn для настройки модуля:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: user-authn
spec:
  version: 1
  enabled: true
  settings: # <-- Параметры модуля из раздела "Параметры" ниже.

Параметры

Версия схемы: 1

  • controlPlaneConfiguratorобъект

    Настройки параметров для модуля автоматической настройки kube-apiserver control-plane-manager.

    • controlPlaneConfigurator.dexCAModeстрока

      Способ определения CA, который будет использован при настройке kube-apiserver:

      • Custom — использовать CA, указанный в параметре dexCustomCA. Этот вариант уместен, например, если вы используете внешний HTTPS-балансировщик перед Ingress-контроллером и на этом балансировщике используется самоподписанный сертификат.
      • DoNotNeed — CA не требуется (например, при использовании публичного TLS-провайдера Let’s Encrypt или других).
      • FromIngressSecret — извлечь CA или сам сертификат из Secret’а, который используется в Ingress-ресурсе. Если вы используете самоподписанные сертификаты в Ingress-ресурсах — это ваш вариант.

      По умолчанию: "DoNotNeed"

      Допустимые значения: Custom, DoNotNeed, FromIngressSecret

    • controlPlaneConfigurator.dexCustomCAстрока

      CA, который будет использован в случае, если dexCAMode установлен в Custom.

    • controlPlaneConfigurator.enabledбулевый

      Использовать ли control-plane-manager для настройки OIDC в kube-apiserver.

      По умолчанию: true

  • highAvailabilityбулевый

    Ручное управление режимом отказоустойчивости.

    По умолчанию режим отказоустойчивости определяется автоматически. Подробнее про режим отказоустойчивости.

    Примеры:

    highAvailability: true
    
    highAvailability: false
    
  • httpsобъект

    Тип сертификата, используемого для Dex/kubeconfig-generator.

    При использовании этого параметра полностью переопределяются глобальные настройки global.modules.https.

    Примеры:

    https:
      mode: CustomCertificate
      customCertificate:
        secretName: foobar
    
    https:
      mode: CertManager
      certManager:
        clusterIssuerName: letsencrypt
    
    • https.certManagerобъект
      • https.certManager.clusterIssuerNameстрока

        ClusterIssuer, используемый для Dex/kubeconfig-generator.

        Доступны letsencrypt, letsencrypt-staging, selfsigned, но вы можете определить свои.

        По умолчанию: "letsencrypt"

    • https.customCertificateобъект
      • https.customCertificate.secretNameстрока

        Имя Secret’а в namespace d8-system, который будет использоваться для Dex/kubeconfig-generator.

        Secret должен быть в формате kubernetes.io/tls.

        По умолчанию: "false"

    • https.modeстрока

      Режим работы HTTPS:

      • CertManager — Dex/kubeconfig-generator будет работать по HTTPS и заказывать сертификат с помощью ClusterIssuer, заданного в параметре certManager.clusterIssuerName;
      • CustomCertificate — Dex/kubeconfig-generator будет работать по HTTPS, используя сертификат из namespace d8-system;
      • Disabled — Dex/kubeconfig-generator будет работать только по HTTP;
      • OnlyInURI — Dex/kubeconfig-generator будет работать по HTTP (подразумевая, что перед ним стоит внешний балансировщик, который терминирует HTTPS-трафик) и все ссылки в user-authn будут генерироваться с HTTPS-схемой. Балансировщик должен обеспечивать перенаправление с HTTP на HTTPS.

      По умолчанию: "Disabled"

      Допустимые значения: Disabled, CertManager, CustomCertificate, OnlyInURI

  • idTokenTTLстрока

    Время жизни ID-токена.

    Задается в виде строки с указанием часов, минут и секунд: 30m, 20s, 2h30m10s, 24h.

    По умолчанию: "10m"

    Шаблон: ^([0-9]+h)?([0-9]+m)?([0-9]+s)?$

  • ingressClassстрока

    Класс Ingress-контроллера, который используется для Dex/kubeconfig-generator.

    Опциональный параметр, по умолчанию используется глобальное значение modules.ingressClass.

    Шаблон: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$

  • kubeconfigGeneratorмассив объектов

    Массив, в котором указываются дополнительные способы доступа к API-серверу.

    Параметр может быть полезен в случае, если вы хотите предоставить доступ к API-серверу не через Ingress, а другими способами (например, с bastion-хоста или через OpenVPN).

    • kubeconfigGenerator.descriptionстрока

      Текстовое описание, содержащее информацию о том, чем этот метод аутентификации отличается от других.

    • kubeconfigGenerator.idстрока

      Обязательный параметр

      Имя способа доступа к API-серверу (без пробелов, маленькими буквами).

      Шаблон: ^[\@\.\:0-9a-z._-]+$

    • kubeconfigGenerator.masterCAстрока

      CA для доступа к API-серверу.

      Если данный параметр не указать, то будет автоматически использован Kubernetes CA.

      При публикации API-сервера через HTTP-прокси, который терминирует HTTPS-трафик, рекомендуется использовать самоподписанный сертификат, который нужно указать в параметре masterCA.

    • kubeconfigGenerator.masterURIстрока

      Обязательный параметр

      Если планируется использовать TCP-прокси, для адреса TCP-прокси должен быть сконфигурирован сертификат на стороне API-сервера. Например, в случае, если API-сервер доступен по трем адресам (192.168.0.10, 192.168.0.11 и 192.168.0.12), а ходить к API-серверу клиент будет через TCP-балансер (например, 192.168.0.15), необходимо перегенерировать сертификаты для API-серверов:

      • отредактировать kubeadm-config: kubectl -n kube-system edit configmap kubeadm-config, добавив в .apiServer.certSANs адрес 192.168.0.15;
      • сохранить получившийся конфиг: kubeadm config view > kubeadmconf.yaml;
      • удалить старые сертификаты API-сервера: mv /etc/kubernetes/pki/apiserver.* /tmp/;
      • перевыпустить новые сертификаты: kubeadm init phase certs apiserver --config=kubeadmconf.yaml;
      • перезапустить контейнер с API-сервером: docker ps -a | grep 'kube-apiserver' | grep -v pause| awk '{print $1}' | xargs docker restart;
      • повторить данное действие для всех master-узлов.
  • nodeSelectorобъект

    Структура, аналогичная spec.nodeSelector пода Kubernetes.

    Если ничего не указано или указано false, будет использоваться автоматика.

  • publishAPIобъект

    Настройки публикации API-сервера Kubernetes через Ingress для обеспечения его публичного доступа.

    • publishAPI.addKubeconfigGeneratorEntryбулевый

      Setting it to false will remove an entry in kubeconfig-generator

      По умолчанию: true

    • publishAPI.enableбулевый

      Если указать true, в namespace d8-user-authn кластера будет создан Ingress-ресурс, который откроет публичный доступ к API-серверу.

      По умолчанию: false

    • publishAPI.httpsобъект

      Режим работы HTTPS для Ingress API-сервера.

      Примеры:

      https:
        mode: SelfSigned
      
      https:
        mode: Global
        global:
          kubeconfigGeneratorMasterCA: plainstring
      
      • publishAPI.https.globalобъект

        Дополнительный параметр для режима Global.

        • publishAPI.https.global.kubeconfigGeneratorMasterCAстрока

          Если перед Ingress-контроллером есть внешний балансировщик, который терминирует HTTPS-трафик с использованием непубличного сертификата, укажите цепочку CA в этом параметре. Она будет добавлена в сгенерированные kubectl-конфиги.

          Если вы используете в кластере сертификаты, выдаваемые c помощью модуля cert-manager и Let’s Encrypt, следует в качестве значения установить пустую строку "".

          В качестве CA допускается указать непосредственно сертификат внешнего балансировщика. В таком случае нужно помнить, что обновление сертификата на балансировщике повредит ранее сгенерированные kubectl-конфиги.

      • publishAPI.https.modeстрока

        Режим выдачи сертификатов для данного Ingress-ресурса.

        В случае использования режима SelfSigned, для Ingress-ресурса будет выпущен сертификат подписанный CA.

        Получить выпущенный сертификат можно следующей командой: kubectl -n d8-user-authn get secrets kubernetes-api-ca-key-pair -oyaml.

        В случае использования режима Global будут применены политики из глобальной настройки global.modules.https.mode. То есть если в глобальной настройке стоит режим CertManager с ClusterIssuer letsencrypt, для Ingress-ресурса будет заказан сертификат Let’s Encrypt.

        По умолчанию: "SelfSigned"

        Допустимые значения: SelfSigned, Global

    • publishAPI.ingressClassстрока

      Ingress-класс, который будет использован для публикации API Kubernetes через Ingress.

      Шаблон: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$

    • publishAPI.whitelistSourceRangesмассив строк

      Массив адресов в формате CIDR, которым разрешено подключение к API-серверу.

      • Элемент массивастрока

        Шаблон: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(3[0-2]|[1-2][0-9]|[0-9]))?$

  • tolerationsмассив объектов

    Структура, аналогичная spec.tolerations пода Kubernetes.

    Если ничего не указано или указано false, будет использоваться автоматика.

    Пример:

    tolerations:
    - key: key1
      operator: Equal
      value: value1
      effect: NoSchedule
    
    • tolerations.effectстрока
    • tolerations.keyстрока
    • tolerations.operatorстрока
    • tolerations.tolerationSecondsцелочисленный
    • tolerations.valueстрока

Автоматический деплой oauth2-proxy в namespace вашего приложения и подключение его к Dex происходят при создании custom resource DexAuthenticator.

Важно! Так как использование OpenID Connect по протоколу HTTP является слишком значительной угрозой безопасности (что подтверждается, например, тем, что Kubernetes API-сервер не поддерживает работу с OIDC по HTTP), данный модуль можно установить только при включенном HTTPS (https.mode выставить в отличное от Disabled значение или на уровне кластера, или в самом модуле).

Важно! При включении данного модуля аутентификация во всех веб-интерфейсах перестанет использовать HTTP Basic Auth и переключится на Dex (который, в свою очередь, будет использовать настроенные вами внешние провайдеры). Для настройки kubectl необходимо перейти по адресу https://kubeconfig.<modules.publicDomainTemplate>/, авторизоваться в настроенном внешнем провайдере и скопировать shell-команды к себе в консоль.

Важно! Для работы аутентификации в dashboard и kubectl требуется донастройка API-сервера. Для автоматизации этого процесса реализован модуль control-plane-manager, который включен по умолчанию.