Модуль безопасного хранения

Описание

Модуль безопасного хранения «КВАНТ-ГИБРИД» (Quantum Secure Storage, QSS) позволяет создавать таблицы, которые шифруются при записи на диск.

При старте сервера СУБД главный процесс QHB читает с диска мастер-ключ шифрования и сохраняет его в общей памяти, доступной дочерним процессам.

При чтении\записи блока\страницы на диск этот ключ используется для расшифровки\шифрования блока

Использование

Использование модуля в SQL: create table t_qss(c1 int, c2 varchar) USING qss;

В qhb.conf добавляется параметр qss_mode: int с возможными режимами:

  • 0 - отключено: попытки создания новых таблиц с using qss или чтение\запись в уже существующие приводит к ошибкам,
  • 1 - включено: при старте сервера считывается qss.toml и производится загрузка актуального мастер-ключа с его расшифровкой, при любых ошибках сервер останавливается

Файлы, используемые в 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 configures secured storage in QHB database

USAGE:
    qss_mgr [FLAGS] [OPTIONS] <SUBCOMMAND>

FLAGS:
    -h, --help       
            Prints help information

        --new        
            Work with key group for key replacement

    -V, --version    
            Prints version information


OPTIONS:
    -d, --data-dir <data-dir>    
            Specifies the directory with database data [env: PGDATA=/tmp/qhb-data/]


SUBCOMMANDS:
    add        Add new version of master key encrypted with other secret key
    del        Remove key
    help       Prints this message or the help of the given subcommand(s)
    init       Initialize config and first encrypted master key
    use-new    Backup current key set and replace it with new
    verify     Verify key or keys

Общий флаг --new позволяет работать с "новым" набором ключей переключиться на которой можно командой use-new

Инициализация с добавлением первого мастер-ключа

Примечание!!!
в режиме pkcs11 для ввода пин-кода используется утилита qss-pinpad, запущенная на этом же компьютере в другом терминале.

Initialize config and first encrypted master key
USAGE:
    qss_mgr init [OPTIONS] [master-key]

OPTIONS:
    -k, --key <key>                                    Key for encryption
    -f, --key-format <key-format>                      Format of key for encryption: bin, base64, armored [default: bin]
        --master-key-format <master-key-format>        Source master key format: bin, base64, armored [default: bin]
    -m, --mode <mode>                                  Master key encrypt mode: fs, pkcs11 [default: pkcs11]
        --module <pkcs11-module-path>                  PKCS11 module
        --token-key-id <token-key-id>                  User key ID on token for pkcs11
        --token-serial-number <token-serial-number>    Token serial number for pkcs11

ARGS:
    <master-key>    Source master key file

Добавление мастер ключа, зашифрованного ключом другого пользователя

Add new version of master key encrypted with other secret key
USAGE:
    qss_mgr add [OPTIONS] [master-key]

OPTIONS:
    -k, --key <key>                                    Key for encryption
    -f, --key-format <key-format>                      Format of key for encryption: bin, base64, armored [default: bin]
        --master-key-format <master-key-format>        Source master key format: bin, base64, armored [default: bin]
    -m, --mode <mode>                                  Master key encrypt mode: fs, pkcs11 [default: pkcs11]
    -n, --num <num>                                    Previous key index to load master key from
        --token-key-id <token-key-id>                  User key ID on token for pkcs11
        --token-serial-number <token-serial-number>    Token serial number for pkcs11

ARGS:
    <master-key>    Source master key file

Удаление ключа

Remove key

USAGE:
    qss_mgr del [FLAGS] --num <num>

FLAGS:
    -q, --quiet      Quiet mode: don't ask for confirmation

OPTIONS:
    -n, --num <num>    Key index

Переключение на новый набор ключей

Backup current key set and replace it with new

USAGE:
    qss_mgr use-new

Проверка ключей

Verify key or keys. If checking all keys, check that master keys is same
USAGE:
    qss_mgr verify [OPTIONS]

OPTIONS:
    -n, --num <num>              Key index, if not specified, tries to check all keys

Утилита qss_recrypt используется для перешифрования таблиц БД новым набором ключей

Список команд

qss_reqcrypt 1.1.0
qss recrypt QHB cluster with new master key

USAGE:
    qss_recrypt [FLAGS] --data-dir <data-dir> <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information
    -v, --verbose    Sets logging level to Debug [default: Info]

OPTIONS:
        --data-dir <data-dir>    Specifies the directory with database data [env: PGDATA=/tmp/qhb-data/]

SUBCOMMANDS:
    add        Scan database and add it to recrypt's config
    help       Prints this message or the help of the given subcommand(s)
    recrypt    Do database reencryption

Сканирование БД и сохранение данных о ее зашифрованных таблицах в файл конфигурации

Scan database and add it to recrypt's config

USAGE:
    qss_recrypt --data-dir <data-dir> add [FLAGS] [OPTIONS]

FLAGS:
        --no-timeout    Run app with no timeout, use instead of -t 0s

OPTIONS:
    -d, --dbname <dbname>        Specifies the name of the database to connect to [env: PGDATABASE=]
    -h, --host <host>            Specifies the host name of the machine on which the server is running. If the value
                                 begins with a slash, it is used as the directory for the Unix-domain socket [env:
                                 PGHOST=/home/evgen/work/db/build/dbsockets]
    -p, --port <port>            Specifies the TCP port or the local Unix-domain socket file extension on which the
                                 server is listening for connections [env: PGPORT=]  [default: 5432]
    -t, --timeout <timeout>      Seconds to wait when attempting connection, supports "human time", -t 3s
    -U, --username <username>    Connect to the database as the user username instead of the default [env: PGUSER=]

Перешифрование кластера (экземпляра QHB)

При старте будет выполнена расшифровка старого мастер ключа (с запросом пина криптотокена при необходимости), а потом нового.

Do database reencryption

USAGE:
    qss_recrypt --data-dir <data-dir> recrypt

Утилита qss_pinpad предназначена для ввода пина криптотокена при использовании ключей в режиме pkcs11

Запускать следует в отдельном терминале перед стартом сервера или использованием qss_mgr для добавления или проверки ключей

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

Получение тестовых ключей

Создать мастер ключ и ключ пользователя:

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