Помимо внешних провайдеров аутентификации, DKP позволяет использовать локальную аутентификацию.

Локальная аутентификация обеспечивает проверку и управление доступом пользователей с возможностью настройки парольной политики, поддержкой двухфакторной аутентификации (2FA) и управлением группами. Реализация соответствует требованиям безопасности ФСТЭК и рекомендациям OWASP, обеспечивая надёжную защиту доступа к кластеру и приложениям без необходимости интеграции с внешними системами аутентификации.

Локальная аутентификация подразумевает создание в кластере объектов User и Group для статических пользователей и групп:

  • В объекте User хранится информация о пользователе, включая email и хеш пароля (пароль в явном виде не сохраняется).
  • В объекте Group задаётся список пользователей, объединённых в группу.

Создание статического пользователя

Для создания статического пользователя создайте ресурс User.

Пример создания ресурса (обратите внимание, что в приведенном примере указан ttl):

apiVersion: deckhouse.io/v1
kind: User
metadata:
  name: admin
spec:
  email: admin@yourcompany.com
  password: $2a$10$etblbZ9yfZaKgbvysf1qguW3WULdMnxwWFrkoKpRH1yeWa5etjjAa
  ttl: 24h

Придумайте пароль и укажите в поле password его bcrypt-хеш в исходном виде или закодированном в Base64. Чтобы получить bcrypt-хеш в Base64, выполните команду:

echo -n '<PASSWORD>' | htpasswd -BinC 10 "" | cut -d: -f2 | tr -d '\n' | base64 -w0; echo

Если команда htpasswd недоступна, установите соответствующий пакет в зависимости от дистрибутива:

  • apache2-utils — для дистрибутивов, основанных на Debian;
  • httpd-tools — для дистрибутивов, основанных на CentOS;
  • apache2-htpasswd — для ALT Linux.

Операции над локальным пользователем

Операции сброса пароля, сброса 2FA и блокировки пользователя выполняются через ресурс UserOperation. В поле initiatorType указывается, кто инициировал операцию: администратор (admin), система (system) или сам пользователь (self).

Административные операции

Для административных действий над локальными пользователями используйте команды d8 iam user. Они создают ресурс UserOperation с initiatorType: admin, дожидаются выполнения операции и выводят результат.

При выполнении операций ResetPassword, Reset2FA и Lock удаляются объекты Dex OfflineSessions и RefreshToken, принадлежащие пользователю. Это завершает активные offline-сессии пользователя и требует повторной аутентификации.

Примеры использования команд d8 iam user:

  • интерактивный сброс пароля:

    d8 iam user reset-password admin
    
  • сброс пароля с чтением нового из stdin:

    echo "N3wPa$$wo#d" | d8 iam user reset-password admin --password-stdin
    
  • сброс пароля с автоматической генерацией нового:

    d8 iam user reset-password admin --generate-password
    
  • сброс пароля в захешированном виде (если пароль захеширован, передайте bcrypt-хеш без кодирования в Base64):

    d8 iam user reset-password admin --password-hash '$2y$10$abcdef...'
    
  • сброс 2FA:

    d8 iam user reset2fa admin
    
  • блокировка пользователя на 30 минут:

    d8 iam user lock admin 30m
    
  • разблокировка пользователя:

    d8 iam user unlock admin
    

По умолчанию команды ожидают завершения операции. Чтобы только создать UserOperation и вывести его имя, используйте флаг --wait=false.

Сброс пароля пользователем

Локальный пользователь может самостоятельно сбросить свой пароль в интерфейсе аутентификации DKP. При этом создаётся ресурс UserOperation с типом ResetPassword и initiatorType: self.

Самостоятельный сброс пароля доступен только для локальных учётных записей (встроенный коннектор Local). Пользователи, которые входят через внешние провайдеры аутентификации, должны обращаться к администратору соответствующей системы.

При сбросе пароля:

  • новый пароль должен соответствовать парольной политике;
  • завершаются активные сессии пользователя — требуется повторная аутентификация.

Подробнее о сценариях смены и сброса пароля с точки зрения пользователя — в разделе Настройка аутентификации для приложений.

Добавление пользователя в группу

Запрещено использовать пользователей и группы с префиксом system:.
Аутентификация таких пользователей или участников этих групп будет отклонена, а в логах kube-apiserver появится соответствующее предупреждение.

Чтобы объединять статических пользователей в группы, создайте ресурс Group.

Пример создания ресурса:

apiVersion: deckhouse.io/v1alpha1
kind: Group
metadata:
  name: admins
spec:
  name: admins
  members:
    - kind: User
      name: admin

Здесь members — список пользователей, которые входят в группу.

После создания группы и добавления в неё пользователей, необходимо настроить авторизацию.

Настройка парольной политики

Парольная политика позволяет контролировать сложность пароля, ротацию и блокировку пользователей.

Для настройки парольной политики используйте поле passwordPolicy в конфигурации модуля user-authn:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: user-authn
spec:
  version: 2
  enabled: true
  settings:
    passwordPolicy:
      complexityLevel: Fair
      passwordHistoryLimit: 10
      lockout:
        lockDuration: 15m
        maxAttempts: 3
      rotation:
        interval: "30d"

Описание полей:

  • complexityLevel — уровень сложности пароля;
  • passwordHistoryLimit — число предыдущих паролей, которые хранит система, чтобы предотвратить их повторное использование;
  • lockout — настройки блокировки при превышении лимита неудачных попыток входа:
    • lockout.maxAttempts — лимит неудачных попыток;
    • lockout.lockDuration — длительность блокировки пользователя;
  • rotation — настройки ротации паролей:
    • rotation.interval — период обязательной смены пароля.

Настройка двухфакторной аутентификации (2FA)

2FA позволяет повысить уровень безопасности, требуя ввести код из приложения-аутентификатора TOTP (например, Google Authenticator) при входе.

Для настройки 2FA используйте поле staticUsers2FA в конфигурации модуля user-authn:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: user-authn
spec:
  version: 2
  enabled: true
  settings:
    staticUsers2FA:
      enabled: true
      issuerName: "awesome-app"

Описание полей:

  • enabled — включает или отключает 2FA для всех статических пользователей;
  • issuerName — имя, которое будет отображаться в приложении-аутентификаторе при добавлении аккаунта.

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

Дополнительные ресурсы