Парольные политики#
Парольные политики — это набор правил, регулирующих создание, использование и проверку паролей. Механизм проверки паролей реализуется с помощью утилит или самой системой.
Основные функции механизма:
расширение функциональности авторизации и смены пароля пользователя в части проверки пароля;
создание транспортного (временного) пароля;
хранение истории паролей роли;
сбор и хранение статистической информации о пароле роли;
назначение роли парольной политики;
управление парольной политикой:
создание, удаление и изменение политики;
активация и деактивация политики;
создание, удаление и изменение алгоритма проверки пароля.
Настройка#
Настройки механизма хранятся в файле конфигурации и таблице pg_pp_policy (в приоритете заполненные параметры в таблице). В зависимости от типа конфигурации сервера, парольные политики хранятся в различных файлах:
для standalone-конфигурации — в файле
$PGDATA/postgresql.conf;для кластерной конфигурации — в файле
/etc/pangolin-manager/postgres.yml.
Подробнее о параметрах в подразделе «Конфигурационные параметры» данного раздела.
Политики не имеют имени, поэтому отображается идентификатор (roloid) соответствующей роли (см. раздел «Таблицы»).
Внимание
При подключении через Pangolin Pooler с включенной сквозной аутентификацией проверка пароля выполняется только при первом подключении, что ограничивает политику по срокам действия пароля и количеству подключений.
Внимание
При активированной защите от привилегированных пользователей параметры политик могут храниться в HashiCorp Vault. Подробнее ознакомиться с решением HashiCorp Vault можно в разделе «Прозрачное шифрование».
Зависимости#
Для работы механизма необходимы:
библиотека OpenSSL;
утилита проверки сложности пароля
zxcvbn.
Примечание:
Указанное ПО включено в дистрибутив СУБД Pangolin.
Основные параметры#
Параметр |
Описание |
|---|---|
|
Включает ( |
|
Включает ( Если включить параметр |
|
Управляет шифрованием пароля при передаче от клиента к базе данных. В случае, если шифрование отключено ( |
Внимание
Изменение параметра password_policies_enable требует перезагрузки сервера (restart) для применения изменений.
Обязательные настройки парольной политики#
Обязательные настройки хранятся в таблице pg_pp_policy. Все настройки для парольной политики имеют аналог в конфигурационном файле, это необходимо для возможности задания значений по умолчанию при создании пользователя (см. подраздел «Конфигурационные параметры»). Приоритетными считаются значения в таблице pg_pp_policy (подробнее в разделе «Вычислении значений настроек для парольной политики пользователя»).
Функциональность |
Обязательный параметр |
Зависимые параметры |
|---|---|---|
Хранение паролей |
Один из: |
- |
Изменение пароля |
|
- |
Синтаксическая проверка пароля |
|
|
Проверка вхождения пароля в черный список |
|
- |
Проверка пароля библиотекой |
|
|
Пользовательская PSQL функция проверки пароля |
|
- |
Аутентификация |
|
- |
Конфигурационные параметры#
В данном разделе более подробно описаны параметры файла postgresql.conf/postgres.yml и их значения по умолчанию.
Параметр |
Описание |
Тип |
POSIX шаблон |
Значение по умолчанию |
Аналог в pg_pp_policy |
|---|---|---|---|---|---|
|
Включение/выключение парольной политики |
|
|
|
|
|
Включение/выключение использования настроек из |
|
|
|
- |
|
Шифрование пароля при передаче от клиента к БД |
|
|
- |
- |
|
Включение механизма исключения повторных попыток подключения psql |
|
|
|
- |
|
Разрешить задание пароля в виде хеша |
|
|
|
- |
Настройка хранения паролей#
Параметр |
Описание |
Тип |
POSIX шаблон |
Ограничение значения |
Значение по умолчанию |
Специальные значения параметров |
Аналог в pg_pp_policy |
|---|---|---|---|---|---|---|---|
|
Время в секундах, в течение которого старый пароль сохраняется, и попытка сменить пароль на совпадающий со старым заканчивается ошибкой |
|
|
неотрицательное |
|
- |
|
|
Максимальное количество сохраненных старых паролей |
|
[0-1000] |
0-1000 |
|
|
|
Примечание
Если задан параметр password_policy.reuse_time, то параметр password_policy.in_history не используется.
Время жизни пароля#
Параметр |
Описание |
Тип |
POSIX шаблон |
Ограничение значения |
Значение по умолчанию |
Специальные значения параметров |
Аналог в pg_pp_policy |
|---|---|---|---|---|---|---|---|
|
Время жизни пароля в секундах |
|
|
неотрицательное |
|
|
|
|
Минимальное время между изменениями пароля |
|
|
неотрицательное |
|
|
|
|
Максимальное количество аутентификаций после истечения срока действия пароля |
|
[0-1000] |
0-1000 |
|
- |
|
|
Время, в течение которого пароль остается рабочим после окончания срока его действия |
|
|
неотрицательное |
|
|
|
|
Время до истечения пароля, при котором выводится предупреждение |
|
|
неотрицательное |
|
|
|
Поведение при неудачной аутентификации#
Параметр |
Описание |
Тип |
POSIX шаблон |
Ограничение значения |
Значение по умолчанию |
Специальные значения параметров |
Аналог в pg_pp_policy |
|---|---|---|---|---|---|---|---|
|
Блокировка аккаунта при достижении максимума неверных попыток аутентификации |
|
|
|
|
- |
|
|
Максимальное количество неверных попыток аутентификации |
|
[1-1000] |
1-1000 |
|
- |
|
|
Время, после которого количество неверных попыток сбрасывается |
|
|
>= 0 |
|
|
|
|
Время блокировки аккаунта |
|
|
неотрицательное |
24 hours |
|
|
Синтаксические проверки пароля#
Параметр |
Описание |
Тип |
Ограничение значения |
Значение по умолчанию |
Специальные значения параметров |
Аналог в pg_pp_policy |
|---|---|---|---|---|---|---|
|
Включение синтаксической проверки пароля |
|
|
|
– |
|
|
Минимальное количество цифр в пароле |
|
0-1000 |
|
|
|
|
Минимальная длина пароля |
|
0-1000 |
|
|
|
|
Минимальное количество букв в пароле |
|
0-1000 |
|
|
|
|
Минимальное количество специальных символов |
|
0-1000 |
|
|
|
|
Минимальное количество прописных букв |
|
0-1000 |
|
|
|
|
Минимальное количество строчных букв |
|
0-1000 |
|
|
|
|
Максимальное количество повторяющихся символов |
|
0-1000 |
|
|
|
Проверка максимального времени неактивности пользователя#
Параметр |
Описание |
Тип |
Ограничение значения |
Значение по умолчанию |
Специальные значения параметров |
Аналог в pg_pp_policy |
|---|---|---|---|---|---|---|
|
Запоминать ли время последней аутентификации |
|
|
|
– |
|
|
Время последней аутентификации, после которого аккаунт блокируется |
|
неотрицательное |
|
|
|
Использование библиотеки zxcvbn#
Параметр |
Описание |
Тип |
POSIX шаблон |
Ограничение значения |
Значение по умолчанию |
Аналог в pg_pp_policy |
|---|---|---|---|---|---|---|
|
Включение использования библиотеки |
|
|
|
|
|
|
Минимальная оценка сложности пароля |
|
[0-4] |
0-4 |
|
|
Использование пользовательской функции проверки пароля#
Параметр |
Описание |
Тип |
POSIX шаблон |
Значение по умолчанию |
Аналог в pg_pp_policy |
|---|---|---|---|---|---|
|
Пользовательская функция проверки пароля |
|
|
- |
|
Проверка вхождения пароля в черный список#
Параметр |
Описание |
Тип |
Ограничение значения |
Значение по умолчанию |
Аналог в pg_pp_policy |
|---|---|---|---|---|---|
|
Проверка, что пароль не входит в список часто используемых |
|
|
|
|
Настройка кеширования#
Параметр |
Описание |
Тип |
POSIX шаблон |
Ограничение значения |
Значение по умолчанию |
Аналог в pg_pp_policy |
|---|---|---|---|---|---|---|
|
Интервал сохранения данных кеша на диск |
|
|
|
|
- |
|
Размер инициализированного кеша парольных политик |
|
|
|
|
- |
|
Предполагаемый максимальный размер кеша |
|
|
|
|
- |
|
Ограничение сверху на размер кеша |
|
|
|
|
- |
Параметры управления транспортными паролями#
Параметр |
Описание |
Тип |
Значение по умолчанию |
Аналог в pg_pp_policy |
|---|---|---|---|---|
|
При значении |
|
|
- |
|
Определяет время жизни транспортного пароля |
|
|
|
|
Определяет тип пароля (транспортный или нет) для указанных ТУЗ |
|
|
- |
Таблицы#
В механизме управления парольной политикой используются таблицы pg_pp_history, pg_pp_password, pg_pp_policy.
Примечание
Сокращения, используемые в таблицах для столбца «Характеристика»:
P – primary key;
F – foreign key;
U – unique;
N – not null.
pg_pp_history#
Таблица ранее использованных паролей pg_pp_history:
Название колонки |
Тип |
Характеристика |
Примечание |
|---|---|---|---|
|
|
P, N |
Идентификатор роли |
|
|
N |
Время последнего успешного входа в систему с использованием этого пароля |
|
|
N |
Время создания пароля |
|
|
P, N |
Время перемещения пароля в таблицу |
|
|
P, N |
Хеш пароля |
pg_pp_password#
Таблица с информацией о текущем пароле pg_pp_password:
Название колонки |
Тип |
Характеристика |
Описание |
|---|---|---|---|
|
|
P, U, N |
Идентификатор роли |
|
|
- |
Количество попыток входа (подряд) с использованием неверного пароля |
|
|
- |
Счетчик удачных аутентификаций после истечения времени жизни пароля |
|
|
N |
Метка времени последней неудачной аутентификации |
|
|
N |
Время последнего успешного входа в систему с использованием этого пароля |
|
|
N |
Время создания текущего пароля |
|
|
- |
Время разблокировки, если роль была заблокирована в связи с неактивностью |
|
|
- |
Является ли данный пароль транспортным |
pg_pp_policy#
Таблица парольных политик pg_pp_policy:
Название колонки |
Тип |
Характеристика |
Описание |
Отключаемая функциональность, если значение не задано |
|---|---|---|---|---|
|
|
P, U, N |
Идентификатор роли |
- |
|
|
- |
Время, в течение которого старый пароль сохраняется, и попытка сменить пароль на совпадающий со старым заканчивается ошибкой |
Изменение пароля, если не задано |
|
|
- |
Максимальное количество сохраненных старых паролей. При достижении максимума добавление еще одного старого пароля приводит к удалению наиболее старого (по |
Изменение пароля, если не задано |
|
|
- |
Время жизни пароля, после которого пароль считается истекшим |
Аутентификация |
|
|
- |
Время, которое должно пройти между двумя изменениями пароля |
Изменение пароля |
|
|
- |
Максимальное количество аутентификаций, доступных роли после истечения времени жизни пароля |
Аутентификация, если пароль просрочен |
|
|
- |
Время после окончания действия пароля, в течение которого он продолжает работать |
Аутентификация, если пароль просрочен |
|
|
- |
Время до окончания действия пароля, в течении которого пользователю будет отображаться предупреждение. Предупреждение отображается в консоли PSQL после аутентификации или после коммита |
- |
|
|
- |
Признак включенного правила блока аккаунта в результате достижения максимума попыток входа с неверным паролем |
Аутентификация |
|
|
- |
Время, на которое блокируется аккаунт в результате достижения максимума попыток входа с неверным паролем |
Аутентификация, если |
|
|
- |
Максимальное количество подряд введенных неверных паролей, при достижении которого вызывается блокировка пароля |
Аутентификация, если |
|
|
- |
Время, после которого обнуляется количество неверных вводов пароля |
Аутентификация, если |
|
|
- |
Признак включенных правил синтаксической проверки пароля (если она возможна) |
Изменение пароля |
|
|
- |
Минимальная длина пароля |
Изменение пароля, если |
|
|
- |
Признак включенного правила проверки пароля по списку часто используемых |
Изменение пароля |
|
|
- |
Минимальное количество цифр в пароле |
Изменение пароля, если |
|
|
- |
Минимальное количество букв в пароле |
Изменение пароля, если |
|
|
- |
Минимальное количество символов в пароле, не являющихся буквой или цифрой |
Изменение пароля, если |
|
|
- |
Минимальное количество прописных букв |
Изменение пароля, если |
|
integer |
- |
Минимальное количество строчных букв |
Изменение пароля, если |
|
|
- |
Максимальное количество повторяющихся символов |
Изменение пароля, если |
|
|
- |
Признак включенной политики |
- |
|
|
- |
Запоминать ли время последней аутентификации |
Аутентификация |
|
|
- |
Время после последней аутентификации, после которого роль будет заблокирована |
Аутентификация, если |
|
|
- |
Использовать библиотеку |
Изменение пароля |
|
|
- |
Минимальная допустимая сложность пароля |
Изменение пароля, если |
|
|
- |
Название пользовательской функции проверки пароля |
Изменение пароля |
|
|
- |
Время жизни транспортного пароля |
- |
|
|
- |
Время после истечения пароля (до блокировки), с возможностью продолжения пользования системой |
- |
Представления#
pp_password_detailed— для мониторинга состояния ролей;pp_password— для просмотра кеша парольных политик.
Примечание:
В случае обращения к выводу
viewпри отключенных парольных политиках (password_policies_enable = 'off') вернется пустая таблица, а также будет выведено предупреждение (WARNING).
pp_password_detailed#
Представление для мониторинга состояния ролей.
Название поля |
Описание |
Пример вывода |
Источник |
|---|---|---|---|
|
ID пользователя |
|
Данные пользователя, хранящиеся в кеше |
|
Счетчик неудачных аутентификаций |
|
Данные пользователя, хранящиеся в кеше |
|
Метка времени последней неудачной аутентификации |
|
Данные пользователя, хранящиеся в кеше |
|
Счетчик входов после истечения времени жизни пароля |
|
Данные пользователя, хранящиеся в кеше |
|
Метка времени последней удачной аутентификации |
Данные пользователя, хранящиеся в кеше |
|
|
Метка времени создания пароля |
|
Данные пользователя, хранящиеся в таблице |
|
Метка времени разблокировки |
Данные пользователя, хранящиеся в кеше |
|
|
Является ли данный пароль транспортным |
|
|
|
Доступна ли аутентификация |
|
|
|
Заблокирован ли пользователь |
|
|
|
Проверка значений политики для проверки времени жизни пароля |
|
Результат функций проверки политик перед самой проверкой. Сначала проверяется, что все необходимые политики заданы (не |
|
Проверка значений политики для проверки времени жизни пароля (текстовый вывод) |
|
Результат функций проверки политик перед непосредственно проверкой |
|
Проверка значений политики для блокировки по количеству неудачных аутентификаций |
|
Результат функций проверки политик перед непосредственно проверкой |
|
Проверка значений политики для блокировки по количеству неудачных аутентификаций (текстовый вывод) |
|
Результат функций проверки политик перед непосредственно проверкой |
|
Проверка значений политики для проверки блока по времени неактивности |
|
Результат функций проверки политик перед непосредственно проверкой |
|
Проверка значений политики для проверки блока по времени неактивности (текстовый вывод) |
|
Результат функций проверки политик перед непосредственно проверкой |
|
Проверка значений политики для проверки нового пароля |
|
Результат функций проверки политик перед непосредственно проверкой |
|
Проверка значений политики для проверки нового пароля (текстовый вывод) |
|
Результат функций проверки политик перед непосредственно проверкой |
|
Проверка блока по количеству неудачных аутентификаций |
|
Результат проверок аутентификации (что увидит пользователь, если попробует войти с правильными данными аутентификации) |
|
Проверка блока по количеству неудачных аутентификаций (текстовый вывод) |
|
Результат проверок аутентификации |
|
Проверка блока по неактивности |
|
Результат проверок аутентификации |
|
Проверка блока по неактивности (текстовый вывод) |
|
Результат проверок аутентификации |
|
Проверка блока по времени жизни пароля |
|
Результат проверок аутентификации |
|
Проверка блока по времени жизни пароля (текстовый вывод) |
|
Результат проверок аутентификации |
|
Проверка значений политики для проверки транспортного пароля |
|
Результат проверки транспортного пароля |
|
Проверка значений политики для проверки транспортного пароля (текстовый вывод) |
|
Результат проверки транспортного пароля |
|
Проверка времени жизни транспортного пароля |
|
Результат проверки транспортного пароля |
|
Проверка времени жизни транспортного пароля (текстовый вывод) |
|
Результат проверки транспортного пароля |
pp_password#
Представление для просмотра кеша парольных политик.
Название поля |
Описание |
Пример вывода |
Источник |
|---|---|---|---|
|
ID пользователя |
|
Данные пользователя, хранящиеся в кеше |
|
Счетчик неудачных аутентификаций |
|
Данные пользователя, хранящиеся в кеше |
|
Временная метка последней неудачной аутентификации |
|
Данные пользователя, хранящиеся в кеше |
|
Счетчик входов после истечения времени жизни пароля |
|
Данные пользователя, хранящиеся в кеше |
|
Временная метка последней удачной аутентификации |
Данные пользователя, хранящиеся в кеше |
|
|
Метка времени создания пароля |
|
Данные пользователя, хранящиеся в таблице |
|
Метка времени разблокировки |
Данные пользователя, хранящиеся в кеше |
|
|
Является ли данный пароль транспортным |
|
Данные пользователя, хранящиеся в таблице |
Функции#
Управление парольными политиками осуществляется соответствующими функциями:
set_role_policies- создание парольной политики;enable_policy- активация парольной политики;disable_policy- деактивация парольной политики;recognize_password_policy- отображение парольных политик, примененных к роли;select_all_password_policies- отображение всех активных политик;unblock_role- разблокировка роли.
Описание функций рассмотрено в документе «Список PL/SQL функций продукта», раздел «Парольные политики» (документ доступен в личном кабинете).
Транспортный пароль#
Транспортный (временный) пароль нужен для аутентификации пользователя с ограничениями на все действия, кроме:
смены своего пароля;
чтения из таблиц, расположенных в схемах
pg_catalogиinformation_schema;вызовов функций, расположенных в
pg_catalogиinformation_schema;использования
SET;использования
SET ROLE TO none;использования
SET SESSION AUTHORIZATION;использования
SHOW;использования
LISTEN/UNLISTEN;использования
PREPARE/EXECUTE.
Когда администратор меняет пароль пользователю, новый пароль автоматически отмечается как транспортный. При авторизации с транспортным паролем для снятия ограничений пользователь должен сменить пароль на постоянный (команда ALTER ROLE/USER ... WITH PASSWORD), при этом соединение должно быть открыто именно тем пользователем, которому меняется пароль. Такое условие нужно для того, чтобы суперпользователь не смог сменить пароль другому пользователю с транспортного на постоянный, переключившись на другого пользователя с помощью SET SESSION AUTHORIZATION или SET ROLE. При попытке любого другого действия выводится сообщение о запрете по причине авторизации с транспортным паролем. В таком случае необходимо сменить пароль на постоянный.
Схема блокировки запроса с транспортным паролем:

Пароль отмечается как транспортный или явным указанием при его задании, или автоматически при смене пароля другим пользователем. Возможность автоматической отметки определяется параметром (password_policy.transport_password_mark_automatic) конфигурации сервера БД.
Действие по смене пароля с транспортного на постоянный попадает в лог аудита независимо от его настроек.
Управление#
Создание парольной политики пользователя#
Создание парольной политики для пользователя происходит с помощью выполнения PL/pgSQL функции set_role_policies. При этом настройки не будут применены без их активации с помощью функции enable_policy.
Примечание
Создание и активацию настроек парольной политики можно осуществить одним запросом. Для этого при создании парольной политики для пользователя нужно указать параметр policy_enable(1::boolean). В таком случае новые параметры парольной политики начнут действовать сразу.
Пример создания парольной политики:
Создайте пользователя:
CREATE USER username_3 WITH ENCRYPTED PASSWORD <password>Вывод:
CREATE ROLEСоздайте парольную политику для пользователя:
Пример запроса:
SELECT * FROM set_role_policies('username_2', check_syntax(1::boolean), min_length(12), alpha_numeric(3), min_special_chars(2), min_uppercase(2), policy_enable(1::boolean));Вывод:
-[ RECORD 1 ]---------------------+------- roleid | username_2 reuse_time | in_history | max_age | min_age | grace_login_limit | grace_login_time_limit | expire_warning | lockout | lockout_duration | max_failure | failure_count_interval | check_syntax | t min_length | 12 illegal_values | alpha_numeric | 3 min_alpha_chars | min_special_chars | 2 min_uppercase | 2 min_lowercase | max_rpt_chars | policy_enable | t track_login | max_inactivity | use_password_strength_estimator | password_strength_estimator_score | custom_function | transport_password_life_time |
Проверить успешность применение заданной политики для пользователя можно с помощью функции recognize_password_policy, либо протестировать с помощью процесса замены пароля.
Вычисление значений настроек для парольной политики пользователя#
Алгоритм вычисления парольной политики пользователя сводится к заполнению всех полей таблицы pg_pp_policy, за исключением поля roloid:
Из таблицы
pg_pp_policyсобираются все заданные настройки для конкретного пользователя (значение неNULL) по идентификатору.Ищутся все роли, в которые входит данный пользователь.
Примечание:
Чтобы пользователь мог наследовать политики у родителей, он должен иметь настройку
INHERIT.Для каждой найденной роли по идентификатору роли из таблицы
pg_pp_policyвыбираются настройки по условию:настройка не была выбрана на шаге 1;
значение настройки не
NULL.
Примечание:
Исключение — все заданные значения параметра
customfunctionсохраняются в исходном порядке, формируя список функций на выполнение. Соответствующие функции будут последовательно применены в указанном параметре.Если на шаге 3 для одной настройки было найдено несколько значений, то выбирается наиболее строгое ограничение. Ниже указаны параметры и способ определения строгости значения (от менее к более строгому):
reusetime;inhistory;minage;expirewarning;lockoutduration;failurecountinterval;minlength;alphanumeric;minalphachars;minspecialchars;minuppercase;minlowercase;passwordstrengthestimatorscore.
От более к менее строгому:
maxage;graceloginlimit;gracelogintimelimit;maxfailure;maxrptchars;maxinactivity.
Если
password_policy.deny_default=off, то:Настройки, которые остались не заданы, заполняются значениями параметров из конфигурационного файла
postgresql.conf/postgres.yml.Настройки, которые остались не заданы, заполняются значениями по умолчанию для параметров из конфигурационного файла
postgresql.conf/postgres.yml.
Производится проверка на взаимозависимость настроек:
Настройка
Условие, при котором не работают зависимые настройки
Зависимые настройки
policyenable= falseВсе остальные
reusetime> 0inhistorymaxage= NULL,= 0graceloginlimit,gracelogintimelimit,expirewarninglockout= NULL,= falselockoutduration,maxfailure,failurecountintervalchecksyntax= NULL,= falseminlength,alphanumeric,minalphachars,minspecialchars,minuppercase,minlowercase,maxrptcharstracklogin= NULL,= falsemaxinactivityusepasswordstrengthestimator= NULL,= falsepasswordstrengthestimatorscore
Если
password_policy.deny_default=on, то проверяется, что заданы все обязательные настройки.
Разблокировка пользователя#
Есть ситуации (превышение количества неудачных аутентификаций, длительная неактивность пользователя и другие), при которых пароль становится неактивным, а роль блокируется. При попытке подключения под заблокированной учетной записью, будет выведено сообщение:
psql: FATAL: Role is blocked due to fail authentication attempts
FATAL: Role is blocked due to fail authentication attempts
Для разблокировки пользователя, администратору потребуется воспользоваться функцией unblock_role.
Рассмотрим пример блокировки пользователя по причине неверно введенных паролей большего количества раз, чем указано в параметре password_policy.max_failure.
Действия по разблокировке пользователя:
Выведите текущее состояние пользователя:
SELECT * FROM pp_password_detailed WHERE roloid = to_regrole('username');Пример вывода:
-[ RECORD 1 ]----------------------------+----------------------------------- roloid | username failcounter | 6 lastfailtime | 2022-07-19 06:00:05.097145+03 gracesuccesscounter | 0 lastsuccesstime | 2022-07-18 13:36:05.033878+03 createtime | 2022-07-18 07:49:47.175947+03 unblockexpirytime | istransportpassword | f is_auth_available | f is_blocked | t check_policy_for_max_age | t check_policy_for_max_age_text | OK check_policy_for_lockout | t check_policy_for_lockout_text | OK check_policy_for_inactivity_check | t check_policy_for_inactivity_check_text | OK check_policy_for_password_check | t check_policy_for_password_check_text | OK check_lockout | f check_lockout_text | Role was blocked with 6 fail authentification attempts. Last fail at 19.07.2022 06:00:05 Role wasnt unblocked. check_inactivity | t check_inactivity_text | OK. Inactivity check is off. check_password_age | t check_password_age_text | OK. Max_age check is off. check_policy_for_transport_password | t check_policy_for_transport_password_text | OK check_transport_password_life_time | check_transport_password_life_time_text |Пользователь заблокирован, на это указывают поля:
failcounter=6;lastfailtime=“2022-07-19 06:00:05.097145+03“;is_blocked=“t“;в поле
check_lockout_textсообщение, что роль была заблокирована в результате 6 неудачных попыток аутентификации.
Выполните разблокировку пользователя:
SELECT unblock_role('username');Проверьте состояние пользователя после разблокировки:
SELECT * FROM pp_password_detailed WHERE roloid = to_regrole('username');Пример вывода:
-[ RECORD 1 ]----------------------------+----------------------------------- roloid | username failcounter | 6 lastfailtime | 2022-07-19 06:00:05.097145+03 gracesuccesscounter | 0 lastsuccesstime | 2022-07-18 13:36:05.033878+03 createtime | 2022-07-18 07:49:47.175947+03 unblockexpirytime | 2022-07-19 06:05:43.197962+03 istransportpassword | f is_auth_available | t is_blocked | f check_policy_for_max_age | t check_policy_for_max_age_text | OK check_policy_for_lockout | t check_policy_for_lockout_text | OK check_policy_for_inactivity_check | t check_policy_for_inactivity_check_text | OK check_policy_for_password_check | t check_policy_for_password_check_text | OK check_lockout | t check_lockout_text | OK. Role was unblocked at 19.07.2022 06:05:43Role was blocked with 6 fail authentification attempts. check_inactivity | t check_inactivity_text | OK. Inactivity check is off. check_password_age | t check_password_age_text | OK. Max_age check is off. check_policy_for_transport_password | t check_policy_for_transport_password_text | OK check_transport_password_life_time | check_transport_password_life_time_text |Поле
check_lockout_textсодержит сообщение, что роль была разблокирована.
Замена транспортного пароля ТУЗ#
После окончания процесса развертывания СУБД Pangolin необходимо сменить транспортный пароль ТУЗ на постоянный.
Примечание
До тех пор, пока транспортный пароль для ТУЗ не будет изменен на новый постоянный (в соответствии с используемыми парольными политиками), из всех возможных действий для ТУЗ будет доступна только авторизация с последующей сменой пароля.
Установить транспортный (temporary) пароль ТУЗ может пользователь с правами групповой роли db_admin.
Для этого необходимо выполнить вход Администратором в консоль и переключиться на роль
db_admin:SET ROLE db_admin;Выполнить команду для установки транспортного (temporary) пароля ТУЗ:
ALTER USER 'name_tuz' WITH TEMPORARY PASSWORD '<password>';Далее необходимо подключиться ТУЗ самостоятельно, с полученным транспортным паролем, и сменить пароль на постоянный (соединение должно быть открыто именно тем пользователем, которому меняется пароль).
Пример подключения ТУЗ к БД и смена пароля:
=> psql -U 'name_tuz' -d 'name db' -p 5433Вводим полученный транспортный пароль
Password for user 'name_tuz': psql (13.4) SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) Type "help" for help.Смена пароля:
ALTER USER 'name_tuz' WITH ENCRYPTED PASSWORD '<password>'; ALTER ROLE
Диагностика ошибок#
В этом разделе указаны возможные ошибки, которые могут возникнуть в случае блокировки пользователя (аварийная ситуация). Ошибки пишутся в журнал сообщений или в вывод приложения, через которое происходит доступ к БД (например, при попытке подключения).
Справочник журнальных сообщений#
Сообщение |
Расшифровка |
Решение |
|---|---|---|
|
Пользователь заблокирован из-за превышения счетчика неудачных аутентификаций |
Пользователь будет разблокирован, когда пройдет |
|
Пользователь заблокирован из-за просроченного пароля |
Сменить пароль пользователя |
|
Пользователь заблокирован из-за долгой неактивности |
Пользователь может быть разблокирован с помощью команд |
|
Предупреждение об оставшемся времени до обязательной смены пароля |
|
|
Время жизни пароля превышено. Осталось <число> входов, после которых пользователь будет заблокирован |
|
|
Время жизни пароля превышено. Остался <интервал>, по истечении которого пользователь будет заблокирован |
Сценарии использования#
Активация функциональности парольной политики#
Установите значение параметра
password_policies_enable: 'on'в конфигурационном файлеpostgresql.conf/postgres.yml.Для применения настроек перезапустите сервер:
pg_ctl restartСоздайте пользователя с простым паролем:
CREATE USER username_1 WITH ENCRYPTED PASSWORD '123';Пример вывода:
ERROR: Syntax check fail: minimum length for password is 16 Syntax check fail: minimum number of special characters for password is 1 Syntax check fail: minimum number of uppercase characters for password is 1В результате создания пользователя с паролем, возникла ошибка синтаксической проверки пароля на несоответствие парольным политикам:
минимальная длина пароля - 16 символов;
минимальное количество спецсимволов - 1 символ;
минимальное количество прописных букв - 1 буква.
Причина возникновения данной ошибки в активации парольных политик и включенности механизма управления ими. Параметры для проверки берутся из конфигурационного файла (столбец «Значения по умолчанию»).
Создайте пользователя с паролем, удовлетворяющим настройкам парольной политики:
CREATE USER username_1 WITH ENCRYPTED PASSWORD 'd*ZGhpFA8jsH451b_';Вывод:
CREATE ROLEПользователь успешно создан с заданным паролем, так как он соответствует требованиям парольной политики, заданным в конфигурационном файле.
Создание и активация парольной политики для пользователя#
Пример создания парольной политики описан в разделе «Управление».
Просмотр примененных настроек парольной политики для пользователя#
При создании пользователя или роли в базе данных все настройки парольной политики для этого пользователя берутся автоматически из конфигурационного файла (при условии, что он не наследует права от какой-либо роли). Это можно проверить, посмотрев детальную информацию о парольной политике для конкретного пользователя:
Создайте пользователя:
CREATE USER username_3 WITH ENCRYPTED PASSWORD <password>;Вывод:
CREATE ROLEВыведите информацию о примененной парольной политики для созданного пользователя:
SELECT * FROM recognize_password_policy_detailed('username_3');Пример вывода:
policy_name | value | source_type | source ----------------------------------+----------+-------------+-------- reuse_time | 365 days | config | in_history | | | max_age | 00:00:00 | config | min_age | 00:00:00 | config | grace_login_limit | | | grace_login_time_limit | | | expire_warning | | | lockout | true | config | lockout_duration | 24:00:00 | config | max_failure | 6 | config | failure_count_interval | 00:00:00 | config | check_syntax | true | config | min_length | 16 | config | illegal_values | true | config | alpha_numeric | 3 | config | min_alpha_chars | 0 | config | min_special_chars | 1 | config | min_uppercase | 1 | config | min_lowercase | 0 | config | max_rpt_chars | 0 | config | track_login | false | config | max_inactivity | | | use_password_strength_estimator | true | config | password_strength_estimator_score | 3 | config | custom_function | 0 | config | transport_password_life_time | 00:00:00 | config | (26 rows)Поля
source_typeиsourceпоказывают, откуда берется значение для конкретной политики. В приведенном примере видно, что для пользователя применяются параметры парольной политики, взятые из конфигурационного файла (source_type=config).
Просмотр применения метки транспортного пароля#
При просмотре представления pp_password для пользователя с транспортным паролем значение поля istransportpassword равняется True:
SELECT * FROM pp_password WHERE roloid = to_regrole('user2');
-[ RECORD 1 ]-------+-----------------------------
roloid | user2
failcounter | 0
lastfailtime |
gracesuccesscounter | 0
lastsuccesstime |
createtime | 2022-07-14 07:38:35.80058+03
unblockexpirytime |
istransportpassword | t
Деактивация функциональности парольной политики#
Установите значение параметра
password_policies_enable: 'off'в конфигурационном файлеpostgresql.conf/postgres.yml.Для применения настроек перезапустите сервер:
pg_ctl restartСоздайте пользователя с простым паролем:
CREATE USER username_2 WITH ENCRYPTED PASSWORD '123';Вывод:
CREATE ROLEПри создании пользователя ошибка не возникла, поскольку проверка пароля не производится из-за отключенного механизма управления парольной политикой.
Генерация и установка постоянного пароля пользователя (включая ТУЗ)#
Генерация пароля осуществляется функцией rotate_password в соответствии с парольной политикой.
Функция генерации пароля rotate_password создает новый пароль для выбранного пользователя и:
возвращает его в качестве результата;
изменяет его в БД.
Входные параметры функции rotate_password:
(обязательный)
Oidили имя пользователя;(не обязательный) длина пароля. При отсутствии будет сгенерирован по минимальной длине пароля согласно парольным политикам (случайная длина до 5 символов).
Выходной параметр: сгенерированный пароль.
Пример запроса генерации пароля для пользователя User1:
SELECT * FROM rotate_password('User1');
Настройка#
Функция генерации пароля доступна при установленном расширении psql_rotate_password.
Откройте конфигурационный файл
postgersql.conf.Добавьте или измените следующие параметры:
rotate_password_enable = 'on'— включение функции генерации пароля;rotate_password_num_rounds:'20'— количество попыток генерации пароля;rotate_password.valid_roles = 'user1, user2, user3'— список пользователей (через запятую), для которых разрешена генерация пароля.
При изменении параметров перечитайте конфигурацию (reload).
Диагностика ошибок#
При использовании функции могут возникать следующие ошибки:
Исчерпано количество попыток: превышено значение параметра
rotate_password_num_rounds;Пользователь не входит в список ролей: убедитесь, что пользователь указан в параметре
rotate_password.valid_roles;Невозможно сгенерировать подходящий пароль: комбинация синтаксических требований и длины пароля не позволяет создать соответствующий требованиям пароль.
Сценарии использования#
Установите значение („username“) параметра
rotate_password.valid_rolesв конфигурационном файле. Для применения изменений перечитайте конфигурацию (reload).Создайте политики для пользователя. В примере указаны значения для параметров по умолчанию, при необходимости вы можете их изменить:
SELECT * FROM set_role_policies('username', policy_enable(1::boolean), check_syntax(1::boolean), min_length(16), illegal_values(0::boolean), alpha_numeric(5), min_alpha_chars(1), min_special_chars(1), min_uppercase(1), min_lowercase(1), max_rpt_chars(2), use_password_strength_estimator(0::boolean), transport_password_life_time('3 days'));Пример вывода:
-[ RECORD 1 ]---------------------+------- roleid | username reuse_time | in_history | max_age | min_age | grace_login_limit | grace_login_time_limit | expire_warning | lockout | lockout_duration | max_failure | failure_count_interval | check_syntax | t min_length | 16 illegal_values | f alpha_numeric | 5 min_alpha_chars | 1 min_special_chars | 1 min_uppercase | 1 min_lowercase | 1 max_rpt_chars | 2 policy_enable | t track_login | max_inactivity | use_password_strength_estimator | f password_strength_estimator_score | custom_function | transport_password_life_time | 3 daysСгенерируйте пароль для пользователя:
SELECT * FROM rotate_password('username');Пример вывода:
rotate_password -------------------- x3<2BTf?ma3P119_fs (1 row)