psql_rotate_password. Функциональность генерации случайного пароля
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения:
ext.
Расширение psql_rotate_password добавляет функцию генерации случайного пароля удовлетворяющего парольной политике.
Функции расширения
rotate_password. Генерация и установка постоянного пароля пользователя (включая ТУЗ)
Функция генерации пароля rotate_password создает новый пароль для выбранного пользователя и:
- возвращает его в качестве результата;
- изменяет его в БД.
Входные параметры функции rotate_password:
- (обязательный)
OIDили имя пользователя; - (не обязательный) длина пароля. При отсутствии будет сгенерирован по минимальной длине пароля согласно парольным политикам (случайная длина до 5 символов).
Выходной параметр: сгенерированный пароль (строковый тип данных).
Пример запроса генерации пароля для пользователя User1:
SELECT * FROM rotate_password('User1');
По умолчанию права к функции не выставлены, то есть ее может вызвать суперпользователь, либо пользователь, получивший права от схемы или БД. Отдельных правил для настройки прав не существует.
Доработка
Начиная с Pangolin 6.7.1, расширение psql_rotate_password предоставляет дополнительные функции для гибкой настройки и управления параметрами ротации паролей. Параметры хранятся в бинарном файле grace_rotate.bin, который поддерживает контрольную сумму для обеспечения целостности данных. При работе в кластерной конфигурации файл автоматически реплицируется, при условии, что расширение psql_rotate_password загружено на всех узлах через параметр shared_preload_libraries.
Если в параметр shared_preload_libraries не будет добавлен psql_rotate_password на мастере или на standalone, расширение psql_rotate_password работать не будет.
Управление параметрами
Следующие функции позволяют устанавливать, сбрасывать и просматривать параметры, используемые расширением.
| Функция | Входной аргумент | Тип возврата | Описание |
|---|---|---|---|
rp_set_grace_period(Interval) | grace_period | bool | Устанавливает значение grace-периода (grace_authid_period) в файл grace_rotate.bin. Возвращает true при успехе |
rp_set_valid_roles(text) | valid_roles | bool | Устанавливает список ролей, для которых включена автоматическая ротация паролей (rotate_password.valid_roles). Принимает строку с перечислением имен ролей через запятую. Возвращает true при успехе |
rp_reset_parameter(text) | name_parameter ('grace_period' или 'valid_roles') | bool | Сбрасывает указанный параметр в файле grace_rotate.bin к значению из конфигурационного файла postgres.yml/postgresql.conf (или postgresql.auto.conf). Если значение в конфигурации отсутствует — устанавливается значение по умолчанию |
rp_reset_file() | — | bool | Сбрасывает все параметры в grace_rotate.bin к значениям из конфигурационного файла или к значениям по умолчанию. Если в файле нет значений, то будут установлены значения по умолчанию. В случае нарушения целостности файла grace_rotate.bin значения параметров будут успешно перезаписаны, функция не вызовет ошибку |
rp_show_parameters() | — | record | Выводит текущие значения параметров, хранящихся в файле grace_rotate.bin. Результат содержит поля: grace_authid_period (interval), valid_roles (text) |
В случае нарушения целостности файла grace_rotate.bin, функции rp_set_grace_period(), rp_set_valid_roles(), rp_reset_parameter() и rp_show_parameters() будут возвращать ошибку.
Особенности работы с параметрами
Источники значений grace_authid_period
Значение grace-периода определяется по следующей иерархии приоритетов:
-
Высокий приоритет – сессионный параметр пользователя:
ALTER USER/ROLE <user> SET grace_authid_period='<period>'; -
Средний приоритет – парольная политика роли:
SELECT set_role_policies('<user>', policy_enable('<flag_enable>'), grace_authid_period('<period>')); -
Низкий приоритет – значение из файла
grace_rotate.bin(устанавливается черезrp_set_grace_period).
Значение из конфигурационного файла (postgres.yml/postgresql.conf или postgresql.auto.conf) не используется напрямую, а служит только как значение по умолчанию при создании или сбросе файла grace_rotate.bin.
Отличие SHOW от rp_show_parameters()
Команды:
SHOW grace_authid_period;
SHOW rotate_password.valid_roles;
Отображают значения, заданные в конфигурационном файле postgres.yml/postgresql.conf или postgresql.auto.conf. Эти значения используются как значения по умолчанию при инициализации grace_rotate.bin.
Для просмотра активных значений, реально используемых при подключении пользователя к базе и ротации паролей, необходимо использовать:
SELECT * FROM rp_show_parameters();
Хранение и целостность параметров
- Все параметры хранятся в бинарном файле
grace_rotate.bin. - Файл содержит контрольную сумму конкретных параметров. При повреждении файла чтение завершится с ошибкой.
- При подключении пользователя или сквозной аутентификации система читает только параметр
grace_authid_periodизgrace_rotate.bin. - При вызове представления
pg_shadowпроисходит чтение всего файла.
Обработка ошибок и восстановление
| Сценарий | Поведение | Решение |
|---|---|---|
Файл grace_rotate.bin поврежден и происходит подключение | Подключение не установлено, завершается ошибкой | Удалить или восстановить файл grace_rotate.bin из резервной копии |
| Файл отсутствует | Создается автоматически при подключении или вызове функции | Параметры берутся из конфигурационного файла postgres.yml/postgresql.conf или устанавливаются по умолчанию (если в конфигурационном файле не указаны параметры grace_authid_period и rotate_password.valid_roles). Так же возможно восстановление файла grace_rotate.bin из резервной копии |
Ошибка при вызове rotate_password, rp_set_grace_period, rp_set_valid_roles, rp_show_parameters, rp_reset_parameter или представления pg_shadow в уже активной сессии | Сессия не прерывается | Вызвать функцию rp_reset_file() для перезаписи параметров из конфигурационного файла postgres.yml/postgresql.conf (postgresql.auto.conf) или установки значений по умолчанию (если в конфигурационном файле не указаны параметры grace_authid_period и rotate_password.valid_roles). Так же возможно восстановление файла grace_rotate.bin из резервной копии |
Рекомендуемый способ восстановления:
-
Вызовите функцию сброса всех параметров
SELECT rp_reset_file();. -
Если ошибка сохраняется — удалите
grace_rotate.bin, чтобы файл создался автоматически. Повторно вызовитеSELECT rp_reset_file();. -
После создания файла установите нужные параметры, если они отличаются от параметров в конфигурационном файле
postgres.yml/postgresql.conf(postgresql.auto.conf). Пример:SELECT rp_set_grace_period('1 hour');
SELECT rp_set_valid_roles('admin,user');
Примеры использования
-- Установка grace-периода 45 минут
SELECT rp_set_grace_period('45 minutes');
-- Установка списка ролей для ротации
SELECT rp_set_valid_roles('app_user,db_admin,analyst,”User-2”');
-- Сброс grace-периода к значению из конфигурации
SELECT rp_reset_parameter('grace_period');
-- Полный сброс всех параметров
SELECT rp_reset_file();
-- Просмотр текущих активных параметров
SELECT * FROM rp_show_parameters();
Поведение по умолчанию
По умолчанию применяются значения:
grace_authid_period=0;rotate_password.valid_roles= пусто (ротация отключена для всех ролей).
Если конфигурационные параметры не заданы в postgresql.conf и файл grace_rotate.bin отсутствует, или вызван rp_reset_file(), или rp_reset_parameter() без предварительной настройки.
Данные изменения обеспечивают гибкость настройки, безопасность хранения параметров и совместимость с механизмами репликации, не нарушая стандартное поведение команд SHOW.
Информационные сообщения
При успешном вызове функции SELECT rotate_password(<user_name>); в лог будет напечатано сообщение:
Set password for role <user_name> with rotate_password function successfully
Ограничения
Ограничения отсутствуют.
Установка и активация расширения
Установка расширения может быть произведена в процессе развертывании СУБД Pangolin (документ «Руководство по установке», раздел «Автоматизированная установка при помощи Ansible-скриптов»).
Для установки расширения измените следующие параметры в кастомном конфигурационном файле:
rotate_password.enable: true
rotate_password.num_rounds: 20
В случае ручной установки при эксплуатации СУБД, создайте расширение psql_rotate_password командой:
CREATE EXTENSION psql_rotate_password schema ext;
После изменения параметра перечитайте конфигурацию:
SELECT pg_reload_conf();
Расширение устанавливается в рамках БД. Для всех баз данных, необходимым использование данной функции, рекомендуется установка расширения.
Настройка параметров
Настраиваемые параметры для генерации пароля:
-
rotate_password.num_rounds— количество попыток генерации пароля:rotate_password.num_rounds = '20'
При изменении параметра перечитайте конфигурацию:
SELECT pg_reload_conf();
В параметр shared_preload_libraries конфигурационного файла postgres.yml/postgresql.conf обязательно нужно добавить расширение psql_rotate_password (для применения изменений требуется перезагрузка БД).
Использование модуля
Генерация пароля для нового пользователя при помощи функции rotate_password:
-
Проверьте что расширение
psql_rotate_passwordдобавлено в параметрshared_preload_librariesконфигурационного файла, перезагрузите БД в случае изменения. -
Установите список ролей, для которых включена автоматическая ротация паролей, с помощью функции
rp_set_valid_roles():SELECT rp_set_valid_roles('username'); -
Создайте политики для пользователя. В примере политика создается с явно заданными параметрами, в качестве значений параметров взяты значения по умолчанию, при необходимости измените их:
SELECT *
FROM
set_role_policies('username',
policy_enable(1::boolean),
check_syntax(1::boolean),
min_length(16),
illegal_values(0::boolean),
alpha_numeric(5),
min_alpha_chars(1),
min_special_chars(1),
min_uppercase(1),
min_lowercase(1),
max_rpt_chars(2),
use_password_strength_estimator(0::boolean),
transport_password_life_time('3 days'));Пример ответа:
-[ RECORD 1 ]---------------------+-------
roleid | username
reuse_time |
in_history |
max_age |
min_age |
grace_login_limit |
grace_login_time_limit |
expire_warning |
lockout |
lockout_duration |
max_failure |
failure_count_interval |
check_syntax | t
min_length | 16
illegal_values | f
alpha_numeric | 5
min_alpha_chars | 1
min_special_chars | 1
min_uppercase | 1
min_lowercase | 1
max_rpt_chars | 2
policy_enable | t
track_login |
max_inactivity |
use_password_strength_estimator | f
password_strength_estimator_score |
custom_function |
transport_password_life_time | 3 days -
Сгенерируйте пароль для пользователя:
SELECT *
FROM rotate_password('username');Пример ответа:
rotate_password
--------------------
x3<2BTf?ma3P119_fs
(1 row)