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

Функции для поддержки ротации и изменения ключей кодирования на стороне БД

Функции, представленные в данном разделе, реализованы в рамках интеграции с KMS HashiCorp Vault.

block_rotate_master_key()

Функция block_rotate_master_key служит для исключения ротации мастер-ключа TDE на кластере при работе таких утилит, как pg_rewind.

Синтаксис:

block_rotate_master_key()
RETURNS void

Входные параметры:

Отсутствуют.

Возвращаемые значения:

Отсутствуют. В случае успешного выполнения функции значение вернется пустым.

Пример использования:

SELECT * FROM block_rotate_master_key();

unblock_rotate_master_key()

Функция unblock_rotate_master_key снимает блокировку изменения мастер-ключа на кластере.

Синтаксис:

unblock_rotate_master_key()
RETURNS void

Входные параметры:

Отсутствуют.

Возвращаемые значения:

Отсутствуют. В случае успешного выполнения функции значение вернется пустым.

Пример использования:

SELECT * FROM unblock_rotate_master_key();

rotate_master_key()

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

Синтаксис:

rotate_master_key()
RETURNS boolean

Входные параметры:

Отсутствуют.

Возвращаемые значения:

Булево значение.

Пример использования:

SELECT * FROM rotate_master_key();

set_master_key()

Для установки нового значения мастер-ключа необходимо воспользоваться функцией set_master_key. Эта процедура аналогична ротации мастер-ключа, но в этом случае ключ устанавливает администратор безопасности.

примечание

Сгенерировать новый мастер-ключ можно с помощью утилиты generate_encryption_key, которая расположена в директории /opt/pangolin-security-utilities/bin/..

Синтаксис:

set_master_key(new_master_key text)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
new_master_keytextКлюч, закодированный по стандарту base64

Возвращаемое значение:

Булево значение.

Пример использования:

SELECT * FROM set_master_key('new_master_key');

reencrypt_keys()

Для того чтобы выполнить перекодирование локального хранилища ключей на сервере keyring актуальным мастер-ключом, опираясь на информацию о предыдущем использованном мастер-ключе, необходимо воспользоваться функцией reencrypt_keys.

Синтаксис:

reencrypt_keys()
RETURNS boolean

Входные параметры:

Отсутствуют.

Возвращаемые значения:

Булево значение.

Пример использования:

SELECT * FROM reencrypt_keys();

restore_keys()

Для восстановления ключей кодирования при сбое перекодирования необходимо воспользоваться функцией restore_keys. Данная функция перекодирует локальное хранилище ключей keyring актуальным мастер-ключом, в том числе поддерживает нахождение мастер-ключа из истории в хранилище секретов, которым был закодирован конкретный ключ кодирования объекта. Используется, в том числе при восстановлении резервных копий, снятых во время действия предыдущих мастер-ключей.

Синтаксис:

restore_keys()
RETURNS boolean

Входные параметры:

Отсутствуют.

Возвращаемые значения:

Булево значение.

Пример использования:

SELECT * FROM restore_keys();

get_last_master_key_rotation_time()

Возвращает дату и время установки, либо ротации мастер-ключа.

Синтаксис:

get_last_master_key_rotation_time()
RETURNS timestamp with time zone

Входные параметры:

Отсутствуют.

Возвращаемые значения:

Дата и время (timestamp) последней ротации или установки мастер-ключа кодирования.

Заметки об использовании:

В общем понимании, функция get_last_master_key_rotation_time возвращает время установки последней версии мастер-ключа. Это означает, что timestamp, полученный вызовом функции, может относиться не к используемому на реплике мастер-ключу, а к актуальному мастер-ключу в хранилище секретов. Однако фоновый процесс MKeyChecker через некоторое время актуализирует ключ на реплике. По умолчанию периодичность запусков MKeyChecker (mkeychecker_delay) составляет 5 минут.

Идентификатор ключа функция получает в одном из следующих источников в указанном порядке:

  1. Хранилище секретов – исследуется секрет actual_master_key_created;
  2. Кеш хранилища секретов – исследуется секрет actual_master_key_created;
  3. Локальный файл $PGDATA/global/enc_settings.cfg – исследуется идентификатор актуального мастер-ключа. Если ключ был сгенерирован, то должен иметь префикс в виде времени своего создания.
  4. Идентификатор актуального мастер-ключа, хранимый в памяти СУБД.

Пример использования:

SELECT get_last_master_key_rotation_time();

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

 get_last_master_key_rotation_time 
-----------------------------------
2025-10-28 16:35:51.576+03
(1 row)

rotate_wal_key()

Функция ротации WAL-ключа.

Синтаксис:

rotate_wal_key ()
RETURNS boolean

Входные параметры:

Отсутствуют.

Возвращаемое значение:

Булево значение.

Пример использования:

SELECT * FROM rotate_wal_key();

set_wal_key()

Замена wal_key на предложенный, закодированный в формате base64. Ключ имеет длину ровно 32 байта.

примечание

Сгенерировать новый WAL-ключ можно с помощью утилиты generate_encryption_key, которая расположена в директории /opt/pangolin-security-utilities/bin.

Синтаксис:

set_wal_key(new_wal_key TEXT)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
new_wal_keytextКлюч, закодированный по стандарту base64

Возвращаемое значение:

Булево значение.

Пример использования:

SELECT * FROM set_wal_key('new_wal_key');

get_last_wal_key_rotation_time()

Возвращает дату и время установки/ротации WAL-ключа.

Синтаксис:

get_last_wal_key_rotation_time()
RETURNS timestamp with time zone

Входные параметры:

Отсутствуют.

Возвращаемые значения:

Дата и время (timestamp) последней ротации или установки WAL-ключа.

Пример использования:

SELECT get_last_wal_key_rotation_time();

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

 get_last_wal_key_rotation_time 
-------------------------------
2025-11-01 08:39:03.435974+03
(1 row)