Перейти к основному содержимому

Парольные политики

Описание​

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

Основные функции механизма:

  • расширение функциональности авторизации и смены пароля пользователя в части проверки пароля;

  • создание транспортного (временного) пароля;

  • хранение истории паролей роли;

  • сбор и хранение статистической информации о пароле роли;

  • назначение роли парольной политики;

  • управление парольной политикой:

    • создание, удаление и изменение политики;
    • активация и деактивация политики;
    • создание, удаление и изменение алгоритма проверки пароля.

Настройка​

Настройки механизма хранятся в файле конфигурации и таблице pg_pp_policy (в приоритете заполненные параметры в таблице). В зависимости от типа конфигурации сервера, парольные политики хранятся в различных файлах:

  • для standalone-конфигурации — в файле $PGDATA/postgresql.conf;
  • для кластерной конфигурации — в файле /etc/pangolin-manager/postgres.yml.

Подробнее о параметрах в подразделе «Конфигурационные параметры» данного раздела.

Политики не имеют имени, поэтому отображается идентификатор (roloid) соответствующей роли (подробнее в разделе «Таблицы» документа «Справочная информация»).

Внимание!

При подключении через Pangolin Pooler с включенной сквозной аутентификацией проверка пароля выполняется только при первом подключении, что ограничивает политику по срокам действия пароля и количеству подключений.

Внимание!

При активированной защите от привилегированных пользователей параметры политик могут храниться в хранилище секретов. Информация по настройке приведена в разделе «Хранилище секретов» данного документа.

Зависимости​

Для работы механизма необходимы:

  • библиотека OpenSSL;
  • утилита проверки сложности пароля zxcvbn.
Сведения

Указанное ПО включено в дистрибутив СУБД Pangolin.

Основные параметры​

Основные параметры настройки и управления механизмом

Параметр

Описание

password_policies_enable

Включает (on) или выключает (off) политику

password_policy.deny_default

Включает (on) или выключает (off) запрет использования значений для настроек парольной политики из файла конфигурации (postgresql.conf/postgres.yml).
Если включить параметр password_policy.deny_default, то для всех политик должны быть заданы все обязательные настройки в таблице pg_pp_policy

password_policy.psql_encrypt_password

Управляет засекречиванием пароля при передаче от клиента к базе данных.
В случае, если засекречивание отключено (off), пароль передается хешем

Внимание!

При использовании оригинального libpq пароль не передается в засекреченном виде командой \password (управляется параметром psql_encrypt_password). Пароль в таком случае передается только в md5 и scram-sha-256. Обратите внимание, не гарантируется работоспособность сторонних решений.

Внимание!

Изменение параметра password_policies_enable требует перезагрузки сервера (restart) для применения изменений.

Обязательные настройки парольной политики​

Обязательные настройки хранятся в таблице pg_pp_policy. Все настройки для парольной политики имеют аналог в конфигурационном файле, это необходимо для возможности задания значений по умолчанию при создании пользователя (подробнее в подразделе «Конфигурационные параметры»). Приоритетными считаются значения в таблице pg_pp_policy (подробнее в разделе «Вычислении значений настроек для парольной политики пользователя»).

ФункциональностьОбязательный параметрЗависимые параметры
Хранение паролейОдин из: reusetime или inhistory-
Изменение пароляminage-
Синтаксическая проверка пароляchecksyntaxminlength, alphanumeric, minalphachars, minspecialchars, minuppercase, minlowercase, maxrptchars
Проверка вхождения пароля в черный списокillegalvalues-
Проверка пароля библиотекой zxcvbnusepasswordstrengthestimatorpasswordstrengthestimatorscore
Пользовательская PSQL функция проверки пароляcustomfunction-
Аутентификацияmaxage, graceloginlimit, gracelogintimelimit, lockout, lockoutduration, maxfailure, failurecountinterval, tracklogin, maxinactivity-

Конфигурационные параметры​

В данном разделе более подробно описаны параметры файла postgresql.conf/postgres.yml и их значения по умолчанию.

Подсказка

Настроечные параметры, управляемые администраторами безопасности через хранилище секретов в режиме защищенного конфигурирования, находятся в таблице «Настроечные параметры KMS» документа «Справочная информация».

ПараметрОписаниеТипPOSIX шаблонЗначение по умолчаниюАналог в pg_pp_policy
password_policy.policy_enableАктивация парольной политикиbooleanon/offonpolicyenable
password_policy.deny_defaultАктивация использования настроек из postgresql.confbooleanon/offoff-
password_policy.psql_encrypt_passwordЗасекречивание пароля при передаче от клиента к БДbooleanon/off--
password_policy.deduplicate_ssl_no_ssl_fail_auth_attemptsВключение механизма исключения повторных попыток подключения psqlbooleanon/offon-
password_policy.allow_hashed_passwordРазрешить задание пароля в виде хешаbooleanon/offoff-

Настройка хранения паролей​

ПараметрОписаниеТипPOSIX шаблонОграничение значенияЗначение по умолчаниюСпециальные значения параметровАналог в pg_pp_policy
password_policy.reuse_timeВремя в секундах, в течение которого старый пароль сохраняется, и попытка сменить пароль на совпадающий со старым заканчивается ошибкойstring\d+ sнеотрицательное365 days-reusetime
password_policy.in_historyМаксимальное количество сохраненных старых паролейinteger[0-1000]0-100040 – Проверка на совпадение пароля с ранее использованным не проводится (при условии reuse_time = 0)inhistory
примечание

Если задан параметр password_policy.reuse_time, то параметр password_policy.in_history не используется.

Время жизни пароля​

ПараметрОписаниеТипPOSIX шаблонОграничение значенияЗначение по умолчаниюСпециальные значения параметровАналог в pg_pp_policy
password_policy.max_ageВремя жизни пароля в секундахstring\d+ sнеотрицательное00 – Проверка максимального времени жизни пароля не производитсяmaxage
password_policy.min_ageМинимальное время между изменениями пароляstring\d+ sнеотрицательное00 – Проверка максимального времени жизни пароля не производитсяminage
password_policy.grace_login_limitМаксимальное количество аутентификаций после истечения срока действия пароляinteger[0-1000]0-10000-graceloginlimit
password_policy.grace_login_time_limitВремя, в течение которого пароль остается рабочим после окончания срока его действияstring\d+ sнеотрицательное3 days0 – аутентификация не доступна по истечении времени жизни пароляgracelogintimelimit
password_policy.expire_warningВремя до истечения пароля, при котором выводится предупреждениеstring\d+ sнеотрицательное7 days0 – не выводит предупреждениеexpirewarning

Поведение при неудачной аутентификации​

ПараметрОписаниеТипPOSIX шаблонОграничение значенияЗначение по умолчаниюСпециальные значения параметровАналог в pg_pp_policy
password_policy.lockoutБлокировка аккаунта при достижении максимума неверных попыток аутентификацииbooleanon/offon/offon-lockout
password_policy.max_failureМаксимальное количество неверных попыток аутентификацииinteger[1-1000]1-10006-maxfailure
password_policy.failure_count_intervalВремя, после которого количество неверных попыток сбрасываетсяstring\d+ s>= 000 – счетчик не обнуляетсяfailurecountinterval
password_policy.lockout_durationВремя блокировки аккаунтаstring\d+ sнеотрицательное24 hours0 – блокировка пользователя по количеству неудачных аутентификаций бессрочнаlockoutduration

Синтаксические проверки пароля​

ПараметрОписаниеТипОграничение значенияЗначение по умолчаниюСпециальные значения параметровАналог в pg_pp_policy
password_policy.check_syntaxВключение синтаксической проверки пароляbooleanon/offon–checksyntax
password_policy.alpha_numericМинимальное количество цифр в паролеinteger0-100030 – не проверятьalphanumeric
password_policy.min_lengthМинимальная длина пароляinteger0-1000160 – не проверятьminlength
password_policy.min_alpha_charsМинимальное количество букв в паролеinteger0-100000 – не проверятьminalphachars
password_policy.min_special_charsМинимальное количество специальных символовinteger0-100000 – не проверятьminspecialchars
password_policy.min_uppercaseМинимальное количество прописных буквinteger0-100010 – не проверятьminuppercase
password_policy.min_lowercaseМинимальное количество строчных буквinteger0-100000 – не проверятьminlowercase
password_policy.max_rpt_charsМаксимальное количество повторяющихся символовinteger0-100000 – не проверятьmaxrptchars

Проверка максимального времени неактивности пользователя​

ПараметрОписаниеТипОграничение значенияЗначение по умолчаниюСпециальные значения параметровАналог в pg_pp_policy
password_policy.track_loginЗапоминать ли время последней аутентификацииbooleanon/offoff–tracklogin
password_policy.max_inactivityВремя последней аутентификации, после которого аккаунт блокируетсяstringнеотрицательное00 – функциональность отключенаmaxinactivity

Использование библиотеки zxcvbn​

ПараметрОписаниеТипPOSIX шаблонОграничение значенияЗначение по умолчаниюАналог в pg_pp_policy
password_policy.use_password_strength_estimatorВключение использования библиотеки zxcvbn для оценки сложности пароляbooleanon/offon/offonusepasswordstrengthestimator
password_policy.password_strength_estimator_scoreМинимальная оценка сложности пароляinteger[0-4]0-43passwordstrengthestimatorscore

Использование пользовательской функции проверки пароля​

ПараметрОписаниеТипPOSIX шаблонЗначение по умолчаниюАналог в pg_pp_policy
password_policy.custom_functionПользовательская функция проверки пароляstring[\w\d]+-customfunction

Проверка вхождения пароля в черный список​

ПараметрОписаниеТипОграничение значенияЗначение по умолчаниюАналог в pg_pp_policy
password_policy.illegal_valuesПроверка, что пароль не входит в список часто используемыхbooleanon/offonillegalvalues

Настройка кеширования​

ПараметрОписаниеТипPOSIX шаблонОграничение значенияЗначение по умолчаниюАналог в pg_pp_policy
password_policy.pp_cache_dump_intervalИнтервал сохранения данных кеша на дискinteger\d+1 - до максимального значения int в системе10-
password_policy.pp_cache_init_sizeРазмер инициализированного кеша парольных политикinteger\d+1 - до максимального значения int в системе10-
password_policy.pp_cache_soft_max_sizeПредполагаемый максимальный размер кешаinteger\d+1 - до максимального значения int в системе60-
password_policy.pp_cache_max_sizeОграничение сверху на размер кешаinteger\d+1 - до максимального значения int в системе1000-

Параметры управления транспортными паролями​

ПараметрОписаниеТипЗначение по умолчаниюАналог в pg_pp_policy
password_policy.transport_password_mark_automaticПри значении true пароль становится транспортным автоматически при смене другим пользователем.
При значении false пароль отмечается транспортным вручную
booleanfalse-
transport_password_life_timeОпределяет время жизни транспортного пароляstring0transportpasswordlifetime
password_policy.is_temp_tuz_passwordОпределяет тип пароля (транспортный или нет) для указанных ТУЗbooleantrue-

Таблицы​

В механизме управления парольной политикой используются таблицы:

  • pg_pp_history – таблица ранее использованных паролей;
  • pg_pp_password– таблица с информацией о текущем пароле;
  • pg_pp_policy – таблица с информацией о парольных политиках.

Представления​

Для просмотра информации о состоянии роли и кеша парольных политик созданы следующие представления:

  • pp_password_detailed — для мониторинга состояния ролей;
  • pp_password — для просмотра кеша парольных политик.
примечание

В случае обращения к выводу view при отключенных парольных политиках (password_policies_enable = 'off') вернется пустая таблица, а также будет выведено предупреждение (WARNING).

Функции​

Управление парольными политиками осуществляется соответствующими функциями:

  • set_role_policies – создание парольной политики;
  • enable_policy – активация парольной политики;
  • disable_policy – деактивация парольной политики;
  • recognize_password_policy – отображение парольных политик, примененных к роли;
  • select_all_password_policies – отображение всех активных политик;
  • unblock_role – разблокировка роли.

Рекомендации по заданию стойких паролей​

Пароль считается стойким, если он удовлетворяет следующим условиям:

  • должен изменяться не менее 1 раза в 80 дней с момента последнего изменения;
  • должен быть сложен (обязательно использование строчных и прописных букв и цифр);
  • длина пароля — минимум 12 символов;
  • должен быть уникален, недопустимо использование одного и того же пароля для нескольких УЗ одного пользователя;
  • не должен содержать имя УЗ пользователя или какую-либо его часть;
  • в случае компрометации пароля необходимо незамедлительно его сменить;
  • должен храниться в засекреченном виде.

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

Не рекомендуется передавать или хранить пароль в открытом виде в:

  • файле pgpass;
  • строке параметров подключения;
  • переменной окружения PGPASSWORD.

Парольные политики для СУБД Pangolin по умолчанию настроены следующим образом:

  • выключены для пользователей, проходящих внешнюю аутентификацию: LDAP;

  • для локальных УЗ включено использование библиотеки zxcvb;

  • для специальных УЗ выключены проверки времени жизни пароля:

    SELECT * FROM set_role_policies('masteromni', max_age('0 sec'), min_age('0 sec'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
    SELECT * FROM set_role_policies('zabbix_oasubd', max_age('0 sec'), min_age('0 sec'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
    SELECT * FROM set_role_policies('monitoring_php', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
    SELECT * FROM set_role_policies('auditor', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
    SELECT * FROM set_role_policies('pstgcmdb', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
    SELECT * FROM set_role_policies('as_TUZ', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
    SELECT * FROM set_role_policies('as_admin', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
    SELECT * FROM set_role_policies('db_admin', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
    SELECT * FROM set_role_policies('postgres', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));

Транспортный пароль​

Транспортный (временный) пароль нужен для аутентификации пользователя с ограничениями на все действия, кроме:

  • смены своего пароля;
  • чтения из таблиц, расположенных в схемах 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. При попытке любого другого действия выводится сообщение о запрете по причине авторизации с транспортным паролем. В таком случае необходимо сменить пароль на постоянный.

Схема блокировки запроса с транспортным паролем:

transport_pass

Пароль отмечается как транспортный или явным указанием при его задании, или автоматически при смене пароля другим пользователем. Возможность автоматической отметки определяется параметром (password_policy.transport_password_mark_automatic) конфигурации сервера БД (ознакомьтесь с разделом «Параметры управления транспортными паролями»).

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

Управление​

Создание парольной политики пользователя​

Создание парольной политики для пользователя происходит с помощью выполнения PL/pgSQL функции set_role_policies. При этом настройки не будут применены без их активации с помощью функции enable_policy.

примечание

Создание и активацию настроек парольной политики можно осуществить одним запросом. Для этого при создании парольной политики для пользователя нужно указать параметр policy_enable(1::boolean). В таком случае новые параметры парольной политики начнут действовать сразу.

Пример создания парольной политики:

  1. Создайте пользователя:

    CREATE USER username_3 WITH ENCRYPTED PASSWORD <password>

    Вывод:

    CREATE ROLE
  2. Создайте парольную политику для пользователя:

    Пример запроса:

    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:

  1. Из таблицы pg_pp_policy собираются все заданные настройки для конкретного пользователя (значение не NULL) по идентификатору.

  2. Ищутся все роли, в которые входит данный пользователь.

    Примечание

    Чтобы пользователь мог наследовать политики у родителей, он должен иметь настройку INHERIT.

  3. Для каждой найденной роли по идентификатору роли из таблицы pg_pp_policy выбираются настройки по условию:

    • настройка не была выбрана на шаге 1;
    • значение настройки не NULL.
    примечание

    Исключение — все заданные значения параметра customfunction сохраняются в исходном порядке, формируя список функций на выполнение. Соответствующие функции будут последовательно применены в указанном параметре.

  4. Если на шаге 3 для одной настройки было найдено несколько значений, то выбирается наиболее строгое ограничение. Ниже указаны параметры и способ определения строгости значения (от менее к более строгому):

    • reusetime;
    • inhistory;
    • minage;
    • expirewarning;
    • lockoutduration;
    • failurecountinterval;
    • minlength;
    • alphanumeric;
    • minalphachars;
    • minspecialchars;
    • minuppercase;
    • minlowercase;
    • passwordstrengthestimatorscore.

    От более к менее строгому:

    • maxage;
    • graceloginlimit;
    • gracelogintimelimit;
    • maxfailure;
    • maxrptchars;
    • maxinactivity.
    1. Если password_policy.deny_default=off, то:

      • Настройки, которые остались не заданы, заполняются значениями параметров из конфигурационного файла postgresql.conf/postgres.yml.
      • Настройки, которые остались не заданы, заполняются значениями по умолчанию для параметров из конфигурационного файла postgresql.conf/postgres.yml.
    2. Производится проверка на взаимозависимость настроек:

      НастройкаУсловие, при котором не работают зависимые настройкиЗависимые настройки
      policyenable= falseВсе остальные
      reusetime> 0inhistory
      maxage= NULL, = 0graceloginlimit, gracelogintimelimit, expirewarning
      lockout= NULL, = falselockoutduration, maxfailure, failurecountinterval
      checksyntax= NULL, = falseminlength, alphanumeric, minalphachars, minspecialchars, minuppercase, minlowercase, maxrptchars
      tracklogin= NULL, = falsemaxinactivity
      usepasswordstrengthestimator= NULL, = falsepasswordstrengthestimatorscore
  5. Если 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.

Действия по разблокировке пользователя:

  1. Выведите текущее состояние пользователя:

    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 неудачных попыток аутентификации.
  2. Выполните разблокировку пользователя:

    SELECT unblock_role('username');
  3. Проверьте состояние пользователя после разблокировки:

    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) пароль ТУЗ может пользователь с правами суперпользователя, либо CREATEROLE (например, пользователь с правами групповой роли db_admin).

  1. Для этого необходимо выполнить вход Администратором в консоль и переключиться на роль db_admin:

    SET ROLE db_admin;
  2. Выполнить команду для установки транспортного (temporary) пароля ТУЗ:

    ALTER USER 'name_tuz' WITH TEMPORARY PASSWORD '<password>';
  3. Далее необходимо подключиться ТУЗ самостоятельно, с полученным транспортным паролем, и сменить пароль на постоянный (соединение должно быть открыто именно тем пользователем, которому меняется пароль).

    Пример подключения ТУЗ к БД и смена пароля:

    => 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

Диагностика ошибок​

В этом разделе указаны возможные ошибки, которые могут возникнуть в случае блокировки пользователя (аварийная ситуация). Ошибки пишутся в журнал сообщений или в вывод приложения, через которое происходит доступ к БД (например, при попытке подключения).

Справочник журнальных сообщений​

СообщениеРасшифровкаРешение
User blocked: too many login failsПользователь заблокирован из-за превышения счетчика неудачных аутентификацийПользователь будет разблокирован, когда пройдет lockoutduration с момента последней неудачной аутентификации. Пользователь может быть разблокирован с помощью команд unblock_role и unblock_role_by_id
Password was expiredПользователь заблокирован из-за просроченного пароляСменить пароль пользователя
Role blocked cause long inactivityПользователь заблокирован из-за долгой неактивностиПользователь может быть разблокирован с помощью команд unblock_role и unblock_role_by_id
Password will expire in {интервал}Предупреждение об оставшемся времени до обязательной смены пароля
Password was expired. {число} grace logins leftВремя жизни пароля превышено. Осталось <число> входов, после которых пользователь будет заблокирован
Password was expired. Grace period ends in {интервал}Время жизни пароля превышено. Остался <интервал>, по истечении которого пользователь будет заблокирован

Сценарии использования​

Активация функциональности парольной политики​

  1. Установите значение параметра password_policies_enable: 'on' в конфигурационном файле postgresql.conf/postgres.yml.

  2. Для применения настроек перезапустите сервер:

    pg_ctl restart
  3. Создайте пользователя с простым паролем:

    CREATE USER username_1 WITH ENCRYPTED PASSWORD '<simple_password>';

    Пример вывода:

    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 буква.

    Причина возникновения данной ошибки в активации парольных политик и включенности механизма управления ими. Параметры для проверки берутся из конфигурационного файла (столбец «Значения по умолчанию»).

  4. Создайте пользователя с паролем, удовлетворяющим настройкам парольной политики:

    CREATE USER username_1 WITH ENCRYPTED PASSWORD '<hard_password>';

    Вывод:

    CREATE ROLE

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

Создание и активация парольной политики для пользователя​

Пример создания парольной политики описан в разделе «Управление».

Просмотр примененных настроек парольной политики для пользователя​

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

  1. Создайте пользователя:

    CREATE USER username_3 WITH ENCRYPTED PASSWORD <password>;

    Вывод:

    CREATE ROLE
  2. Выведите информацию о примененной парольной политики для созданного пользователя:

    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

Деактивация функциональности парольной политики​

  1. Установите значение параметра password_policies_enable: 'off' в конфигурационном файле postgresql.conf/postgres.yml.

  2. Для применения настроек перезапустите сервер:

    pg_ctl restart
  3. Создайте пользователя с простым паролем:

    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.

  1. В конфигурационном файле postgres.yml/postgersql.conf измените параметр rotate_password.num_rounds = '20' — количество попыток генерации пароля.

  2. С помощью функции rp_set_valid_roles расширения psql_rotate_password задайте список пользователей (через запятую), для которых разрешена генерация пароля, пример:

    SELECT rp_set_valid_roles('app_user,db_admin,analyst,”User-2”');
  3. При изменении параметров перечитайте конфигурацию (reload).

Диагностика ошибок​

При использовании функции могут возникать следующие ошибки:

  • Исчерпано количество попыток: превышено значение параметра rotate_password.num_rounds;
  • Пользователь не входит в список ролей: убедитесь, что пользователь указан в параметре rotate_password.valid_roles, либо задан функцией rp_set_valid_roles в списке пользователей при указанном расширении psql_rotate_password в параметре shared_preload_libraries;
  • Невозможно сгенерировать подходящий пароль: комбинация синтаксических требований и длины пароля не позволяет создать соответствующий требованиям пароль.

Сценарии использования​

  1. Укажите имя пользователя ('username') в списке ролей, для которых возможна ротация паролей с помощью функции rp_set_valid_roles расширения psql_rotate_password.

  2. Создайте политики для пользователя. В примере указаны значения для параметров по умолчанию, при необходимости измените их:

    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
  3. Сгенерируйте пароль для пользователя:

    SELECT * FROM rotate_password('username');

    Пример вывода:

    rotate_password
    --------------------
    x3<2BTf?ma3P119_fs
    (1 row)

Обеспечение ротации секретов ТУЗ​

Сведения

Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.

Описание​

При смене пароля, пользователь, на определенное настройками время (grace-период), может подключаться к Pangolin и с использованием старого пароля, и с использованием нового пароля, по выбору. Этот механизм позволяет осуществлять автоматическую ротацию паролей ТУЗ, которые используют приложения, сохраняя их доступность. После ротации паролей ТУЗ, приложения продолжают работу с Pangolin, используя старый пароль, который необходимо обновить в течении grace-периода.

Внимание!

Настройка grace-периода применяется в порядке приоритета:

  1. Высокий приоритет – сессионный параметр пользователя.
  2. Средний приоритет – парольная политика роли.
  3. Низкий приоритет – значение из файла grace_rotate.bin.

Более подробную информацию смотрите в разделе, посвященному расширению psql_rotate_password.

Настройка функциональности в процессе установки Pangolin​

Настройка grace-периода в процессе установки кластера Pangolin осуществляется в пользовательском конфигурационном файле custom_config_sample.yml (раздел c описанием доступен в личном кабинете).

За включение функциональности отвечает параметр enable в yaml-словаре grace_authid. Значение периода настраивается параметром period.

Параметр skip_error позволяет контролировать ошибки в процессе создания grace-пароля (детальнее в разделе «Обновление пароля»).

Пример настроек из файла custom_config_sample.yml:

grace_authid:
enable: 'off'
period: '0'
skip_error: 'off'
ПараметрЗначение по умолчаниюОписание
grace_authid_enableoffВключение функциональности grace-периода. По умолчанию функциональность будет выключена
grace_authid_period0Период валидности grace-пароля (в секундах, минутах, часах и т.д. Например, 5s или 5 seconds)
grace_authid_skip_erroroffЗавершение запроса на обновление пароля пользователя без ошибки, если grace-пароль не может быть сохранен. По умолчанию запрос завершается с ошибкой, если grace-пароль не может быть сохранен

Подробнее о процессе установки Pangolin читайте в документе «Руководство по установке», раздел «Установка».

Процесс настройки grace-периода в процессе установки Pangolin​

  1. Настройте параметры grace-периода в пользовательском конфигурационном файле.

    grace_authid_enable: on
    grace_authid_period: 300
  2. Запустите установку/обновление кластера Pangolin.

Настройка функциональности на запущенном кластере Pangolin​

Настройка осуществляется в конфигурационном файле postgresql.conf.

Включение и отключение функциональности настраивается параметром grace_authid_enable, который может принимать значения on (включен) и off (выключен). По умолчанию функциональность выключена (off).

Grace-период настраивается параметром grace_authid_period (в секундах, минутах, часах и т.д. Например, 5s или 5 seconds). Если установлено расширение psql_rotate_password, то настройка производится через него. Период применяется ко всем ролям, если функциональность включена и нет отдельной настройки параметров сессии или парольных политик. Значение периода по умолчанию равно нулю. Чтобы явно обозначить намерение включить функциональность для всех пользователей, необходимо установить значение, отличное от нуля.

В результате запросов на обновление пароля (детальнее описано в подразделе «Обновление пароля») будет возвращаться ошибка, если grace-пароль не может быть сохранен, и параметр grace_skip_error установлен в значение off (выключен). Если параметр grace_skip_error установлен в значение on (включен), то запросы на обновление пароля будут успешны, даже если grace-пароль не может быть сохранен. По умолчанию параметр выключен.

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

Настройка функциональности на время сеанса роли​

Значение grace-периода можно задать на время сеанса для конкретного пользователя под суперпользователем, изменив значение по умолчанию конфигурационной переменной, с помощью формы запроса ALTER ROLE ... SET grace_authid_period=value. Значение задается в секундах, будет распространяться на сеансы роли. Пример команды:

ALTER USER test_user SET grace_authid_period=1200;

Процесс аутентификации по grace-паролю​

Если функциональность включена, то в случае неуспешной аутентификации по основному паролю дополнительно проводится аутентификация по grace-паролю. Функциональность поддерживает все типы аутентификации с паролем: password, md5, scram-sha-256.

Описание процесса со схемы в виде таблицы:

Номер шагаНаименование шагаВходной документОписаниеИсполнительВыходной документИТ-системаПереход к шагу
1Запрос аутентификацииПользователь инициализирует подключениеПользовательДанные аутентификацииСУБД Pangolin2
2Проверка основного пароляДанные аутентификацииPangolin сверяет данные аутентификации с основным паролем пользователяPangolinДанные аутентификацииСУБД Pangolin3, 4, 5
3Проверка grace-пароляДанные аутентификацииЕсли функциональность включена, Pangolin сверяет данные аутентификации с grace-паролем пользователяPangolinСУБД Pangolin4, 5
4Разрыв соединенияВыполняется отказ в обслуживании по причине ошибок в процессе аутентификацииPangolinСообщение пользователюСУБД PangolinВыход
5Соединение установленоОткрывается соединение с базой данныхPangolinСУБД PangolinВыход
Внимание!

После истечения grace-периода соединение, установленное с использованием grace-пароля, прерываться не будет.

Процесс двухфакторной аутентификации по grace-паролю​

Двухфакторная аутентификация состоит из проверки SSL-сертификата и дальнейшей аутентификации по паролю. Если функциональность grace-пароля включена, то вторая часть двухфакторной аутентификации будет происходить с использованием grace-пароля. Процесс двухфакторной аутентификации сквозной по отношению к функциональности.

Описание процесса со схемы в виде таблицы:

Номер шагаНаименование шагаВходной документОписаниеИсполнительВыходной документИТ-системаПереход к шагу
1Запрос аутентификацииПользователь инициализирует подключениеПользовательДанные аутентификацииСУБД Pangolin2
2Проверка SSL-сертификатаДанные аутентификацииPangolin проверяет данные предоставленного сертификатаPangolinДанные аутентификацииСУБД Pangolin3, 4
3Аутентификация по паре логин/парольДанные аутентификацииPangolin проводит аутентификацию по паре логин/пароль. Если функциональность включена, Pangolin сверяет данные аутентификации с grace-паролем пользователя (подробнее в разделе «Процесс аутентификации по grace-паролю»)PangolinСУБД Pangolin4, 5
4Разрыв соединенияВыполняется отказ в обслуживании по причине ошибок в процессе аутентификацииPangolinСообщение пользователюСУБД PangolinВыход
5Соединение установленоОткрывается соединение с базой данныхPangolinСУБД PangolinВыход

При сквозной аутентификации на Pangolin Pooler начальная проверка логина/пароля выполняется на стороне СУБД, который в случае успеха возвращает токен пользователя и период активности аутентификации. Период активности аутентификации определяется конфигурационным параметром auth_activity_period СУБД. Если функциональность grace-пароля включена и если пользователь предоставил валидный grace-пароль, то период активности аутентификации, который вернет СУБД Pangolin, будет дополнительно ограничен остатком времени валидности grace-пароля.

Настройка функциональности в парольных политиках​

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

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

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

Чтобы отключить grace-период для отдельного пользователя, требуется, чтобы для одной из его ролей была применена политика с параметром grace_authid_period, который равен нулю.

Пример настройки grace-периода для роли с помощью парольных политик​

  1. Включите парольные политики. Для этого в конфигурационном файле /etc/pangolin-manager/postgres.yml:

    1. Установите значение параметра:

      password_policies_enable: on
    2. Перезагрузите кластер:

      sudo systemctl reload postgresql
      sudo systemctl restart postgresql
  2. Установите начальные пароли для пользователей:

    psql -c "SET password_encryption='scram-sha-256'; ALTER USER test_user_1 WITH PASSWORD '<password_1>'; ALTER USER test_user_2 WITH PASSWORD '<password_2>'; ALTER USER test_user_3 WITH PASSWORD '<password_3>';"

    ALTER ROLE
  3. Включите функциональность grace-паролей, и установите значение grace-периода для всех ролей. Для этого в конфигурационном файле /etc/pangolin-manager/postgres.yml:

    1. Установите значения параметров:

      grace_authid_enable: on
      grace_authid_period: '1200'
    2. Перечитайте конфигурацию на кластере:

      sudo systemctl reload postgresql
  4. Проверьте, что у пользователей отсутствуют grace-пароли в представлении pg_shadow:

    psql -c "SELECT usename, grace_period, grace_period_source, grace_time_left, prevpassword, currpassword FROM pg_shadow WHERE usename='test_user_1' OR usename='test_user_2' OR usename='test_user_3'"

    usename | grace_period | grace_period_source | grace_time_left | prevpassword | currpassword
    -------------+--------------+---------------------+-----------------+--------------+--------------
    test_user_1 | 00:20:00 | config | | |
    test_user_2 | 00:20:00 | config | | |
    test_user_3 | 00:20:00 | config | | |
    (3 rows)
  5. Проверьте, что у пользователей отсутствуют grace-пароли в представлении pg_roles:

    psql -c "SELECT rolname, grace_period, grace_period_source, grace_time_left, rolprevpassword FROM pg_roles WHERE rolname='test_user_1' OR rolname='test_user_2' OR rolname='test_user_3'"

    rolname | grace_period | grace_period_source | grace_time_left | rolprevpassword
    -------------+--------------+---------------------+-----------------+-----------------
    test_user_1 | 00:20:00 | config | |
    test_user_2 | 00:20:00 | config | |
    test_user_3 | 00:20:00 | config | |
    (3 rows)
  6. Проверьте, что у пользователей отсутствуют grace-пароли в представлении pg_user:

    psql -c "SELECT usename, grace_period, grace_period_source, grace_time_left, prevpasswd FROM pg_user WHERE usename='test_user_1' OR usename='test_user_2' OR usename='test_user_3'"

    usename | grace_period | grace_period_source | grace_time_left | prevpasswd
    -------------+--------------+---------------------+-----------------+------------
    test_user_1 | 00:20:00 | config | |
    test_user_2 | 00:20:00 | config | |
    test_user_3 | 00:20:00 | config | |
    (3 rows)
  7. Обновите пароли пользователей:

    psql -c "SET password_encryption='scram-sha-256'; ALTER USER test_user_1 WITH PASSWORD '<password_1>'; ALTER USER test_user_2 WITH PASSWORD '<password_2>'; ALTER USER test_user_3 WITH PASSWORD '<password_3>';"

    ALTER ROLE
  8. Проверьте, что у пользователей существуют grace-пароли в представлении pg_shadow, grace-период для всех пользователей равен периоду из конфигурации, источник настройки grace-периода – конфигурация, используя команду из пункта 4.

    usename | grace_period | grace_period_source | grace_time_left | prevpassword | currpassword
    -------------+--------------+---------------------+-----------------+------------------------------+----------------------------------------
    test_user_1 | 00:20:00 | config | 00:19:49.69486 | SCRAM-SHA-256${hash} | SCRAM-SHA-256${hash}
    test_user_2 | 00:20:00 | config | 00:19:49.701905 | SCRAM-SHA-256${hash} | SCRAM-SHA-256${hash}
    test_user_3 | 00:20:00 | config | 00:19:49.708737 | SCRAM-SHA-256${hash} | SCRAM-SHA-256${hash}
    (3 rows)
  9. Проверьте, что у пользователей существуют grace-пароли в представлении pg_roles, grace-период для всех пользователей равен периоду из конфигурации, источник настройки grace-периода – конфигурация, используя команду из пункта 5.

    rolname | grace_period | grace_period_source | grace_time_left | rolprevpassword
    -------------+--------------+---------------------+-----------------+-----------------
    test_user_1 | 00:20:00 | config | 00:19:24.605765 | ********
    test_user_2 | 00:20:00 | config | 00:19:24.6075 | ********
    test_user_3 | 00:20:00 | config | 00:19:24.609161 | ********
    (3 rows)
  10. Проверьте, что у пользователей существуют grace-пароли в представлении pg_user, grace-период для всех пользователей равен периоду из конфигурации, источник настройки grace-периода – конфигурация, используя команду из пункта 6.

    usename | grace_period | grace_period_source | grace_time_left | prevpasswd
    -------------+--------------+---------------------+-----------------+------------
    test_user_1 | 00:20:00 | config | 00:19:15.196007 | ********
    test_user_2 | 00:20:00 | config | 00:19:15.197727 | ********
    test_user_3 | 00:20:00 | config | 00:19:15.199377 | ********
    (3 rows)
  11. Установите значение grace-периода, которое превышает значение периода из конфигурации, для пользователя test_user_1 через парольные политики:

    psql -c "SELECT set_role_policies('test_user_1', policy_enable(1::boolean), grace_authid_period('30 minutes'));"

    Парольная политика с указанием grace-периода успешно применена:

    set_role_policies
    ----------------------------------------------
    (19090,,,,,,,,,,,,,,,,,,,,,t,,,,,,,00:30:00)
    (1 row)
  12. Установите значение grace-периода равное нулю для пользователя test_user_2 через парольные политики:

    psql -c "SELECT set_role_policies('test_user_2', policy_enable(1::boolean), grace_authid_period('0 minutes'));"

    Парольная политика с указанием grace-периода успешно применена:

    set_role_policies
    ----------------------------------------------
    (19110,,,,,,,,,,,,,,,,,,,,,t,,,,,,,00:00:00)
    (1 row)
  13. Проверьте с помощью представления pg_shadow, используя команду из пункта 4, что у пользователя test_user_1 grace-период превышает период, указанный в конфигурации, а у пользователя test_user_2 отсутствует grace-пароль:

    В представлении pg_shadow у test_user_1 grace-период превышает период, указанный в конфигурации, а у test_user_2 отсутствует grace-пароль:

    usename | grace_period | grace_period_source | grace_time_left | prevpassword | currpassword
    -------------+--------------+---------------------+-----------------+------------------------------+----------------------------------------
    test_user_1 | 00:30:00 | policy | 00:29:50.417189 | SCRAM-SHA-256${hash} | SCRAM-SHA-256${hash}
    test_user_2 | 00:00:00 | policy | | |
    test_user_3 | 00:20:00 | config | 00:19:50.429895 | SCRAM-SHA-256${hash} | SCRAM-SHA-256${hash}
    (3 rows)
  14. Проверьте с помощью представления pg_roles, используя команду из пункта 5, что у пользователя test_user_1 grace-период превышает период, указанный в конфигурации, а у пользователя test_user_2 отсутствует grace-пароль:

    В представлении pg_roles у test_user_1 grace-период превышает период, указанный в конфигурации, а у test_user_2 отсутствует grace-пароль:

    rolname | grace_period | grace_period_source | grace_time_left | rolprevpassword
    -------------+--------------+---------------------+-----------------+-----------------
    test_user_1 | 00:30:00 | policy | 00:29:41.019018 | ********
    test_user_2 | 00:00:00 | policy | |
    test_user_3 | 00:20:00 | config | 00:19:41.031715 | ********
    (3 rows)
  15. Проверьте с помощью представления pg_user, используя команду из пункта 6, что у пользователя test_user_1 grace-период превышает период, указанный в конфигурации, а у пользователя test_user_2 отсутствует grace-пароль:

    usename | grace_period | grace_period_source | grace_time_left | prevpasswd
    -------------+--------------+---------------------+-----------------+------------
    test_user_1 | 00:30:00 | policy | 00:29:33.396283 | ********
    test_user_2 | 00:00:00 | policy | |
    test_user_3 | 00:20:00 | config | 00:19:33.408985 | ********
    (3 rows)
  16. Проверьте, что test_user_1 может подключиться со старым паролем:

    PGPASSWORD='<password_1>' psql -U test_user_1 -c "select 1;"

    Запрос успешно выполнен:

    ?column?
    ----------
    1
    (1 row)
  17. Проверьте, что test_user_1 может подключиться с текущим паролем:

    PGPASSWORD='<password_1>' psql -U test_user_1 -c "select 1;"

    Запрос успешно выполнен:

    ?column?
    ----------
    1
    (1 row)
  18. Проверьте, что test_user_2 не может подключиться со старым паролем:

    PGPASSWORD='<password_2>' psql -U test_user_2 -c "select 1;"

    Запрос не выполнен, ошибка авторизации:

    psql: error: FATAL: password authentication failed for user "test_user_2"
    FATAL: password authentication failed for user "test_user_2"
  19. Проверьте, что test_user_2 может подключиться с текущим паролем:

    PGPASSWORD='<password_2>' psql -U test_user_2 -c "select 1;"

    Запрос успешно выполнен:

    ?column?
    ----------
    1
    (1 row)

Схема настройки grace-периода в парольных политиках​

Номер шагаНаименование шагаВходной документОписаниеИсполнительВыходной документИТ-системаПереход к шагу
1Включить парольные политикиpostgresql.confАдминистратор АС включает парольные политикиАдминистратор АСОбновленный postgresql.confСУБД Pangolin2
2Применить парольную политику к ролиРольАдминистратор АС применяет к роли парольную политику с установленным grace_authid_periodАдминистратор АСРоль с политикойСУБД PangolinВыход

Обновление пароля​

При включенной функциональности, старый пароль пользователя хранится в базе данных на время grace-периода, если пароль был обновлен одним из способов:

  • при помощи SQL-запроса ALTER USER/ROLE ... WITH PASSWORD ...;
  • при помощи функции rotate_password из расширения psql_rotate_password;
  • при помощи функции pm_set_security_admin_password для обновления пароля Администратора безопасности.
Внимание!

Если администратор БД обновит пароль пользователя напрямую в каталоге pg_authid, то старый пароль пользователя будет утерян и механизм grace-периода не сможет его использовать.

Существует ряд ограничений на работу функциональности при обновлении пароля:

  1. Если новый пароль задается в формате scram-sha-256, то старый пароль не будет работать во время grace-периода. Это обусловлено механизмом аутентификации scram-sha-256: пользователю передается соль из хеша хранимого пароля, которую он использует, чтобы создать хеш пароля и передать ее серверу. Использовать соль от нового пароля во время grace-периода невозможно, так как сервер не может получить хеш старого пароля с новой солью, используя хеш старого пароля со старой солью. Поэтому на время grace-периода сервер отдает клиенту соль от старого хеша и хранит не только старый хеш со старой солью, но и хеш от нового пароля со старой солью. В отличие от других типов аутентификации в данном случае будет проверяться два варианта grace-паролей.

  2. Если формат хранения нового пароля отличается от формата старого, то старый пароль не будет работать во время grace-периода.

  3. Если старый пароль является транспортным, то он не будет работать во время grace-периода.

Если ограничения не выполняются, то grace-пароль не может быть сохранен. Если старый пароль является транспортным, то запрос на обновление пароля происходит без ошибок. В остальных случаях результат будет зависеть от настроенного параметра grace_skip_error. Если параметр установлен (значение on), то запрос завершится без ошибок, если параметр не установлен (значение off) - с ошибкой.

Обновление паролей использует механизм транзакций, если в процессе обновления основного пароля или grace-паролей произошла ошибка, то ни основной пароль, ни grace-пароли изменены не будут.

Процесс обновления пароля​

Схема процесса обновления пароля:

После поступления запроса на изменение пароля (от пользователя / администратора БД / администратора безопасности) происходит следующее:

  • При успешном выполнении запроса СУБД Pangolin выполняется следующие шаги:

    1. Обновление пароля в каталоге pg_authid.
    2. Сохранение старого пароль в каталоге grace-паролей, если функциональность grace-периода включена и ограничения на работу функциональности не возникают (например, пароль не должен быть транспортным).
    3. Очистка предыдущих grace-паролей.
    4. Успешное завершение выполнения запроса на обновление пароля.
  • При неудачном завершении запроса:

    1. Возникновение ошибка запроса.
    2. Произведен вывод сообщения пользователю.

Хранение grace-паролей​

Grace-пароли хранятся в отдельном каталоге, который защищен от изменения.

Удаление grace-паролей происходит в процессе аутентификации пользователя перед этапом проверки grace-пароля: если найдены записи с истекшим grace-паролем, то такие записи будут удалены.

Внимание!

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

Если у пользователя есть валидные grace-пароли, то они отображаются в представлении pg_shadow. Наличие паролей так же отображается в представлении pg_user и pg_roles. Во всех представлениях будет отображен grace-период и источник его настройки.