Модуль безопасного хранения 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