Руководство пользователя по холодному перешифрованию объектов БД 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);
Порядок действий для перешифрования
- Смена пользователя на 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 ~]$
- Подготовка списка файлов для перешифрования.
Для работы программы требуется создать файл настроек с параметрами и список файлов
базы данных, которые будут перешифрованы. Список файлов — это перечень зашифрованных
объектов БД (таблиц, индексов и т.д.), хранящихся на диске. Настройки создаются
с помощью команды 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
- Остановка СУБД.
Необходимо остановить сервер СУБД, чтобы избежать конфликтов с доступом к файлам. (В следующей команде нужно заменить <PGDATA> на реальный путь до каталога данных.)
/usr/local/qhb/bin/qhb_ctl -D <PGDATA>/data stop
Параметры:
- -D: путь к каталогу данных СУБД.
- Выполнение перешифрования.
Запуск процесса перешифрования с использованием подготовленного списка файлов
осуществляется командой 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
- Обновление конфигурации.
Чтобы новые таблицы шифровались новым ключом, нужно обновить параметр active_key в файле <PGDATA>/qss2_config.toml с помощью текстового редактора.
- Запуск СУБД.
Необходимо запустить сервер СУБД после перешифрования. (В следующей команде нужно заменить <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;
В результате будут выведены такие же данные, как до перешифрования.
Оценка временных затрат
Утилита дает возможность оценить временные затраты на перешифрование данных. Для этого необходимо:
- Проверить, указан ли путь к исполняемым файлам СУБД QHB:
$echo $PATH
/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
Если путь отсутствует, добавить его следующей командой:
export PATH="/usr/local/qhb/bin:$PATH"
- Определить требуемое время на перешифрование.
Вызвать утилиту с командой 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