Метод аутентификации userpass позволяет пользователям проходить аутентификацию в Deckhouse Stronghold с помощью имени пользователя и пароля.
Особенности метода
При использовании метода userpass учитывайте следующие особенности:
- Имена пользователей и пароли задаются непосредственно в методе аутентификации по пути
auth/userpass/users/. - Метод
userpassне может считывать имена пользователей и пароли из внешнего источника. - Введённые имена пользователей приводятся в нижний регистр. Например,
Maryиmary— это равноценные записи.
Настройка
Чтобы пользователи могли проходить аутентификацию, настройте метод userpass.
Обычно эти действия выполняет оператор или система управления конфигурацией.
Для настройки аутентификации с помощью метода userpass выполните следующие шаги:
Включите метод аутентификации
userpass:- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold auth enable userpassstronghold auth enable userpassМетод будет включён по пути
auth/userpass.Чтобы включить метод по другому пути, используйте флаг
-path:- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold auth enable -path=<MOUNT_PATH> userpassstronghold auth enable -path=<MOUNT_PATH> userpassГде
<MOUNT_PATH>— путь, по которому нужно включить метод, напримерmy-userpass.Создайте пользователя (если необходимо), которому разрешена аутентификация:
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold write auth/<MOUNT_PATH>/users/alice password=Pass-123! token_policies=adminsstronghold write auth/<MOUNT_PATH>/users/alice password=Pass-123! token_policies=admins
В результате будет создан пользователь alice с паролем Pass-123! и политикой admins.
Аутентификация пользователя с помощью метода userpass
Пример команды для аутентификации пользователя с помощью метода userpass:
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold login -method=userpass username=alice password="Pass-123!"stronghold login -method=userpass username=alice password="Pass-123!"Блокировка пользователя
Если пользователь несколько раз подряд укажет неверные учётные данные, Stronghold на некоторое время прекратит проверять их и вернёт ошибку с отказом в доступе.
Такое поведение называется блокировкой пользователя (user_lockout).
Время, на которое пользователь блокируется, называется длительностью блокировки (lockout_duration).
После истечения этого времени пользователь сможет снова войти в систему.
Количество неудачных попыток входа, после которых пользователь блокируется, называется порогом блокировки (lockout_threshold).
Счётчик порога блокировки сбрасывается через несколько минут без попыток входа или после успешного входа.
Интервал, после которого счётчик сбрасывается при отсутствии попыток входа, называется сбросом счётчика блокировки (lockout_counter_reset).
Блокировка пользователя помогает снизить риск атак с подбором пароля.
Функция блокировки пользователя включена по умолчанию. Значения по умолчанию:
lockout_threshold— 5 попыток;lockout_duration— 15 минут;lockout_counter_reset— 15 минут.
Функцию блокировки пользователя можно отключить с помощью команды auth tune, передав параметру disable_lockout значение true:
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold auth tune -user-lockout-disable=true userpassstronghold auth tune -user-lockout-disable=true userpassФункция блокировки пользователя поддерживается только методами аутентификации userpass, ldap и approle.
Смена собственного пароля пользователя
Пользователю можно разрешить менять с помощью метода userpass только собственный пароль.
Для этого создайте политику, в которой путь к паролю текущего пользователя формируется на основе имени аутентифицированного пользователя.
Создание политики
Используйте шаблон политики:
path "auth/userpass/users/{{identity.entity.aliases.<ACCESSOR>.name}}/password" {
capabilities = ["update"]
}Значение <ACCESSOR> получите с помощью команды:
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold read -field=accessor sys/auth/userpassstronghold read -field=accessor sys/auth/userpassШаблон {{identity.entity.aliases.<ACCESSOR>.name}} автоматически подставляет имя аутентифицированного пользователя.
Поэтому путь всегда указывает только на пароль текущего пользователя.
Шаблон работает после аутентификации пользователя через метод userpass.
Разрешение смены собственного пароля для пользователя
Чтобы разрешить пользователю менять собственный пароль с помощью метода userpass, выполните следующие шаги:
- Если метод userpass уже включён
- Если метод userpass не включён
Получите уникальный идентификатор метода:
- Stronghold в Deckhouse Platform
- Stronghold в Linux
ACCESSOR=$(d8 stronghold read -field=accessor sys/auth/userpass)ACCESSOR=$(stronghold read -field=accessor sys/auth/userpass)Создайте политику, позволяющую пользователю, аутентифицированному через
userpass, менять свой пароль:- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold policy write self-change-password - <<EOF path "auth/userpass/users/{{identity.entity.aliases.${ACCESSOR}.name}}/password" { capabilities = ["update"] } EOFstronghold policy write self-change-password - <<EOF path "auth/userpass/users/{{identity.entity.aliases.${ACCESSOR}.name}}/password" { capabilities = ["update"] } EOFПривяжите политику к пользователю, которому нужно разрешить менять свой пароль:
- Если пользователь существует
- Если пользователя не существует
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold write auth/userpass/users/alice/policies token_policies="self-change-password"stronghold write auth/userpass/users/alice/policies token_policies="self-change-password"Этот пример привяжет политику self-change-password к существующему пользователю alice
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold write auth/userpass/users/alice password="OldPass-123!" token_policies="self-change-password"stronghold write auth/userpass/users/alice password="OldPass-123!" token_policies="self-change-password"Этот пример создаст пользователя alice, разрешит ему аутентификацию через userpass и привяжет к нему политику self-change-password.
Включите метод
userpass:- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold auth enable userpassstronghold auth enable userpassПолучите уникальный идентификатор метода:
- Stronghold в Deckhouse Platform
- Stronghold в Linux
ACCESSOR=$(d8 stronghold read -field=accessor sys/auth/userpass)ACCESSOR=$(stronghold read -field=accessor sys/auth/userpass)Создайте политику, позволяющую пользователю, аутентифицированному через
userpass, менять свой пароль:- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold policy write self-change-password - <<EOF path "auth/userpass/users/{{identity.entity.aliases.${ACCESSOR}.name}}/password" { capabilities = ["update"] } EOFstronghold policy write self-change-password - <<EOF path "auth/userpass/users/{{identity.entity.aliases.${ACCESSOR}.name}}/password" { capabilities = ["update"] } EOFПривяжите политику к пользователю, которому нужно разрешить менять свой пароль:
- Если пользователь существует
- Если пользователя не существует
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold write auth/userpass/users/alice/policies token_policies="self-change-password"stronghold write auth/userpass/users/alice/policies token_policies="self-change-password"Этот пример привяжет политику self-change-password к существующему пользователю alice
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold write auth/userpass/users/alice password="OldPass-123!" token_policies="self-change-password"stronghold write auth/userpass/users/alice password="OldPass-123!" token_policies="self-change-password"Этот пример создаст пользователя alice, разрешит ему аутентификацию через userpass и привяжет к нему политику self-change-password.
Смена пароля пользователем
После аутентификации пользователь может изменить свой пароль, если для него это разрешено.
Пример команды для смены пользователем своего пароля:
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold write auth/userpass/users/alice/password password="NewPass-456!"stronghold write auth/userpass/users/alice/password password="NewPass-456!"Если пользователь попытается изменить чужой пароль, Stronghold вернёт ошибку permission denied.
При указании пользователем неверных учётных данных при смене пароля возможна его блокировка.
Политика паролей по умолчанию
Если для метода userpass не назначена пользовательская политика паролей, при создании пользователя или смене пароля пользователя Stronghold использует политику по умолчанию.
Политика по умолчанию для метода userpass требует:
8символов в пароле;- минимум одну прописную букву;
- минимум одну строчную букву;
- минимум одну цифру;
- минимум один специальный символ из набора
!@#$%^&*()-_=+[]{}|;:,.<>/?.
Политика по умолчанию не ограничивает срок жизни пароля (password_max_age_days = 0) и не проверяет историю паролей (password_history_depth = 0).
Чтобы для метода userpass вместо политики паролей по умолчанию использовать пользовательскую политику, выполните команду (вместо policy_name укажите название нужной политики):
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold write auth/userpass/password-policy/{policy_name}stronghold write auth/userpass/password-policy/{policy_name}Истечение срока действия пароля
Метод userpass позволяет ограничить срок жизни паролей.
Срок настраивается в политике паролей, назначенной методу (или в политике по умолчанию, если политика не назначена), с помощью следующих ключей:
| Ключ | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
password_max_age_days | int | 0 | Количество дней, в течение которых пароль действителен. 0 отключает истечение срока. Допустимые значения: 0-3650 |
password_expiry_warning_days | int | 3 | За сколько дней до истечения срока успешный вход начинает возвращать предупреждение. 0 отключает предупреждения. Значение не может быть отрицательным |
Пример политики со сроком жизни пароля 90 дней и предупреждением за 14 дней:
length = 12
password_max_age_days = 90
password_expiry_warning_days = 14
rule "charset" {
charset = "abcdefghijklmnopqrstuvwxyz"
min-chars = 1
}
rule "charset" {
charset = "0123456789"
min-chars = 1
}Возраст пароля отсчитывается от момента его последней установки: при создании пользователя, при смене пароля через users/<USERNAME> или users/<USERNAME>/password, а также через login/<USERNAME>/change-password.
Для пользователей, пароли которых были заданы до появления учёта времени установки, это время неизвестно.
Такие пароли отсчитываются от опорной точки (epoch), которую Stronghold записывает для точки монтирования в момент включения истечения срока.
Таким образом, включение истечения срока не делает существующие пароли просроченными немедленно.
Опорная точка записывается периодической проверкой (примерно в течение минуты после изменения политики) и удаляется при отключении истечения срока.
Пока опорная точка не записана, такие пароли считаются действительными.
Поведение метода при включённом истечении срока:
- Если срок действия пароля истёк, запрос на вход отклоняется с ошибкой
permission denied. Сообщение об ошибке содержит дату истечения и подсказку использоватьlogin/<USERNAME>/change-password. Срок проверяется только после проверки самого пароля, поэтому сообщение не раскрывает, существует ли пользователь. Попытка входа с просроченным паролем не считается неудачной и не учитывается в блокировке пользователя. - Если срок действия пароля скоро истечёт (до даты истечения осталось не более
password_expiry_warning_daysдней), успешный вход возвращает предупреждение с датой истечения в полеwarningsответа. - Продление (renew) токена отклоняется, если к этому моменту срок действия пароля пользователя истёк.
- Чтение
auth/<MOUNT_PATH>/users/<USERNAME>дополнительно возвращает поляpassword_set_timeиpassword_expires_at(формат RFC 3339). Они пусты, если время установки неизвестно или истечение срока отключено.
Чтение настроек истечения срока
Чтобы получить настройки истечения срока, действующие для точки монтирования, используйте метод GET для auth/<MOUNT_PATH>/password-expiry.
Для запроса нужен токен с соответствующей политикой доступа.
Ответ содержит поля:
max_age_days— срок жизни пароля в днях,0, если истечение срока отключено;warning_days— за сколько дней до истечения срока начинаются предупреждения;epoch— опорная точка в формате RFC 3339 или пустая строка, если она не записана.
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold read auth/userpass/password-expirystronghold read auth/userpass/password-expiryСмена пароля по текущему паролю
Эндпоинт login/<USERNAME>/change-password позволяет пользователю сменить собственный пароль без токена, указав текущий пароль.
Он работает и тогда, когда срок действия текущего пароля истёк и войти в систему и получить токен невозможно.
Запрос: POST auth/<MOUNT_PATH>/login/<USERNAME>/change-password.
Параметры:
current_password(string, обязательный) — текущий пароль пользователя.new_password(string, обязательный) — новый пароль. Он проверяется на соответствие политике паролей, назначенной методу, включая историю паролей (password_history_depth).
- Stronghold в Deckhouse Platform
- Stronghold в Linux
d8 stronghold write auth/userpass/login/alice/change-password current_password="OldPass-123!" new_password="NewPass-456!"stronghold write auth/userpass/login/alice/change-password current_password="OldPass-123!" new_password="NewPass-456!"Особенности эндпоинта:
- Эндпоинт не требует аутентификации (находится под префиксом
login/), поэтому политика доступа не нужна. Токен в ответ не выдаётся: при успехе возвращается пустой ответ. - Если параметр
current_passwordилиnew_passwordне указан либо новый пароль не соответствует требованиям политики, запрос завершается ошибкой400. - Если текущий пароль неверен или пользователь не существует, возвращается одна и та же ошибка
invalid username or password. Для существующего пользователя неудачная попытка учитывается в пороге блокировки пользователя так же, как неудачный вход. Заблокированный пользователь не может сменить пароль этим эндпоинтом до окончания блокировки. - Если для пользователя задан
token_bound_cidrs, запрос принимается только с разрешённых адресов. - Многофакторная аутентификация (MFA) входа к этому эндпоинту не применяется, так как токен не выдаётся.
- Успешная смена обновляет время установки пароля, и отсчёт срока его действия начинается заново.