Выгрузка данных в дамп при включенных СЗИ
Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.
В данном разделе описываются механизм сохранения данных БД, находящихся под защитой в засекреченных файлах, и механизм загрузки данных из засекреченного файла в БД (БД могут быть разными).
В рамках описываемого далее решения данные сжимаются только в SQL-формате. Сжатие данных при формировании защищенного дампа не поддерживается.
Установка и подключение СЗИ описаны в разделе «Подключение СЗИ».
Описание
Механизм позволяет формировать дампы с заданными объектами одной БД и последующей их загрузкой в другую БД. Выгрузка и загрузка дампа доступны в том числе пользователю, не имеющему доступа к защищенным объектам. База данных может содержать в себе как защищенные объекты, так и не защищенные. Защищенные объекты переносятся между БД без изменений, а защищенные данные внутри объектов (таблиц и партиций) переносятся без их раскрытия. Возможен перенос объектов между базами с различными мажорными версиями СУБД Pangolin.
Для формирования защищенного дампа требуется установка расширения secret_dump. Данное расширение может работать только с включенной функциональностью защиты данных от привилегированных пользователей (admin protection или AP). Расширение должно быть установлено в БД, на которой будет формироваться дамп.
Добавлять расширение в shared_preload_libraries нельзя.
Формирование дампа происходит в соответствии с оригинальным поведением утилиты pg_dump, за исключением режимов работы:
--compress/-Z- отсутствует сжатие;--format/F- поддерживается только текстовый формат (SQL);--inserts- нельзя выгружать данные в форматеinsert, поддерживается толькоCOPY.--clean- командыDROPдля удаления существующих объектов базы данных не генерируются при формировании защищенного дампа. Если указаны оба ключа-cи-Содновременно, командаDROP DATABASEне будет создана.
При нахождении главной партиции партиционированной таблицы в незащищенной схеме и постановке ее под защиту, когда дочерние таблицы этой партиционированной таблицы находятся в защищенной схеме (не поставлены отдельно под защиту), дамп при загрузке выдаст ошибку, после чего загрузка защищенных объектов остановится.
В текущей версии операции постановки под защиту для схемы public и ее объектов не выгружаются.
Сформированный дамп отличается от оригинального рядом функций, с которыми можно ознакомиться подробнее в подразделе «secret_dump. Создание защищенного дампа».
За формирование файла для хранения ключа засекречивания отвечает компонент Pangolin-security-utilities.
Засекречивание данных и контрольных сумм в дампе
Засекречивание данных и контрольных сумм в дампе осуществляться с помощью ключа (KEY), который не доступен пользователю в открытом виде. В качестве идентификатора такой ключ будет иметь GUID, по которому пользователь сможет указывать, каким ключом засекречивать данные дампа.
Комбинация GUID с соответствующим ему ключом (GUID+KEY) уникальна для каждого дампа и указана в нем. Сами ключи засекречивания с GUID находятся в базе данных, с которой будет формироваться дамп в открытой таблице. Чтобы не допустить раскрытия ключей, они засекречиваются отдельным ключом, который хранится в файле /etc/pangolin-security-utilities/secret_dump_key.bin и формируется утилитой pg_dump_generate_secret_file. Также есть возможность задать его в хранилище ключей (субдомен secure_dump_key) в формате key/value: key_base64.
Наличие файла или ключа в хранилище ключей является обязательным для формирования дампа.
Схема формирования дампа:

Схема применения дампа на новой БД сервера с переносом связки GUID+KEY:

Схема применения дампа на новой БД сервера без переноса связки GUID+KEY:

Утилита pg_dump_generate_secret_file
Утилита используется для генерации файла /etc/pangolin-security-utilities/secret_dump_key.bin. В сгенеренном файле присутствует ключ для засекречивания ключей кодирования защищенного дампа. Ключ засекречен на параметрах сервера. Он может формироваться утилитой автоматически или задаваться пользователем. Задание ключа пользователем используется при кластерной конфигурации, чтобы ключ засекречивания ключей был одинаковым и на мастере, и на реплике.
Утилита имеет следующие ключи:
-m, --manual
Ключ задания ключа пользователем.
-t, --type
Формат ключа: BASE64, HEX, ASCII.
-h, --help
Руководство утилиты.
Пример работы утилиты с автоматической генерацией ключа:
pg_dump_generate_secret_file
Пример работы утилиты с заданием ключа в формате BASE64 в ручном режиме (флаг -m):
pg_dump_generate_secret_file -m -t BASE64
Формат запросов
Дамп формируется в SQL-формате. Все SQL-запросы для защищенных объектов выгружаются в засекреченном виде. При применении дампа осуществляется проверка контрольных сумм перед выполнением SQL-запросов защищенных объектов на сервере. Все данные рассекречиваются только на сервере во избежание их раскрытия.
Также при формировании дампа выполняются SQL-запросы на создание политик, в которых присутствуют выгружаемые защищенные объекты и SQL-запросы, назначающие политики на действия к конкретным защищенным объектам. Все описанные SQL-запросы сохраняются в дампе в открытом виде и защищаются от изменений засекреченной контрольной суммой.
Установка
Установите rpm/deb-пакет содержащий утилиту безопасности setup_kms_credentials из каталога utilities дистрибутива:
В случаеавтоматизированной установки СУБД данный пакет устанавливается по умолчанию.
- SberLinux, РЕД ОС, CentOS
- Astra Linux
- Альт СП
sudo dnf install pangolin-security-utilities-7.3.1-{OS}.x86_64.rpm
sudo apt install pangolin-security-utilities-7.3.1_amd64.deb
sudo apt-get install pangolin-security-utilities-7.3.1-{OS}.x86_64.rpm
Пример заполненной команды:
cd distributive/utilities
sudo dnf install -y pangolin-security-utilities-7.3.1-sberlinux9.x86_64.rpm
Управление
Формирование дампа
Для формирования дампа необходимо:
-
Установить расширение secret_dump. Расширение возможно установить только на БД, с включенным механизмом защиты данных.
-
Запустить утилиту
pg_dumpс ключом--secret-dumpи указаниемGUID. -
Сформировать ключ, которым будет шифроваться содержимое защищенных объектов:
SELECT pg_catalog.sd_generate_guid_key_dump();Функция возвращает
GUID(идентификатор ключа), который необходимо далее передать в утилитуpg_dump. Сам ключ пользователю недоступен, доступ к ключу есть только у администратора безопасности. -
Вызвать утилиту
pg_dumpс ключами, необходимыми для выгрузки нужных объектов, и указаниемGUID:pg_dump <vanila keys> --secret-dump GUID
По итогу выполнения этих действий будет сформирован SQL-дамп структуры:
--
-- PostgreSQL database dump
--
-- Dumped from database version 15.5
-- Dumped by pg_dump version 15.5
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SELECT pg_catalog.sd_load_secret_dump('<GUID>', '<TimeStamp>', '<EncodingCRC>', '<EncodingKeyDump>');
-- Создание DDL
-- Пример защищенного DDL создания таблицы
SELECT pg_catalog.sd_protection_action('<EncodingCRC>', 'CREATE TABLE public.test_protect_table (
id integer,
data text DEFAULT ''test_protect_table''::text
);
SELECT pm_protect_object(''table'', ''public.test_protect_table'');
');
-- Пример защищенного DDL создания MATERIALIZED VIEW
SELECT pg_catalog.sd_protection_action('<EncodingCRC>', 'CREATE MATERIALIZED VIEW public.test_protect_matview AS
SELECT 1 AS "?column?"
WITH NO DATA;
SELECT pm_protect_object(''matview'', ''public.test_protect_matview'');
');
-- Пример незащищенного DDL (оригинальный)
CREATE TABLE public.test_open_table (
a integer,
b text
);
<...>
-- Формирование политик SELECT pg_catalog.sd_protection_policies('<EncodingCRC>', 'SELECT pm_make_policy(''policy_sd'');
SELECT pm_grant_to_policy(''policy_sd'',''table'',''public.test_protect_table'',array[''insert'',''select'']::name[]);
SELECT pm_grant_to_policy(''policy_sd'',''matview'',''public.test_protect_matview'',array[''select'']::name[]);
<...>
');
-- Выгрузка данных
-- Выгрузка защищенных данных в шифрованном виде
COPY public.test_protect_table (id, data) FROM stdin;
<EncodingBase64Data>
\.
-- Выгрузка незащищенных данных
COPY public.test_open_table (a, b) FROM stdin;
1 aaa
2 bbb
<...>
\.
-- Выгрузка ACL
GRANT SELECT,INSERT ON TABLE public.test_protect_table TO not_protect;
SELECT pg_catalog.sd_protection_action('<EncodingCRC>', 'REFRESH MATERIALIZED VIEW public.test_protect_matview;
');
-- Завершение дампа
-- Функция завершения загрузки
SELECT pg_catalog.sd_end_secret_dump();
--
-- PostgreSQL database dump complete
--
На заключительном этапе формирования дампа администратор безопасности получает ключ засекречивания дампа и переносит его вместе с GUID на целевую БД:
SELECT pg_catalog.sd_get_guid_dump('GUID');
Загрузка данных в новую БД
Для успешной загрузки данных в новую БД необходимо перенести в нее ключ засекречивания. Так как доступ к ключам в открытом виде будет только у администратора безопасности, он должен самостоятельно перенести связки GUID+KEY на другую базу данных до формирования дампа. Также возможен вариант выгрузки дампа в базу данных, находящуюся на текущем сервере. Для этого перенос ключа не требуется, так как он будет браться из самого дампа при условии совпадения ключа засекречивания ключей, с тем, который присутствовал при формировании загружаемого дампа.
Восстановление дампа необходимо выполнять в другую предварительно созданную базу данных из шаблона template0 с установленным расширением secret_dump.
Загрузка защищенного дампа на БД с новым ключом засекречивания ключей
В данном случае предполагается, что ключ засекречивания ключей на сервере с целевой БД отличается от ключа засекречивания ключей на сервере с БД, на которой был сформирован дамп. При этом не имеет значение, где изначально этот ключ хранился - в файле /etc/pangolin-security-utilities/secret_dump_key.bin или в хранилище ключей.
Для применения (загрузки) дампа:
-
Администратор безопасности должен установить на целевую БД связку
GUID+KEY:SELECT pg_catalog.sd_set_guid_key_dump('GUID', 'KEY');ВажноУстановленным ключом можно только загрузить дамп, сформировать защищенный дамп с его использованием невозможно.
-
Пользователь утилитой
psqlприменяет (загружает) дамп аналогично ванильному дампу:psql -p <port> -h <host> -f protected_dump.sqlВажноПри сбоях, загрузка засекреченных объектов будет остановлена.
-
Администратор безопасности должен назначить на пользователей политики, созданные в дампе.
Загрузка засекреченного дампа на БД с исходным ключом засекречивания ключей
В данном сценарии предполагается, что ключ засекречивания ключей на сервере с целевой БД не отличается от ключа засекречивания ключей на сервере с БД, где был сформирован дамп. Не имеет значения, где изначально ключ хранился - в файле /etc/pangolin-security-utilities/secret_dump_key.bin или в хранилище ключей.
Для загрузки дампа:
-
Пользователь утилитой
psqlдолжен применить дамп аналогично ванильному:psql -p <port> -h <host> -f protected_dump.sqlЕсли во время загрузки объектов возникла ошибка:
ERROR: The encrypted dump generation mode is not setТо все защищенные объекты после ошибки будет невозможно загрузить, так как применятся только объекты, загруженные до ошибки. Незащищенные объекты применятся в соответствии с оригинальным поведением утилиты
pg_dump. -
Администратор безопасности должен назначить политики, созданные в дампе, на пользователей.
Особенности загрузки защищенного дампа из БД на основе template1
При формировании защищенного дампа из БД, созданной на основе шаблона template1, следует учитывать, что этот шаблон может содержать пользовательские расширения и связанные с ними объекты (функции, типы данных, схемы).
Загрузка такого дампа в целевую БД может вызвать ошибки, если в ней уже присутствуют объекты с теми же именами.
Для предотвращения конфликтов рекомендуется один из следующих подходов:
- Загрузка в «чистую» БД. Выполните восстановление дампа в БД, созданной на основе шаблона template0. Этот шаблон не содержит дополнительных расширений и объектов, что исключает риск дублирования.
- Предварительная подготовка целевой БД. Если необходимо восстановить дамп в существующей БД, предварительно удалите или переименуйте объекты, которые могут конфликтовать с объектами из дампа. Это позволит избежать ошибок дублирования и обеспечит корректное восстановление данных.