Модуль безопасного хранения QSS
Описание
Модуль безопасного хранения «КВАНТ-ГИБРИД» (Quantum Secure Storage, QSS) позволяет создавать таблицы, которые шифруются с поддержкой криптоалгоритма ГОСТ Р 3412-15 "Кузнечик" при записи на диск.
При старте сервера СУБД главный процесс QHB читает с диска мастер-ключ шифрования и сохраняет его в разделяемой памяти, доступной дочерним процессам.
При чтении/записи блока или страницы с/на диск этот ключ используется для их расшифровки и зашифрования.
Использование
Использование модуля в SQL:
create table t_qss(c1 int, c2 varchar) USING qss;
В qhb.conf добавляется параметр qss_mode: int с возможными режимами:
- 0 — выключен: попытка создания новых таблиц с
using qss
или чтение/запись в уже существующие приведет к ошибкам; - 1 — включен: при запуске сервера считывается qss.toml и производится загрузка актуального мастер-ключа с его расшифровкой; при любых ошибках сервер останавливается.
Также, для ускорения работы с таблицей, возможно создать ее с параметром HOLDMEM. Для этого необходимо при создании пометить эту таблицу как UNLOGGED и добавить WITH (HOLDMEM = ONLY). Запрос на создание такой таблицы выглядит так:
CREATE UNLOGGED TABLE TABLE_NAME (...) USING qss WITH (HOLDMEM = ONLY)
Дополнительную информацию см. в разделе HOLDMEM.
Файлы, используемые в QSS:
.
└── PGDATA
├── base
├── qhb.conf
└── qss
├── 0.key
├── 1.key
└── qss.toml
В qss.toml хранятся общие настройки qss (например путь к динамической библиотеке работы с криптографическим маркером (криптотокеном)) и дополнительная информация по ключам, например режим расшифровки ключа:
- не зашифрован;
- ключ расшифровки находится в файловой системе, например, на примонтированном usb, с указанием пути;
- ключ расшифровки находится на криптотокене, с указанием его идентификатора.
Бинарная версии ключа (файл .key) состоит из заголовка постоянного размера с информацией: версия (1), режим расшифровки (должен совпадать с записью в файле конфигурации) и 32 байта зашифрованного мастер-ключа.
Утилита qss_mgr и управление ключами
Для управления ключами используется утилита qss_mgr
со следующими командами:
bash-4.2$ qss_mgr --help
qss_mgr 1.1.0
qss создает защищенное хранилище в базе данных QHB
ПРИМЕНЕНИЕ:
qss_mgr [ФЛАГИ] [ПАРАМЕТРЫ] <СУБКОМАНДА>
ФЛАГИ:
-h, --help
Выводит справочную информацию
--new
Работает с набором ключей для замены ключа
-V, --version
Выводит информацию о версии
ПАРАМЕТРЫ:
-d, --data-dir <каталог-данных>
Указывает каталог с данными базы данных [env: PGDATA=/tmp/qhb-data/]
СУБКОМАНДЫ:
add Добавить новую версию мастер-ключа, зашифрованную другим секретным ключом
del Удалить ключ
help Вывести данное сообщение или справку по заданным субкомандам
init Запустить файл конфигурации и первый зашифрованный мастер-ключ
use-new Создать резервную копию текущего набора ключей и заменить его новым
verify Проверить ключ или ключи
Общий флаг --new позволяет работать с «новым» набором ключей, переключиться на который можно командой use-new
.
Инициализация с добавлением первого мастер-ключа
Примечание
в режиме pkcs11 для ввода пин-кода используется утилитаqss-pinpad
, запущенная на этом же компьютере в другом терминале.
Запуск файла конфигурации и первого зашифрованного мастер-ключа
ПРИМЕНЕНИЕ:
qss_mgr init [ПАРАМЕТРЫ] [мастер-ключ]
ПАРАМЕТРЫ:
-k, --key <ключ> Ключ для шифрования
-f, --key-format <формат-ключа> Формат шифруемого ключа: bin, base64, armored [по умолчанию: bin]
--master-key-format <формат-мастер-ключа> Формат исходного мастер-ключа: bin, base64, armored [по умолчанию: bin]
-m, --mode <режим> Режим шифрования мастер-ключа: fs, pkcs11 [по умолчанию: pkcs11]
--module <путь-к-модулю-pkcs11> Модуль PKCS11
--token-key-id <id-ключа-токена> ID пользовательского ключа на токене для pkcs11
--token-serial-number <серийный-номер-токена> Серийный номер токена для pkcs11
АРГУМЕНТЫ:
<master-key> Файл исходного мастер-ключа
Добавление мастер-ключа, зашифрованного ключом другого пользователя
Добавление новой версии мастер-ключа, зашифрованного другим секретным ключом
ПРИМЕНЕНИЕ:
qss_mgr add [ПАРАМЕТРЫ] [мастер-ключ]
ПАРАМЕТРЫ:
-k, --key <ключ> Ключ для шифрования
-f, --key-format <формат-ключа> Формат шифруемого ключа: bin, base64, armored [по умолчанию: bin]
--master-key-format <формат-мастер-ключа> Формат исходного мастер-ключа: bin, base64, armored [по умолчанию: bin]
-m, --mode <режим> Режим шифрования мастер-ключа: fs, pkcs11 [по умолчанию: pkcs11]
-n, --num <индекс> Индекс предыдущего ключа, откуда загружается мастер-ключ
--token-key-id <id-ключа-окена> ID пользовательского ключа на токене для pkcs11
--token-serial-number <серийный-номер-токена> Серийный номер токена для pkcs11
АРГУМЕНТЫ:
<мастер-ключ> Файл исходного мастер-ключа
Удаление ключа
Удаление ключа
ПРИМЕНЕНИЕ:
qss_mgr del [ФЛАГИ] --num <индекс>
ФЛАГИ:
-q, --quiet Тихий режим: не запрашивать подтверждение
ПАРАМЕТРЫ:
-n, --num <индекс> Индекс ключа
Переключение на новый набор ключей
Создать резервную копию текущего набора ключей и заменить его новым
ПРИМЕНЕНИЕ:
qss_mgr use-new
Проверка ключей
Проверить ключ или ключи. При проверке всех ключей проверить, что мастер-ключ не изменился
ПРИМЕНЕНИЕ:
qss_mgr verify [ПАРАМЕТРЫ]
ПАРАМЕТРЫ:
-n, --num <индекс> Индекс ключа; если не указан, пытается проверить все ключи
Утилита qss_recrypt
Утилита qss_recrypt
используется для перешифровки таблиц базы данных новым набором ключей.
Список команд
qss_reqcrypt 1.1.0
qss перешифровывает кластер QHB новым мастер-ключом
ПРИМЕНЕНИЕ:
qss_recrypt [ФЛАГИ] --data-dir <каталог-данных> <СУБКОМАНДА>
ФЛАГИ:
-h, --help Выводит справочную информацию
-V, --version Выводит информацию о версии
-v, --verbose Устанавливает уровень журналирования для Debug [по умолчанию: Info]
ПАРАМЕТРЫ:
--data-dir <каталог-данных> Указывает каталог с данными базы данных [среда: PGDATA=/tmp/qhb-data/]
СУБКОМАНДЫ:
add Сканировать базу данных и добавить данные о ее зашифрованных таблицах в файл конфигурации
help Вывести данное сообщение или справку по заданным субкомандам
recrypt Перешифровать кластер базы данных
Сканирование базы данных и сохранение данных о ее зашифрованных таблицах в файл конфигурации
Сканирование базы данных и добавление данных о ее зашифрованных таблицах в файл конфигурации
ПРИМЕНЕНИЕ:
qss_recrypt --data-dir <каталог-данных> add [ФЛАГИ] [ПАРАМЕТРЫ]
ФЛАГИ:
--no-timeout Запустить приложение без задержки; используется вместо -t 0s
ПАРАМЕТРЫ:
-d, --dbname <имя-БД> Указывает имя базы данных, к которой нужно подключиться [среда: PGDATABASE=]
-h, --host <хост> Указывает имя хост-узла, на котором запускается сервер. Если значение
начинается с косой черты (/), узел используется в качестве каталога для сокета домена Unix [среда:
PGHOST=/home/evgen/work/db/build/dbsockets]
-p, --port <порт> Указывает порт TCP или локальное расширение файла сокета домена Unix, на котором
сервер перехватывает подключения [среда: PGPORT=] [по умолчанию: 5432]
-t, --timeout <время-ожидания> Ожидание в секундах до попытки подключения; поддерживает "человеческое время", -t 3s
-U, --username <имя-пользователя> Подключение к базе данных под именем данного пользователя, а не под именем по умолчанию [среда: PGUSER=]
Перешифровка кластера (экземпляра QHB)
При старте будет выполнена расшифровка старого мастер-ключа (с запросом пина криптотокена при необходимости), а потом нового.
Перешифровка кластера базы данных
ПРИМЕНЕНИЕ:
qss_recrypt --data-dir <каталог-данных> recrypt [ФЛАГИ]
ФЛАГИ:
-y, --assumeyes автоматически отвечать "да" на все вопросы
-h, --help Выводит справочную информацию
-V, --version Выводит информацию о версии
Перед перешифровкой выдается предупреждение: «Пожалуйста, не запускайте сервер СУБД во время работы утилиты, это приведет к непоправимому повреждению данных» или "Please do not start the DBMS server while the utility is running, it will cause irreparable data corruption".
Если не указан флаг -y, то после предупреждения задается вопрос и ожидается подтверждение продолжения.
Утилита qss_pinpad
Утилита qss_pinpad
предназначена для ввода пина криптотокена при использовании ключей в режиме pkcs11.
Запускать расшифровку следует в отдельном терминале перед стартом сервера или использованием qss_mgr
для добавления или проверки ключей.
Утилита magma_key_gen
Утилита magma_key_gen
предназначена для генерации пользовательских ключей QSS на криптотокенах, поддерживающих аппаратное шифрование по ГОСТ 34.12-2018 и ГОСТ 34.13-2018. Утилита поставляется в пакете qhb-contrib.
magma_key_gen
принимает следующие аргументы командной строки:
Аргумент | Описание |
---|---|
--id id | идентификатор создаваемого ключа |
--module pkcs11-module-path | путь к библиотеке криптотокена. По умолчанию используется /usr/lib64/librtpkcs11ecp.so |
Если ключ с таким идентификатором уже существует, программа выводит об этом сообщение и завершает работу.
Пример создания и включения зашифрованной таблицы
Получение тестовых ключей
Создать мастер-ключ и ключ пользователя:
head -c 32 /dev/urandom > master_key.bin
head -c 32 /dev/urandom > user1.bin
Инициализация QSS в режиме мастер-ключа, подписанного пользовательским ключом, на файловой системе
qss_mgr init \
--module=/usr/lib64/librtpkcs11ecp.so \
--mode fs \
--key user1.bin \
master_key.bin
Инициализация QSS в режиме мастер-ключа, подписанного пользовательским ключом, на криптотокене
qss_mgr init \
--module=/usr/lib64/librtpkcs11ecp.so \
--mode pkcs11 \
--token-serial-number 3c4c6444 \
--token-key-id 1234 \
master_key.bin
Добавление возможности запуска сервера с другим пользовательским ключом
Должен быть доступен ключ первого пользователя.
qss_mgr add \
-mode fs \
-k user2.bin \
-n 0
Включение QSS на сервере
echo "qss_mode = 1" >> "${PGDATA}/qhb.conf"
qhb-ctl restart
Создание зашифрованной таблицы
create table t_qss(c1 int, c2 varchar) USING qss;
Подготовка к перешифровке базы данных новым мастер-ключом
Добавление нового мастер-ключа
qss_mgr --new init \
--module=/usr/lib64/librtpkcs11ecp.so \
--mode fs \
--key user1.bin \
new_master_key.bin
Сбор информации о зашифрованных таблицах в базе данных
Выполняется при запущенном кластере, необходимо повторить для всех баз данных в кластере, содержащих зашифрованные таблицы.
qss_recrypt --data-dir "${PGDATA}" add \
--dbname my
Запуск перешифровки кластера
Выполняется на остановленном кластере.
qss_recrypt --data-dir "${PGDATA}" recrypt
Переключение на новый мастер-ключ
Выполняется на остановленном кластере. Переносит текущий набор ключей в папку old, заменяя его подготовленным набором ключей из папки new.
qss_mgr --data-dir "${PGDATA}" use-new