В модуле реализован 1 алерт.

Модуль включен по умолчанию в наборе модулей 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 svc/deckhouse-leader -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 svc/deckhouse-leader -c deckhouse -- deckhouse-controller module disable user-authn
    

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

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

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

Параметры

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

  • settings
    объект
    • settings.controlPlaneConfigurator
      объект

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

      • settings.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

      • settings.controlPlaneConfigurator.dexCustomCA
        строка

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

      • settings.controlPlaneConfigurator.enabled
        булевый

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

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

    • settings.highAvailability
      булевый

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

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

      Примеры:

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

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

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

      Примеры:

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

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

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

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

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

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

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

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

      • settings.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

    • settings.idTokenTTL
      строка

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

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

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

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

    • settings.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])?)*$

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

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

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

      • settings.kubeconfigGenerator.description
        строка

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

      • settings.kubeconfigGenerator.id
        строка

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

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

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

      • settings.kubeconfigGenerator.masterCA
        строка

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

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

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

      • settings.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-узлов.
    • settings.nodeSelector
      объект

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

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

    • settings.publishAPI
      объект

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

      • settings.publishAPI.addKubeconfigGeneratorEntry
        булевый

        Если указать false, будет удалена запись в kubeconfig-generator.

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

      • settings.publishAPI.enabled
        булевый

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

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

      • settings.publishAPI.https
        объект

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

        Примеры:

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

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

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

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

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

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

        • settings.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

      • settings.publishAPI.ingressClass
        строка

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

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

      • settings.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]))?$

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

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

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

      Пример:

      tolerations:
      - key: key1
        operator: Equal
        value: value1
        effect: NoSchedule
      
      • settings.tolerations.effect
        строка
      • settings.tolerations.key
        строка
      • settings.tolerations.operator
        строка
      • settings.tolerations.tolerationSeconds
        целочисленный
      • settings.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, который включен по умолчанию.