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