Функции для поддержки ротации и изменения ключей кодирования на стороне БД
Функции, представленные в данном разделе, реализованы в рамках интеграции с 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_key | text | Ключ, закодированный по стандарту 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 минут.
Идентификатор ключа функция получает в одном из следующих источников в указанном порядке:
- Хранилище секретов – исследуется секрет
actual_master_key_created; - Кеш хранилища секретов – исследуется секрет
actual_master_key_created; - Локальный файл
$PGDATA/global/enc_settings.cfg– исследуется идентификатор актуального мастер-ключа. Если ключ был сгенерирован, то должен иметь префикс в виде времени своего создания. - Идентификатор актуального мастер-ключа, хранимый в памяти СУБД.
Пример использования:
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_key | text | Ключ, закодированный по стандарту 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)