Безопасность
Анонимизация данных
16
Авторские права
© Postgres Professional, 2023–2026
Авторы: Алексей Береснев, Илья Баштанов, Павел Толмачев, Игорь
Гнатюк
Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
Использование материалов курса
Некоммерческое использование материалов курса (презентации,
демонстрации) разрешается без ограничений. Коммерческое
использование возможно только с письменного разрешения компании
Postgres Professional. Запрещается внесение изменений в материалы
курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу:
edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за
любые повреждения и убытки, включая потерю дохода, нанесенные
прямым или непрямым, специальным или случайным использованием
материалов курса. Компания Postgres Professional не предоставляет
каких-либо гарантий на материалы курса. Материалы курса
предоставляются на основе принципа «как есть» и компания Postgres
Professional не обязана предоставлять сопровождение, поддержку,
обновления, расширения и изменения.
2
Темы
Анонимизация
Стратегии анонимизации
Расширение pgpro_anonymizer
Правила маскирования
Метки безопасности
Динамическое изменение данных
Статическое изменение по правилам
Безопасность
3
Статическое Динамическое
изменение изменение
Анонимизация
Защитить данные от несанкционированного чтения с помощью
разделения доступа между ролями и назначения привилегий не всегда
возможно: иногда пользователю необходимо показать какую-то
информацию.
Дополнительным средством защиты данных в таких случаях может
стать анонимизация — сохранение конфиденциальности путем
изменения исходных данных или их представления в измененном виде:
●
Статическое изменение — сохранение анонимизированных данных
и дальнейшее их предоставление в уже измененном виде.
Такой вариант, например, позволяет скрыть исходную информацию
в копиях данных, предназначенных для аналитиков, разработчиков
и тестировщиков.
●
Динамическое изменение (маскирование) — исходные данные не
изменяются, а анонимизация и представление в измененном виде
выполняются «на лету», непосредственно при обращении к ним.
Такой вариант может применяться, например, для защиты данных от
просмотра недоверенными пользователями в приложениях.
Изменения данных, выполняемые при анонимизации, требуют затрат
процессорного времени, места в памяти и, возможно, увеличения числа
операций ввода-вывода. Статическое изменение перезаписывает
данные на диске и затраты на него единовременны. При динамическом
маскировании ресурсы расходуются при каждом обращении.
4
Стратегии анонимизации
Удаление
Замена
Искажение
Рандомизация и подмена
Псевдонимизация
Обобщение
Перестановка
Пользовательские правила
Для анонимизации данных могут использоваться разные стратегии:
●
Удаление (сокрытие) полностью исключает доступ к данным.
●
Замена — все значения заменяются одним. Возможна частичная
замена, когда часть данных остается нетронутой.
●
Искажение (отклонение) «сдвигает» даты и числовые значения.
●
Рандомизация и подмена (фальсификация) заменяют
конфиденциальные данные случайными, но правдоподобными
значениями.
●
Псевдонимизация защищает данные, скрывая их с помощью
дополнительной информации, при этом данные остаются связаны
с исходными. Примерами могут служить шифрование и
хеширование.
●
Обобщение заменяет данные диапазоном значений.
●
Перестановка перемешивает значения в рамках столбца.
●
Пользовательские правила предназначены для анонимизации
данных в соответствии с особыми требованиями — например, при
необходимости логически согласованных изменений в столбцах.
Выбор стратегии анонимизации зависит от типа данных и задач
обеспечения конфиденциальности. Например, для имен и различных
идентификаторов удобно использовать замену, рандомизацию или
псевдонимизацию, а отклонение и обобщение подходят для чисел и
значений даты-времени.
5
pgpro_anonymizer
Инструменты внутри СУБД
для статического и динамического изменения
Набор функций
для разных стратегий анонимизации
Декларативные конструкции
Расширение pgpro_anonymizer позволяет анонимизировать данные
внутри экземпляра СУБД без использования внешних инструментов,
что уменьшает риск утечки данных. Расширение поставляется в виде
отдельного пакета pgpro-anonymizer-ent-16; за его основу был взят
проект PostgreSQL Anonymizer.
С помощью инструментов расширения можно выполнять статическое
и динамическое изменение данных и применять в них различные
стратегии анонимизации. Для этого в составе расширения имеются
функции, выполняющие изменения данных в соответствии с выбранной
стратегией.
Чтобы связать данные со стратегией анонимизации, используется
декларативный подход: стратегия описывается с помощью DDL-команд.
7
Метки и правила
Метки безопасности
штатный универсальный механизм хранения атрибутов объектов
назначаются администратором
интерпретируются модулем — провайдером меток
Правила изменения данных
описываются меткой безопасности для провайдера anon
на уровне столбцов таблиц
определяют преобразование: замену на константу или значение
функции
Штатный механизм меток безопасности PostgreSQL позволяет
ассоциировать метки с отдельными объектами, в том числе и со
столбцами таблиц.
Метка — это атрибут объекта (текстовая строка), который
устанавливается администратором, а интерпретируется при обращении
к объекту загружаемым модулем — провайдером. Провайдер также
определяет, допустима ли метка и разрешено ли применять ее
к указанному объекту. PostgreSQL не накладывает ограничений на то,
как провайдер должен интерпретировать метки безопасности; он лишь
обеспечивает механизм их хранения и поддержку работы модулей-
провайдеров. На базе этого механизма может быть реализована,
например, система мандатного управления доступом (MAC).
Для расширения pgpro_anonymizer провайдером меток безопасности
выступает модуль anon.
Помимо простого статического изменения с помощью функций,
рассмотренного в демонстрации, расширение позволяет определить
правила изменения данных (маскирования). Правила могут описывать
замену исходного значения как на определенное статическое значение,
так и на значение, возвращаемое функцией. При этом можно
использовать и пользовательские функции, реализующие необходимую
логику.
8
Динамическое изменение
Работает для ролей, помеченных как недоверенные
Обращение к таблице подменяется на обращение
к представлению
anon.sourceschema — схема исходных данных
anon.maskschema — схема анонимизирующих представлений
Ограничения и особенности
поддержка только одной схемы
необходимость каскадного удаления таблиц
запрет прямого изменения типа данных
возможное снижение производительности
Динамическое маскирование работает для ролей с установленной
меткой безопасности MASKED (недоверенных ролей).
В схеме, указанной в параметре anon.maskschema, создаются
представления, одноименные с анонимизируемыми таблицами из
схемы anon.sourceschema и изменяющие данные согласно
установленным правилам. При этом для недоверенных пользователей
путь поиска изменяется таким образом, что при указании целевой
таблицы запрос перенаправляется к маскирующему представлению.
У динамического маскирования есть ряд особенностей и ограничений:
●
Чтобы удалить исходную замаскированную таблицу, для нее нужно
выполнять DROP … CASCADE, что позволяет сразу удалить
и зависящее от нее маскирующее представление.
●
Система работает только с одной схемой, указанной в параметре
anon.sourceschema (по умолчанию — public).
●
Когда активировано динамическое маскирование, запрещено
изменять тип данных столбца, если на нем есть маска. Чтобы
изменить такой столбец, маскирование нужно временно отключить.
●
Динамическое маскирование может медленно работать
с некоторыми запросами, например соединяющими таблицы по
ключу, который маскируется хешированием.
10
Статическое изменение
Данные в таблицах изменяются по заданным правилам
anon.anonymize_database() — все данные в базе
anon.anonymize_table() — отдельная таблица
anon.anonymize_column() — отдельный столбец таблицы
Статическое изменение данных также может выполняться на основе
определенных правил маскирования.
Функции anon.anonymize_database, anon.anonymize_table и
anon.anonymize_column позволяют преобразовать исходные таблицы
в соответствии с заранее определенными правилами.
Поскольку при этом перезаписываются все строки таблицы, даже если
изменяется только один столбец, такая операция может занять
продолжительное время.
Иногда может оказаться быстрее экспортировать анонимизированные
данные и повторно загрузить их в базу данных. Если нужно
экспортировать базу вместе с анонимизируемыми данными, следует
воспользоваться скриптом pg_dump_anon.sh.
12
Итоги
Анонимизация позволяет защитить конфиденциальные
данные, когда разграничение ролей неприменимо
Правила изменения данных определяются декларативно
с помощью меток безопасности
Поддерживается статическое и динамическое изменение
Анонимизация данных влечет накладные расходы
13
Практика
1. Настройте правило маскирования столбца с контактными
данными таблицы m_tickets так, чтобы почтовые адреса
содержали имена и фамилии пассажиров.
Экспортируйте данные таблицы в анонимизированном виде
от лица недоверенного пользователя.
2. Включите динамическое маскирование.
Объявите правило для подмены имени пассажира
в таблице m_tickets. Выполните несколько запросов к одной
из строк таблицы.
Затем перепишите правило так, чтобы использовалась
псевдонимизация и снова выполните запросы. Сравните
результаты.
1. Установите расширение и скопируйте небольшую часть данных
в таблицу m_tickets из bookings.tickets так, как это сделано
в демонстрации.
Напишите функцию, формирующую контактные данные, в которых
почтовый адрес имеет вид имя.фамилия@example.com. Поместите эту
функцию в доверенную схему и используйте ее в правиле изменения.
Создайте недоверенного пользователя и сделайте выгрузку данных
с помощью скрипта pg_dump_anon.sh от его имени.
2. Для подмены имен используйте изменчивую функцию
anon.fake_first_name. Для псевдонимизации замените ее на
anon.pseudo_first_name.