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

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

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

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

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

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

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

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

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

    • создание, удаление и изменение политики;

    • активация и деактивация политики;

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

Настройка#

Настройки механизма хранятся в файле конфигурации и таблице 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

Включает (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), пароль передается хешем

Внимание

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

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

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

Функциональность

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

Зависимые параметры

Хранение паролей

Один из: reusetime или inhistory

-

Изменение пароля

minage

-

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

checksyntax

minlength, alphanumeric, minalphachars, minspecialchars, minuppercase, minlowercase, maxrptchars

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

illegalvalues

-

Проверка пароля библиотекой zxcvbn

usepasswordstrengthestimator

passwordstrengthestimatorscore

Пользовательская PSQL функция проверки пароля

customfunction

-

Аутентификация

maxage, graceloginlimit, gracelogintimelimit, lockout, lockoutduration, maxfailure, failurecountinterval, tracklogin, maxinactivity

-

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

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

Параметр

Описание

Тип

POSIX шаблон

Значение по умолчанию

Аналог в pg_pp_policy

password_policy.policy_enable

Включение/выключение парольной политики

boolean

on/off

on

policyenable

password_policy.deny_default

Включение/выключение использования настроек из postgresql.conf

boolean

on/off

off

-

password_policy.psql_encrypt_password

Шифрование пароля при передаче от клиента к БД

boolean

on/off

-

-

password_policy.deduplicate_ssl_no_ssl_fail_auth_attempts

Включение механизма исключения повторных попыток подключения psql

boolean

on/off

on

-

password_policy.allow_hashed_password

Разрешить задание пароля в виде хеша

boolean

on/off

off

-

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

Параметр

Описание

Тип

POSIX шаблон

Ограничение значения

Значение по умолчанию

Специальные значения параметров

Аналог в pg_pp_policy

password_policy.reuse_time

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

string

\d+ s

неотрицательное

365 days

-

reusetime

password_policy.in_history

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

integer

[0-1000]

0-1000

4

0 – Проверка на совпадение пароля с ранее использованным не проводится (при условии reuse_time = 0)

inhistory

Примечание

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

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

Параметр

Описание

Тип

POSIX шаблон

Ограничение значения

Значение по умолчанию

Специальные значения параметров

Аналог в pg_pp_policy

password_policy.max_age

Время жизни пароля в секундах

string

\d+ s

неотрицательное

0

0 – Проверка максимального времени жизни пароля не производится

maxage

password_policy.min_age

Минимальное время между изменениями пароля

string

\d+ s

неотрицательное

0

0 – Проверка максимального времени жизни пароля не производится

minage

password_policy.grace_login_limit

Максимальное количество аутентификаций после истечения срока действия пароля

integer

[0-1000]

0-1000

0

-

graceloginlimit

password_policy.grace_login_time_limit

Время, в течение которого пароль остается рабочим после окончания срока его действия

string

\d+ s

неотрицательное

3 days

0 – аутентификация не доступна по истечении времени жизни пароля

gracelogintimelimit

password_policy.expire_warning

Время до истечения пароля, при котором выводится предупреждение

string

\d+ s

неотрицательное

7 days

0 – не выводит предупреждение

expirewarning

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

Параметр

Описание

Тип

POSIX шаблон

Ограничение значения

Значение по умолчанию

Специальные значения параметров

Аналог в pg_pp_policy

password_policy.lockout

Блокировка аккаунта при достижении максимума неверных попыток аутентификации

boolean

on/off

on/off

on

-

lockout

password_policy.max_failure

Максимальное количество неверных попыток аутентификации

integer

[1-1000]

1-1000

6

-

maxfailure

password_policy.failure_count_interval

Время, после которого количество неверных попыток сбрасывается

string

\d+ s

>= 0

0

0 – счетчик не обнуляется

failurecountinterval

password_policy.lockout_duration

Время блокировки аккаунта

string

\d+ s

неотрицательное

24 hours

0 – блокировка пользователя по количеству неудачных аутентификаций бессрочна

lockoutduration

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

Параметр

Описание

Тип

Ограничение значения

Значение по умолчанию

Специальные значения параметров

Аналог в pg_pp_policy

password_policy.check_syntax

Включение синтаксической проверки пароля

boolean

on/off

on

checksyntax

password_policy.alpha_numeric

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

integer

0-1000

3

0 – не проверять

alphanumeric

password_policy.min_length

Минимальная длина пароля

integer

0-1000

16

0 – не проверять

minlength

password_policy.min_alpha_chars

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

integer

0-1000

0

0 – не проверять

minalphachars

password_policy.min_special_chars

Минимальное количество специальных символов

integer

0-1000

0

0 – не проверять

minspecialchars

password_policy.min_uppercase

Минимальное количество прописных букв

integer

0-1000

1

0 – не проверять

minuppercase

password_policy.min_lowercase

Минимальное количество строчных букв

integer

0-1000

0

0 – не проверять

minlowercase

password_policy.max_rpt_chars

Максимальное количество повторяющихся символов

integer

0-1000

0

0 – не проверять

maxrptchars

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

Параметр

Описание

Тип

Ограничение значения

Значение по умолчанию

Специальные значения параметров

Аналог в pg_pp_policy

password_policy.track_login

Запоминать ли время последней аутентификации

boolean

on/off

off

tracklogin

password_policy.max_inactivity

Время последней аутентификации, после которого аккаунт блокируется

string

неотрицательное

0

0 – функциональность отключена

maxinactivity

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

Параметр

Описание

Тип

POSIX шаблон

Ограничение значения

Значение по умолчанию

Аналог в pg_pp_policy

password_policy.use_password_strength_estimator

Включение использования библиотеки zxcvbn для оценки сложности пароля

boolean

on/off

on/off

on

usepasswordstrengthestimator

password_policy.password_strength_estimator_score

Минимальная оценка сложности пароля

integer

[0-4]

0-4

3

passwordstrengthestimatorscore

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

Параметр

Описание

Тип

POSIX шаблон

Значение по умолчанию

Аналог в pg_pp_policy

password_policy.custom_function

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

string

[\w\d]+

-

customfunction

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

Параметр

Описание

Тип

Ограничение значения

Значение по умолчанию

Аналог в pg_pp_policy

password_policy.illegal_values

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

boolean

on/off

on

illegalvalues

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

Параметр

Описание

Тип

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 пароль отмечается транспортным вручную

boolean

false

-

transport_password_life_time

Определяет время жизни транспортного пароля

string

0

transportpasswordlifetime

password_policy.is_temp_tuz_password

Определяет тип пароля (транспортный или нет) для указанных ТУЗ

boolean

true

-

Таблицы#

В механизме управления парольной политикой используются таблицы 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:

Название колонки

Тип

Характеристика

Примечание

roloid

regrole

P, N

Идентификатор роли

lastsuccesstime

timestamptz

N

Время последнего успешного входа в систему с использованием этого пароля

createtime

timestamptz

N

Время создания пароля

archivetime

timestamptz

P, N

Время перемещения пароля в таблицу

password

text

P, N

Хеш пароля

pg_pp_password#

Таблица с информацией о текущем пароле pg_pp_password:

Название колонки

Тип

Характеристика

Описание

roloid

regrole

P, U, N

Идентификатор роли

failcounter

integer

-

Количество попыток входа (подряд) с использованием неверного пароля

gracesuccesscounter

integer

-

Счетчик удачных аутентификаций после истечения времени жизни пароля

lastfailtime

timestamptz

N

Метка времени последней неудачной аутентификации

lastsuccesstime

timestamptz

N

Время последнего успешного входа в систему с использованием этого пароля

createtime

timestamptz

N

Время создания текущего пароля

unblockexpirytime

timestamptz

-

Время разблокировки, если роль была заблокирована в связи с неактивностью

istransportpassword

boolean

-

Является ли данный пароль транспортным

pg_pp_policy#

Таблица парольных политик pg_pp_policy:

Название колонки

Тип

Характеристика

Описание

Отключаемая функциональность, если значение не задано

roloid

regrole

P, U, N

Идентификатор роли

-

reusetime

interval

-

Время, в течение которого старый пароль сохраняется, и попытка сменить пароль на совпадающий со старым заканчивается ошибкой

Изменение пароля, если не задано inhistory

inhistory

integer

-

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

Изменение пароля, если не задано reusetime

maxage

interval

-

Время жизни пароля, после которого пароль считается истекшим

Аутентификация

minage

interval

-

Время, которое должно пройти между двумя изменениями пароля

Изменение пароля

graceloginlimit

integer

-

Максимальное количество аутентификаций, доступных роли после истечения времени жизни пароля

Аутентификация, если пароль просрочен

gracelogintimelimit

interval

-

Время после окончания действия пароля, в течение которого он продолжает работать

Аутентификация, если пароль просрочен

expirewarning

interval

-

Время до окончания действия пароля, в течении которого пользователю будет отображаться предупреждение. Предупреждение отображается в консоли PSQL после аутентификации или после коммита

-

lockout

boolean

-

Признак включенного правила блока аккаунта в результате достижения максимума попыток входа с неверным паролем

Аутентификация

lockoutduration

interval

-

Время, на которое блокируется аккаунт в результате достижения максимума попыток входа с неверным паролем

Аутентификация, если lockout = true

maxfailure

integer

-

Максимальное количество подряд введенных неверных паролей, при достижении которого вызывается блокировка пароля

Аутентификация, если lockout = true

failurecountinterval

interval

-

Время, после которого обнуляется количество неверных вводов пароля

Аутентификация, если lockout = true

checksyntax

boolean

-

Признак включенных правил синтаксической проверки пароля (если она возможна)

Изменение пароля

minlength

integer

-

Минимальная длина пароля

Изменение пароля, если checksyntax = true

illegalvalues

boolean

-

Признак включенного правила проверки пароля по списку часто используемых

Изменение пароля

alphanumeric

integer

-

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

Изменение пароля, если checksyntax = true

minalphachars

integer

-

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

Изменение пароля, если checksyntax = true

minspecialchars

integer

-

Минимальное количество символов в пароле, не являющихся буквой или цифрой

Изменение пароля, если checksyntax = true

minuppercase

integer

-

Минимальное количество прописных букв

Изменение пароля, если checksyntax = true

minlowercase

integer

-

Минимальное количество строчных букв

Изменение пароля, если checksyntax = true

maxrptchars

integer

-

Максимальное количество повторяющихся символов

Изменение пароля, если checksyntax = true

policyenable

boolean

-

Признак включенной политики

-

tracklogin

boolean

-

Запоминать ли время последней аутентификации

Аутентификация

maxinactivity

interval

-

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

Аутентификация, если tracklogin = true и превышен интервал неактивности

usepasswordstrengthestimator

boolean

-

Использовать библиотеку zxcvbn для проверки пароля

Изменение пароля

passwordstrengthestimatorscore

integer

-

Минимальная допустимая сложность пароля

Изменение пароля, если usepasswordstrengthestimator = true

customfunction

string

-

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

Изменение пароля

transportpasswordlifetime

interval

-

Время жизни транспортного пароля

-

graceauthperiod

interval

-

Время после истечения пароля (до блокировки), с возможностью продолжения пользования системой

-

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

  • pp_password_detailed — для мониторинга состояния ролей;

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

Примечание:

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

pp_password_detailed#

Представление для мониторинга состояния ролей.

Название поля

Описание

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

Источник

roleid

ID пользователя

user1

Данные пользователя, хранящиеся в кеше

fail_counter

Счетчик неудачных аутентификаций

6

Данные пользователя, хранящиеся в кеше

last_fail_time

Метка времени последней неудачной аутентификации

2020-09-15, 12:01:25.740155+03

Данные пользователя, хранящиеся в кеше

grace_success_counter

Счетчик входов после истечения времени жизни пароля

0

Данные пользователя, хранящиеся в кеше

last_success_time

Метка времени последней удачной аутентификации

Данные пользователя, хранящиеся в кеше

create_time

Метка времени создания пароля

2020-09-15, 12:00:52.848626+03

Данные пользователя, хранящиеся в таблице pg_pp_password

unblock_expiry_time

Метка времени разблокировки

Данные пользователя, хранящиеся в кеше

istransportpassword

Является ли данный пароль транспортным

f

is_auth_available

Доступна ли аутентификация

f

check_policy_for_max_age && check_policy_for_lockout && check_policy_for_inactivity_check && check_policy_for_password_check && check_lockout && check_inactivity && check_password_age

is_blocked

Заблокирован ли пользователь

t

!(check_lockout && check_inactivity && check_password_age)

check_policy_for_max_age

Проверка значений политики для проверки времени жизни пароля

t

Результат функций проверки политик перед самой проверкой. Сначала проверяется, что все необходимые политики заданы (не NULL), затем начинается проверка пользователя на блок по количеству неудачных аутентификаций (lockout). Возможна ошибка, если включена настройкаdeny_default (запрет использования настроек из файла postgresql.conf), а политика не задана или задана не полностью

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 wasn't unblocked. Role was blocked with 6 fail authentification attempts. Last fail at 15.09.2020 12:01:25

Результат проверок аутентификации

check_inactivity

Проверка блока по неактивности

t

Результат проверок аутентификации

check_inactivity_text

Проверка блока по неактивности (текстовый вывод)

OK. Last success authentification time is undefined.

Результат проверок аутентификации

check_password_age

Проверка блока по времени жизни пароля

t

Результат проверок аутентификации

check_password_age_text

Проверка блока по времени жизни пароля (текстовый вывод)

Max password age check passed. Password will expire in 39 days

Результат проверок аутентификации

check_policy_for_transport_password

Проверка значений политики для проверки транспортного пароля

t

Результат проверки транспортного пароля

check_policy_for_transport_password_text

Проверка значений политики для проверки транспортного пароля (текстовый вывод)

OK

Результат проверки транспортного пароля

check_transport_password_life_time

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

t

Результат проверки транспортного пароля

check_transport_password_life_time_text

Проверка времени жизни транспортного пароля (текстовый вывод)

OK. Transport password is not expired.

Результат проверки транспортного пароля

pp_password#

Представление для просмотра кеша парольных политик.

Название поля

Описание

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

Источник

roleid

ID пользователя

user1

Данные пользователя, хранящиеся в кеше

fail_counter

Счетчик неудачных аутентификаций

6

Данные пользователя, хранящиеся в кеше

last_fail_time

Временная метка последней неудачной аутентификации

2020-09-15, 12:01:25.740155+03

Данные пользователя, хранящиеся в кеше

grace_success_counter

Счетчик входов после истечения времени жизни пароля

0

Данные пользователя, хранящиеся в кеше

last_success_time

Временная метка последней удачной аутентификации

Данные пользователя, хранящиеся в кеше

create_time

Метка времени создания пароля

2020-09-15, 12:00:52.848626+03

Данные пользователя, хранящиеся в таблице pg_pp_password

unblock_expiry_time

Метка времени разблокировки

Данные пользователя, хранящиеся в кеше

istransportpassword

Является ли данный пароль транспортным

f

Данные пользователя, хранящиеся в таблице pg_pp_password

Функции#

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

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

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

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

      > 0

      inhistory

      maxage

      = NULL, = 0

      graceloginlimit, gracelogintimelimit, expirewarning

      lockout

      = NULL, = false

      lockoutduration, maxfailure, failurecountinterval

      checksyntax

      = NULL, = false

      minlength, alphanumeric, minalphachars, minspecialchars, minuppercase, minlowercase, maxrptchars

      tracklogin

      = NULL, = false

      maxinactivity

      usepasswordstrengthestimator

      = NULL, = false

      passwordstrengthestimatorscore

  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) пароль ТУЗ может пользователь с правами групповой роли 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 '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 буква.

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

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

    CREATE USER username_1 WITH ENCRYPTED PASSWORD 'd*ZGhpFA8jsH451b_';
    

    Вывод:

    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. Откройте конфигурационный файл postgersql.conf.

  2. Добавьте или измените следующие параметры:

    • rotate_password_enable = 'on' — включение функции генерации пароля;

    • rotate_password_num_rounds:'20' — количество попыток генерации пароля;

    • rotate_password.valid_roles = 'user1, user2, user3' — список пользователей (через запятую), для которых разрешена генерация пароля.

  3. При изменении параметров перечитайте конфигурацию (reload).

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

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

  • Исчерпано количество попыток: превышено значение параметра rotate_password_num_rounds;

  • Пользователь не входит в список ролей: убедитесь, что пользователь указан в параметре rotate_password.valid_roles;

  • Невозможно сгенерировать подходящий пароль: комбинация синтаксических требований и длины пароля не позволяет создать соответствующий требованиям пароль.

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

  1. Установите значение („username“) параметра rotate_password.valid_roles в конфигурационном файле. Для применения изменений перечитайте конфигурацию (reload).

  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)