Обфускация данных
Описание
Обфускация данных — это процесс маскирования с деперсонификацией данных для обеспечения конфиденциальности, защиты персональной и другой чувствительной информации. Данная функциональность применяется для сохранения возможности работы с данными, при этом обеспечивая их непригодность для анализа в неконтролируемых условиях. Обфускация может использоваться в тестовых средах, для вывода информации на экраны, в отчетах и в других случаях, когда важно сохранить структуру и формат данных, но скрыть их реальное содержание.
Функциональность позволяет:
- маскировать данные непосредственно внутри экземпляра СУБД без использования внешнего инструмента;
- заменять реальные данные каждый раз, когда утилита выгрузки данных обращается к СУБД;
- реализовать обфускацию атрибутов отношений (столбцов) применительно к набору ролей базы данных.
Описываемое решение основано на свободно распространяемом расширении postgresql_anonymizer
с доработками внутри продукта Platform V Pangolin DB.
Для выгрузки и записи дампа используются стандартные инструменты СУБД – pg_dump
, pg_dumpall
, pg_restore
, psql
, поддерживающие:
- форматы дампа:
plain
,custom
,dir
иtar
; - выгрузку данных в несколько потоков.
Поддерживается использование узла реплики в качестве источника для экспорта.
Доступ к обфусцированным данным можно получить тремя способами:
- Анонимные дампы: экспорт замаскированных данных;
- Статическое маскирование: удаление персональных данных в соответствии с правилами;
- Динамическое маскирование: скрытие личных данных только для замаскированных пользователей.
Методы маскирования данных
Методы статического маскирования:
- Искажение — добавление погрешности в атрибуты с итерируемыми типами данных.
- Перестановка — рандомизация значений атрибутов в пределах отношения.
Методы динамического маскирования:
- Удаление атрибута.
- Подмена атрибута константой (например,
CONFIDENTIAL
). - Частичное маскирование (например, номер телефона в виде
79** *** ** 88
). - Искажение — значение генерируется в пределах определенного пользователем диапазона, относительно исходного значения (применяется только для числовых типов и типов, основанных на дате/времени).
- Обобщение — подменяемое значение генерируется как диапазон, содержащий исходное значения. Начало диапазона определяется как целое от деления исходного значения на ширину диапазона (применяется только для числовых типов и типов, основанных на дате/времени).
- Рандомизация — генерация случайного знач ения атрибута.
- Фальсификация — выбор случайного значения из таблицы подстановок.
- Псевдонимизация — вычисление хеша исходного значения с учетом соли (salted hash) с последующим выбором фальсифицированного значения на основе остатка от деления хеша на размер таблицы подстановок. Поддерживаются все атрибуты, перечисленные в алгоритме фальсификации, а также генератор текста Lorem Ipsum определенной длины.
- Хеширование текстовых данных — вычисление хеша исходного значения с учетом соли (salted hash). Метод не является криптографически устойчивым для словарных атак.
Генерация и фальсификация атрибутов
В функциональности предусмотрена генерация следующих атрибутов:
- целое значение в пределах заданного диапазона;
- дата;
- дата в указанном диапазоне;
- целое число в указанном диапазоне;
- хеш текста;
- значение массива;
- интервал времени;
- интервал целого числа;
- ENUM-значение;
- ИНН (юридического лица, физического лица) с проверкой контрольной суммы;
- ОГРН (юридического лица или индивидуального предпринимателя) с проверкой контрольной суммы;
- номер телефона;
- СНИЛС;
- строка;
- почтовый индекс.
В решении реализована фальсификация следующих атрибутов:
- адрес;
- город;
- компания (юридическое или физическое лицо);
- страна (полное название);
- e-mail;
- ФИО (допускается маска, позволяющая выбрать комбинацию фамилии, имени, отчества в любом составе и порядке. Возможна отдельная генерация фамилии, имени, отчества отдельно из более полного набора подстановок);
- почтовый индекс;
- SIRET;
- IBAN;
- ИНН;
- ОГРН;
- СНИЛС.
-
При выборе алгоритма маскирования следует обращать внимание на типизацию атрибута.
Например, не следует использовать подмену константой
CONFIDENTIAL
для атрибута с типомtimestamp
. -
Алгоритм «Смещение» не является статистически устойчивым.
Многократное применение алгоритма к одному и тому же значению позволяет предсказать искомое значение, как среднее по выборке.
-
Алгоритмы «Смещение» и «Обобщение» предполагают применение смещения к исходному значению.
Применение отклонения к таким значениям как:
NULL
,NaN
,+Infinity
,-Infinity
и т.п. фактически не изменят исходное значение и не приводит к ошибке. -
Алгоритм «Обобщение» не совместим с функциональностью снятия логических дампов, поскольку меняет тип данных атрибута.
-
Алгоритм «Перестановка» является необратимым и приводит к фактическому изменению значений атрибута. Ценность алгоритма в сохранении ссылочной целостности.
-
Алгоритмы «Рандомизация», «Фальсификация» используют предо пределенные значения для локалей
en_US
,fr_FR
,ru_RU
.Выбор локали осуществляется перед инициализацией расширения. Допускается дополнение списков элементов для этих алгоритмов. В составе решения поставляется пример генератора данных на основе библиотеки Faker.
-
Алгоритмы маскирования, определенные для партиционированных таблиц не наследуются от партиционированной таблицы к секциям.
-
При выгрузке данных в логический дамп, создание метки
SECURITY LABEL
для отношений происходит до загрузки данных в таблицу.Валидация функции анонимизации на атрибут происходит в момент создания метки для атрибута, что может привести к ситуации, когда тип данных в таблице не соответствует как типу аргументов маскирующей функции, так и ее результату.
Настройка
Обозначения
Далее в разделе:
<database_name>
: название базы данных;<locale>
: локаль инициализации таблиц подстановок;<sensitive_schema>
: схема, содержащая сенситивные данные. Определяется с помощьюGUC anon.sourceschema
;<sensitive_rel>
: отношение (таблица) с сенситивными данными;<sensitive_attr>
: атрибут (колонка) с сенситивными данными;<sensitive_user>
: пользователь или роль БД, от которых скрываются сенситивные данные;<const_value>
: константа, соответствующая типу маскируемого поля;<function_name>
: функция, соответствующая типу маскируемого поля и стратегии маскирования.
Для начала использования функциональности выполните следующие действия:
-
Установите rpm/deb-пакет расширения из поставляемой 3rd Party части дистрибутива:
- SberLinux, РЕД ОС, CentOS
- Red Hat Enterprise Linux
- Astra Linux
- Альт СП
sudo dnf install pangolin-pg-anon-{version_component}-{OS}.x86_64.rpm
sudo yum install pangolin-pg-anon-{version_component}-{OS}.x86_64.rpm
sudo apt install pangolin-pg-anon_{version_component}_amd64.deb
sudo apt-get install pangolin-pg-anon-{version_component}-{OS}.x86_64.rpm
ПодсказкаПример заполненной команды:
cd $PGHOME/3rdparty/pg_anon
sudo dnf install pangolin-pg-anon-1.3.1-sberlinux8.9.x86_64.rpm -
Определите необходимые конфигурационные параметры. Пример:
ALTER DATABASE <database_name> SET session_preload_libraries='anon';
ALTER DATABASE <database_name> SET anon.default_locale='<locale>'; -- en_US,fr_FR,ru_RU
ALTER DATABASE <database_name> SET anon.sourceschema='sensitive_schema';
ALTER DATABASE <database_name> SET anon.maskschema='mask';ПодсказкаПараметры функциональности описаны далее в разделе «Конфигурационные параметры». Применение изменений данных параметров требует перечитывания конфигурации (
SELECT pg_reload_conf()
). Параметры можно определить для всего экземпляра (в файле конфигурацииpostgresql.conf
или с помощьюALTER SYSTEM
), либо на уровне базы данных (ALTER DATABASE
). -
Активируйте расширение
anon
для нужной БД. Используйте команду:\c <database_name>
CREATE EXTENSION anon; -
С помощью функции
anon.init()
инициализируйте расширениеanon
:SELECT * FROM anon.init();
При инициализации загружаются таблицы псевдонимизации, случайно генерируются заполнение таблиц ИНН, ОГРН, СНИЛС, случайно выбираются до 2500 значений ФИО по соответствию пола.
-
Задайте правило маскирования с маскирующей функцией при выгрузке данных из
<database_name>
:SECURITY LABEL FOR anon ON DATABASE <database_name> IS 'EXPORTED WITH FUNCTION anon.mask_select';
ПодсказкаПравила маскирования объявляются с помощью
SECURITY LABEL
. Для определения правил маскирования доступны различные функции маскировки.После настройки обфускации необходимых данных задайте
SECURITY LABEL
-метки для ролей, от которого скрываются сенситивные данные.
Использование динамического маскирования
С помощью функции anon.start_dynamic_masking
инициализируется старт динамического маскирования, при котором:
- Инициализируется схема данных для псевдонимизации (если она не была инициализирована ранее).
- Отзываются права пользователя
<sensitive_user>
на схему<sensitive_schema>
. - Создается схема для генерации анонимизированных данных, определенная параметром
anon.maskschema
. - Создается представление, соответствующее имени
<sensitive_rel>
и содержащее правила маскирования.
Далее определяются правила маскирования путем указания меток с заданными функциями.
Использование статического маскирования
При статическом маскировании безвозвратно заменяются исходные данные.
SELECT anon.<function_name>();
В <function_name> должна быть определена функция статического метода.
Конфигурационные параметры
Параметр | Значение по умолчанию | Описание |
---|---|---|
anon.algorithm | sha256 | Алгоритм хеширования, применяемый методом псевдонимизации. Поддерживаются md5 , sha1 , sha224 , sha256 , sha384 и sha512 |
anon.allow_constraints_masking | false | Флаг, допускающий обфускацию для атрибутов, входящих в ограничение целостности |
anon.default_locale | en_US | Локаль инициализации таблиц подстановок, применяемых в методах фальсификации и псевдонимизации |
anon.k_anonymity_provider | k_anonymity | Имя SECURITY PROVIDER , используемого для метода K-Anonimity |
anon.masking_policies | anon | Схема БД, используемая расширением обфускации данных и содержащая таблицы и функции подстановок |
anon.maskschema | mask | Схема БД, используемая для генерации анонимизированных данных |
anon.privacy_by_default | off | Выбор стратегии маскирования атрибутов, не имеющих метки SECURITY LABEL . При включении параметра — для всех атрибутов, имеющих значения по умолчанию — будут использоваться они. Для атрибутов, допускающих NULL — подставлен NULL |
anon.restrict_to_trusted_schemas | on | Признак использования функций маскирования, расположенных только в схемах с атрибутом TRUSTED |
anon.salt | Отсутствует | Соль, используемая для метода псевдонимизации |
anon.sourceschema | public | Схема БД по умолчанию, содержащая исходные данны е. В случае использования нескольких схем — каждая из них должна быть помечена атрибутом TRUSTED |
anon.strict_mode | on | Требования соответствия типа подстановочного значения типу исходного значения |
anon.transparent_dynamic_masking | off | Режим динамического маскирования |
Объекты функциональности
Таблицы подстановок
В таблице ниже представлены таблицы подстановок предоставляемые функциональностью:
Объект | Аргументы, атрибуты | Возвращаемое значение | Описание |
---|---|---|---|
anon.address | - | - | Адрес |
anon.city | - | - | Город |
anon.company | - | - | Компания |
anon.country | - | - | Страна |
anon.email | - | - | |
anon.first_name | - | - | Имя физического лица |
anon.iban | - | - | IBAN |
anon.identifier | - | - | Идентификатор атрибута для автоматической разметки БД в целях анонимизации |
anon.identifiers_category | - | - | Категория идентификатора для автоматической разметки БД в целях анонимизации |
anon.inn | - | - | ИНН |
anon.last_name | - | - | Фамилия физического лица |
anon.lorem_ipsum | - | - | Текстовые данные для генератора текстовых данных |
anon.middle_name | - | - | Отчество физического лица |
anon.ogrn | - | - | ОГРН |
anon.personal_name | - | - | ФИО физического лица |
anon.postcode | - | - | Почтовый индекс |
anon.siret | - | - | SIRET |
anon.snils | - | - | СНИЛС |
Представления
Представления предоставляемые функц иональностью:
Объект | Аргументы, атрибуты | Возвращаемое значение | Описание |
---|---|---|---|
pg_identifiers | - | attrelid::oid , attnum::integer , relname::name , attname::name , format_type::text , col_description::text , indirect_identifier::boolean , priority::integer | Список автоматически созданных правил маскировки, при использовании функции anon.detect() |
pg_masked_roles | - | rolname::name , rolsuper::boolean , rolinherit::boolean , rolcreaterole::boolean , rolcreatedb::boolean , rolcanlogin::boolean , rolreplication::boolean , rolconnlimit::integer , rolpassword::text , rolvaliduntil::timestamp with time zone , rolbypassrls::boolean , rolconfig::text[] , oid::oid , grace_period::interval , grace_period_source::text , grace_time_left::interval , rolprevpassword::text , hasmask::boolean | Список ролей экземпляра, дополненный признаком маскирования роли |
pg_masking_rules | - | attrelid::oid , attnum::integer , relnamespace::regnamespace , relname::name , attname::name , format_type::text , col_description::text , masking_function::text , masking_value::text , priority::integer , masking_filter::text , trusted_schema::boolean | Список правил маскировки |
pg_masks | - | attrelid::oid , attnum::integer , relnamespace::regnamespace , relname::name , attname::name , format_type::text , col_description::text , masking_function::text , masking_value::text , priority::integer , masking_filter::text , trusted_schema::boolean | Список правил маскировки (deprecated ) |
Функции и процедуры
Динамическое маскирование
В разделе представлены функции и процедуры методов динамического маскирования.
Частичное маскирование
Функции метода частичного маскирования:
Объект | Аргументы, атрибуты | Возвращаемое значение | Описание |
---|---|---|---|
FUNCTION anon.partial | ov text , prefix integer , padding text , suffix integer | text | Частичное маскирование текстовых данных |
FUNCTION anon.partial_email | ov text | text | Частичное маскирование e-mail |
Искажение
Функции метода искажения:
Объект | Аргументы, атрибуты | Возвращаемое значение | Описание |
---|---|---|---|
FUNCTION anon.noise | noise_value anyelement , ratio double precision | anyelement | Искажение с числовым интервалом |
FUNCTION anon.dnoise | noise_value anyelement , noise_range interval | anyelement | Искажение с интервалом дата/время |