Руководство пользователя по холодному перешифрованию объектов БД QHB

Холодное перешифрование объектов БД — это процесс изменения ключей шифрования для ранее зашифрованных таблиц, индексов и других объектов базы данных, выполняемый с остановкой СУБД. Перешифрование может потребоваться из соображений безопасности или при истечении срока действия текущего ключа. Операция проводится с помощью утилиты qhb_recrypt, которая входит в состав поставки QHB. Эта утилита работает в связке с QSS (Quantum Security Server), который управляет ключами шифрования.



Предварительные требования

Установленные компоненты:

  • QHB;
  • QSS.

Конфигурация:

  • Инициализированная база данных с зашифрованными таблицами;
  • Файл <PGDATA>/qss2_config.toml должен быть доступен для чтения (где <PGDATA> — реальный путь к каталогу данных);
  • Наличие нескольких (не менее двух) активных ключей шифрования в QSS. Проверяется с помощью команды key list утилиты qss-admin.

Пример вывода команды qss-admin (выполняется от имени привилегированного пользователя):

# qss-admin admin
Введите пароль для администратора "admin":
info: Соединение с QSS успешно.
admin@qss-admin:# key list
info: Получен список рабочих ключей (4 шт.):
№	ID			Действителен до:		Дней:	Статус:		Тип:		Название:
0	0x2D6CEC4F86EE42FF	2026-09-10T00:53:18+03:00	449	Разблокирован	kuznyechik	foo
1	0x2A66E47E9219B490	2026-09-10T00:53:24+03:00	449	Разблокирован	kuznyechik	bar
2	0x359E3F40F10F47E2	2026-09-10T00:54:40+03:00	449	Разблокирован	tc26_2012_256b	ec256
3	0x4C4FCCC245945E92	2026-09-11T07:19:21+03:00	450	Разблокирован	kuznyechik	baz

Пример конфигурационного файла <PGDATA>/qss2_config.toml:

active_key = "bar"
provider = "compressed-append"
socket_address = "/run/qss/client.socket"

Пример создания и наполнения зашифрованной таблицы:

CREATE TABLE test (
   id SERIAL PRIMARY KEY,
   title TEXT,
   author_id INT,
   created DATE
) USING qss;

INSERT INTO test (title, author_id, created)
SELECT md5(random()::text), (100*random())::int, NOW() - '1 day'::interval * (random()::int * 100 + 100)
  FROM generate_series(1, 10);


Порядок действий для перешифрования

  1. Смена пользователя на qhb.

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

    id qhb

Если пользователь существует, команда вернет его UID, GID и группы, например: uid=1001(qhb) gid=1001(qhb) groups=1001(qhb).

Проверка наличия оболочки в /etc/passwd:

grep '^qhb' /etc/passwd

Ожидаемый вывод, например: qhb:x:1001:1001::/usr/local/qhb:/bin/bash. Если оболочка /bin/false или /sbin/nologin, логин невозможен. Для включения логина измените оболочку (от root):

usermod -s /bin/bash qhb

Проверка прав пользователя на домашний каталог:

ls -ld ~qhb

Ожидаемый вывод, например: drwxr-xr-x 2 qhb qhb 4096 Jun 23 2025 /home/qhb. Необходимо убедиться, что каталог принадлежит qhb и имеет права на запись (например, drwxr-xr-x или 700). Если прав нет, необходимо это исправить, выполнив команды от root:

chown qhb:qhb /usr/local/qhb
chmod 700 /usr/local/qhb

Проверка возможности записи:

su - qhb -c "touch ~/testfile && echo 'Запись возможна' || echo 'Запись невозможна'"

Примечание
При необходимости нужно заменить /usr/local/qhb на актуальный домашний каталог, указанный в /etc/passwd.

Переключение на пользователя qhb от имени root:

su - qhb

Результат: вход в сессию пользователя qhb. Командная строка изменится, например, на:

[qhb@dba03 ~]$
  1. Подготовка списка файлов для перешифрования.

Для работы программы требуется создать файл настроек с параметрами и список файлов базы данных, которые будут перешифрованы. Список файлов — это перечень зашифрованных объектов БД (таблиц, индексов и т.д.), хранящихся на диске. Настройки создаются с помощью команды prepare-list.

/usr/local/qhb/bin/qhb_recrypt prepare-list --encrypt-key baz --dbname qhb

Параметры:

  • --encrypt-key: имя нового ключа шифрования (например, baz);
  • --dbname: имя базы данных (например, qhb).

В результате в каталоге /usr/local/qhb/.qhb_recrypt будет создано два файла.

# ls /usr/local/qhb/.qhb_recrypt
config.toml  file_list.txt

# cat /usr/local/qhb/.qhb_recrypt/config.toml
active_key = "baz"
socket_address = "/run/qss/client.socket"
shmem = true
tail_file = "/qhb/qhb-qss/data/global/qss2_compressed_tails.bin"

# cat /usr/local/qhb/.qhb_recrypt/file_list.txt
/qhb/qhb-qss/data/base/5/16400
/qhb/qhb-qss/data/base/5/16406
  1. Остановка СУБД.

Необходимо остановить сервер СУБД, чтобы избежать конфликтов с доступом к файлам. (В следующей команде нужно заменить <PGDATA> на реальный путь до каталога данных.)

/usr/local/qhb/bin/qhb_ctl -D <PGDATA>/data stop

Параметры:

  • -D: путь к каталогу данных СУБД.
  1. Выполнение перешифрования.

Запуск процесса перешифрования с использованием подготовленного списка файлов осуществляется командой recrypt.

/usr/local/qhb/bin/qhb_recrypt recrypt

Утилита перешифрует указанные файлы с новым ключом.

[qhb@dba03 ~]$ /usr/local/qhb/bin/qhb_recrypt recrypt
[INFO] Done recrypting /qhb/qhb-qss/data/base/5/16400
[INFO] Done recrypting /qhb/qhb-qss/data/base/5/16406
  1. Обновление конфигурации.

Чтобы новые таблицы шифровались новым ключом, нужно обновить параметр active_key в файле <PGDATA>/qss2_config.toml с помощью текстового редактора.

  1. Запуск СУБД.

Необходимо запустить сервер СУБД после перешифрования. (В следующей команде нужно заменить <PGDATA> на реальный путь до каталога данных.)

/usr/local/qhb/bin/qhb_ctl -D <PGDATA>/data -l <PGDATA>/logfile start

Параметры:

  • -D: путь к каталогу данных СУБД;
  • -l: путь к файлу логов.

Проверка доступа к таблице через psql:

/usr/local/qhb/bin/psql qhb
select * from test limit 10;

В результате будут выведены такие же данные, как до перешифрования.



Оценка временных затрат

Утилита дает возможность оценить временные затраты на перешифрование данных. Для этого необходимо:

  1. Проверить, указан ли путь к исполняемым файлам СУБД QHB:
$echo $PATH

/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

Если путь отсутствует, добавить его следующей командой:

export PATH="/usr/local/qhb/bin:$PATH"
  1. Определить требуемое время на перешифрование.

Вызвать утилиту с командой estimate, с указанием имени БД, подлежащей перешифрованию:

$ /usr/local/qhb/bin/qhb_recrypt estimate --dbname qhb

[INFO] Temp directory for test objects: /tmp/qhb-estimate-recrypt-SCrMzb
[INFO] Using DBMS data directory: /qhb/qhb-qss/data
[INFO] Running recrypt command...

┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                                     qhb                                                     │
├──────────┬────────────┬──────────────────────┬────────────────────────────────┬──────────┬──────────────────┤
│ rel_kind │ rel_schema │ rel_name             │ file_path                      │ bytes    │ recrypt_duration │
├──────────┼────────────┼──────────────────────┼────────────────────────────────┼──────────┼──────────────────┤
│ index    │ public     │ encripted_table_pkey │ /qhb/qhb-qss/data/base/5/16406 │ 16.0 kiB │ 6ms              │
├──────────┼────────────┼──────────────────────┼────────────────────────────────┼──────────┼──────────────────┤
│ table    │ public     │ encripted_table      │ /qhb/qhb-qss/data/base/5/16400 │ 8.0 kiB  │ 3ms              │
├──────────┼────────────┼──────────────────────┼────────────────────────────────┼──────────┼──────────────────┤
│          │            │                      │                                │ 24.0 kiB │ 9ms              │
└──────────┴────────────┴──────────────────────┴────────────────────────────────┴──────────┴──────────────────┘

Размер тестового объекта: 16.0 kiB
Время перешифрования тестового объекта: 6ms
Общий размер всех баз данных: 24.0 kiB
Оценочное время перешифрования всех баз данных: 9ms