Доступно в редакциях:  CE, BE, SE, SE+, EE, CSE Lite (1.73), CSE Pro (1.73)

Стадия жизненного цикла модуля: General Availability

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

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

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

Явно включить или выключить модуль можно одним из следующих способов:

  • С помощью веб-интерфейса Deckhouse. В разделе «Система» → «Управление системой» → «Deckhouse» → «Модули», откройте модуль user-authn, включите (или выключите) переключатель «Модуль включен». Сохраните изменения.

    Пример:

    Интерфейс включения и выключения модуля

  • С помощью Deckhouse CLI (d8).

    Используйте команду d8 system module enable для включения модуля, или d8 system module disable для выключения модуля (требуется Deckhouse CLI (d8), настроенный на работу с кластером).

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

    d8 system module enable user-authn
    
  • С помощью ModuleConfig user-authn.

    Установите spec.enabled в true или false в ModuleConfig user-authn (создайте его, при необходимости).

    Пример манифеста для включения модуля user-authn:

    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: user-authn
    spec:
      enabled: true
    

Как настроить модуль...

Настроить модуль можно одним из следующих способов:

  • С помощью веб-интерфейса Deckhouse.

    В разделе «Система» → «Управление системой» → «Deckhouse» → «Модули», откройте модуль user-authn, включите переключатель «Дополнительные настройки». Заполните необходимые поля формы на вкладке «Конфигурация», или укажите настройки модуля в формате YAML на вкладке «YAML», не включая секцию settings. Сохраните изменения.

    Пример:

    Интерфейс настройки модуля

    Вы также можете отредактировать объект ModuleConfig user-authn на вкладке «YAML» в окне настроек модуля («Система» → «Управление системой» → «Deckhouse» → «Модули», откройте модуль user-authn), указав версию схемы в параметре spec.version и необходимые параметры модуля в секции spec.settings.

  • С помощью Deckhouse CLI (d8) (требуется Deckhouse CLI (d8), настроенный на работу с кластером).

    Отредактируйте существующий ModuleConfig user-authn (подробнее о настройке Deckhouse читайте в документации), выполнив следующую команду:

    d8 k edit mc user-authn
    

    Внесите необходимые изменения в секцию spec.settings. При необходимости укажите версию схемы в параметре spec.version. Сохраните изменения.

    Вы также можете создать файл манифеста ModuleConfig user-authn, используя пример ниже. Заполните секцию spec.settings необходимыми параметрами модуля. При необходимости укажите версию схемы в параметре spec.version.

    Примените манифест с помощью следующей команды (укажите имя файла манифеста):

    d8 k apply -f <FILENAME>
    

    Пример файла манифеста ModuleConfig user-authn:

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

Конверсии

Модуль настраивается с помощью ресурса ModuleConfig, схема которого содержит номер версии. При применении в кластере старой версии схемы ModuleConfig выполняются автоматические преобразования. Чтобы обновить версию схемы ModuleConfig вручную, необходимо последовательно для каждой версии выполнить следующие действия :

  • Обновление из версии 1 в 2:

    Замените publishAPI.enable на publishAPI.enabled.

Параметры

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

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

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

      • 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: d8 k -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.passwordPolicy
      объект

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

      • settings.passwordPolicy.complexityLevel
        строка

        Уровень сложности пароля.

        В зависимости от уровня сложности к паролю предъявляются следующие минимальные требования:

        • None — 1 символ.
        • Low — 8 символов.
        • Fair — 8 символов, 1 заглавная буква (AZ), 1 строчная буква (az), 1 цифра.
        • Good — 8 символов, 1 заглавная буква (AZ), 1 строчная буква (az), 1 цифра, 1 специальный символ (!@#$%^&*).
        • Excellent — 8 символов, 1 заглавная буква (AZ), 1 строчная буква (az), 1 цифра, 1 специальный символ (!@#$%^&*), не более 2 одинаковых символов подряд.
        • Custom — требования задаются в поле custom.

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

        Допустимые значения: None, Low, Fair, Good, Excellent, Custom

      • settings.passwordPolicy.custom
        объект

        Пользовательские правила сложности пароля.

        Применяются только если complexityLevel равен Custom. Любое из правил ниже можно включать независимо.

        • settings.passwordPolicy.custom.capitalized
          булевый

          Если true, пароль должен содержать хотя бы одну заглавную букву (AZ).

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

        • settings.passwordPolicy.custom.minLength
          целочисленный

          Минимальное количество символов в пароле.

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

          Допустимые значения: 1 <= X

        • settings.passwordPolicy.custom.numbers
          булевый

          Если true, пароль должен содержать хотя бы одну цифру.

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

        • settings.passwordPolicy.custom.repeatedChars
          булевый

          Если true, пароль не должен содержать более 2 одинаковых символов подряд (то же правило, что применяется на уровне Excellent).

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

        • settings.passwordPolicy.custom.specialCharacters
          булевый

          Если true, пароль должен содержать хотя бы один специальный символ (любой символ, не являющийся буквой или цифрой).

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

      • settings.passwordPolicy.lockout
        объект

        Настройки временной блокировки пользователя при последовательных неуспешных попытках входа.

        • settings.passwordPolicy.lockout.applyToConnectors
          массив строк

          Типы внешних (нелокальных) провайдеров аутентификации, на которые дополнительно распространяется блокировка.

          Встроенный коннектор Local всегда подпадает под политику блокировки, когда секция настроена. Его состояние хранится в ресурсе Password, и явно перечислять его в этом списке не требуется.

          Для перечисленных внешних коннекторов счётчик неудачных попыток и состояние блокировки хранятся в ресурсе OfflineSessions соответствующего пользователя (один объект на пару (пользователь, коннектор)).

          Ручная разблокировка пользователя для всех типов выполняется через ресурс UserOperation.

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

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

        • settings.passwordPolicy.lockout.lockDuration
          строка

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

          Длительность временной блокировки. Задается в секундах, минутах, часах или днях: 10s, 5m, 1h, 3d.

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

        • settings.passwordPolicy.lockout.maxAttempts
          целочисленный

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

          Количество последовательных неуспешных попыток входа, после которых пользователь будет временно заблокирован.

      • settings.passwordPolicy.passwordHistoryLimit
        целочисленный

        Количество предыдущих паролей пользователя, которые сохраняются в истории для предотвращения их повторного использования.

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

        Допустимые значения: 0 <= X

      • settings.passwordPolicy.rotation
        объект

        Настройки ротации паролей.

        • settings.passwordPolicy.rotation.interval
          строка

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

          Интервал времени, после которого пароль необходимо изменить. Задается в секундах, минутах, часах или днях: 10s, 5m, 1h, 3d.

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

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

          Получить выпущенный сертификат можно следующей командой: d8 k -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.rateLimit
      объект

      Защита парольных эндпоинтов Dex от перебора.

      При включении для эндпоинтов POST /token и POST /auth/{connector}/login активируется ограничитель скорости запросов на основе алгоритма token bucket для каждого IP-адреса. IP-адрес клиента берётся из заголовка X-Real-IP, который устанавливается платформенным Ingress-контроллером.

      Ограничение применяется только к неуспешным попыткам аутентификации: токены, зарезервированные перед вызовом обработчика Dex, возвращаются обратно в бакет при успешном ответе (HTTP 2xx/3xx). Таким образом успешные логины и обновление refresh-токенов не расходуют квоту IP.

      Лимиты хранятся в памяти каждой реплики Dex. В HA-конфигурации эффективный лимит умножается на число реплик, что приемлемо как нижний рубеж защиты от перебора и дополняется блокировкой на уровне аккаунта.

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

        Включает ограничитель скорости запросов на парольных эндпоинтах Dex.

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

      • settings.rateLimit.perIP
        объект

        Параметры token bucket для каждого исходного IP-адреса.

        Оба параметра (requestsPerMinute и burst) учитывают только неуспешные попытки аутентификации.

        • settings.rateLimit.perIP.burst
          целочисленный

          Максимальный размер бакета, определяющий допустимое количество неуспешных попыток аутентификации с одного IP-адреса до начала ограничения.

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

          Допустимые значения: 1 <= X

        • settings.rateLimit.perIP.requestsPerMinute
          целочисленный

          Максимальная скорость неуспешных попыток аутентификации с одного IP-адреса (в попытках в минуту).

          Успешные логины и обновление refresh-токенов не учитываются.

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

          Допустимые значения: 1 <= X

    • settings.refreshTokenAbsoluteLifetime
      строка

      Максимальное время жизни refresh-токенов (соответствует настройке Dex expiry.refreshTokens.absoluteLifetime).

      Этот параметр управляет продолжительностью пользовательских сессий. По истечении этого периода пользователи должны будут пройти повторную аутентификацию, даже при наличии активных refresh-токенов.

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

      По умолчанию: 4380h

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

    • settings.staticUsers2FA
      объект
      • settings.staticUsers2FA.enabled
        булевый

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

        Если указано true, статические пользователи должны будут использовать двухфакторную аутентификацию (2FA) при входе в систему. Эта опция полезна для повышения безопасности, так как требует дополнительного шага проверки при авторизации.

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

      • settings.staticUsers2FA.issuerName
        строка

        Имя издателя для токенов двухфакторной аутентификации (2FA). Это имя отображается пользователям в приложении для 2FA (например, Google Authenticator). Используется для идентификации источника токенов и может быть настроено в соответствии с вашими предпочтениями.

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

    • 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, который включен по умолчанию.

Чтобы задать дополнительные лейблы и аннотации для подов dex-authenticator, используйте поле spec.podMetadata.

Пример (отключение инъекции Istio sidecar):

apiVersion: deckhouse.io/v1
kind: DexAuthenticator
metadata:
  name: app-name
  namespace: app-namespace
spec:
  applicationDomain: app-name.kube.my-domain.com
  applicationIngressClassName: nginx
  podMetadata:
    annotations:
      sidecar.istio.io/inject: "false"