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

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_periodboolУстанавливает значение grace-периода (grace_authid_period) в файл grace_rotate.bin. Возвращает true при успехе
rp_set_valid_roles(text)valid_rolesboolУстанавливает список ролей, для которых включена автоматическая ротация паролей (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-периода определяется по следующей иерархии приоритетов:

  1. Высокий приоритет – сессионный параметр пользователя:

    ALTER USER/ROLE <user> SET grace_authid_period='<period>';
  2. Средний приоритет – парольная политика роли:

    SELECT set_role_policies('<user>', policy_enable('<flag_enable>'), grace_authid_period('<period>'));
  3. Низкий приоритет – значение из файла 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 из резервной копии

Рекомендуемый способ восстановления:

  1. Вызовите функцию сброса всех параметров SELECT rp_reset_file();.

  2. Если ошибка сохраняется — удалите grace_rotate.bin, чтобы файл создался автоматически. Повторно вызовите SELECT rp_reset_file();.

  3. После создания файла установите нужные параметры, если они отличаются от параметров в конфигурационном файле 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:

  1. Проверьте что расширение psql_rotate_password добавлено в параметр shared_preload_libraries конфигурационного файла, перезагрузите БД в случае изменения.

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

    SELECT rp_set_valid_roles('username');
  3. Создайте политики для пользователя. В примере политика создается с явно заданными параметрами, в качестве значений параметров взяты значения по умолчанию, при необходимости измените их:

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

    SELECT *
    FROM rotate_password('username');

    Пример ответа:

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