Привет, Хабр!
На связи Артемий Новожилов, архитектор систем ИБ и автор ТГ-канала Data Security и Дмитрий Ларин, руководитель продуктового направления по защите баз данных, группа компаний «Гарда». С нами вы могли познакомиться по таким статьям как маскирование и Apache Kafka. И сегодня мы хотим продолжить тему маскирования данных.
Современные компании обрабатывают огромные объемы конфиденциальных данных: персональные данные (как сотрудников, так и партнеров и клиентов), информацию о клиентах и их заказах, финансовые и бухгалтерские сведения, данные, относящиеся к коммерческой тайне и интеллектуальной собственности, а также технические настройки и доступы. В связи с этим возникают повышенные риски утечки данных, сложности с соблюдением требований законодательства (например, ФЗ-152 и GDPR), угроза инсайдерских атак, а для тестов или аналитики приходится создавать отдельные копии баз данных (БД).
Один из эффективных способов защиты данных – динамическое маскирование (Dynamic Data Masking, DDM). Технология позволяет скрывать или искажать конфиденциальные данные в реальном времени в зависимости от ролей и прав доступа пользователя, не изменяя их в базе данных. Это снижает риск утечки информации при работе с базами данных упрощает соблюдение требований законодательства и позволяет безопасно использовать данные в тестовой среде или при аналитике, не раскрывая их реальное содержимое. В отличие от статического подхода, динамическое маскирование не требует создания отдельных копий данных, что экономит ресурсы и позволяет не менять бизнес-процессы.
В этой статье разберем:
Что же такое динамическое маскирование?
Чтобы безопасно работать с конфиденциальной информацией, придумали способы ее маскировать. Преимущества метода:
обеспечение соответствия требованиям регуляторов при обработке информации (ФЗ-152 «О защите персональных данных», GDPR и подобных актов);
безопасное использование БД сотрудниками и внешними подрядчиками, снижение риска утечек персональной информации;
специализированные инструменты для маскирования часто поддерживают планирование задач и интеграцию в CI/CD-процессы, позволяя контролировать нагрузку на продуктивную базу и не мешая основным бизнес-процессам.
Существует два типа маскирования баз данных.
Статическое маскирование предполагает, как правило, создание копии продуктивной базы данных, в которой конфиденциальные данные заменяются на обезличенные, но при этом сохраняется структура базы, включая ключи, индексы и связи между таблицами. Это обеспечивает возможность полноценно работать с такими данными, не нарушая их логику и формат, при этом исключая доступ к реальной информации.
Динамическое маскирование в основном, используется при работе с оригинальной базой: данные маскируются «на лету», прямо в момент обработки запроса, например, в зависимости от прав доступа пользователя. Такой механизм часто применяется для гибкого разграничения прав доступа в серверах приложений: например, одни сотрудники видят полную информацию, такие как суммы сделок, а другим отображаются замаскированные значения, например, в виде звездочек.
Главное отличие между методами – динамическое маскирование «на лету» меняет данные в ответе, который получает пользователь, статическое – создает копию production базы данных с сохранением ее структуры и взаимосвязей, но с заменой конфиденциальных данных на синтетические. При этом статическое маскирование может изменять только часть данных (например, заменяя реальные email на user1@example.com) или создавать урезанную копию исходной БД. Важно то, что при статическом маскировании процесс обезличивания, обычно, необратим.
Динамическое маскирование скрывает данные от неавторизованных пользователей, при этом физически с данными в боевой БД ничего не происходит, только пользователю может отображаться результат в обезличенном виде в соответствии с его правами доступа.
Сценарии применения динамического маскирования
Разграничение доступа по ролям. Менеджер видит все детали клиента, а оператор колл-центра – только часть (например, скрыты данные паспорта, адрес или номер банковской карты). Руководители видят суммы контрактов, а сотрудники без финансового допуска – маскированные значения. Маскирование включается при доступе из внешней сети или через VPN при удаленной работе.
Безопасная работа с продуктивной базой. Аналитики и разработчики получают доступ к данным в продуктивной БД, но видят только обезличенную версию – для анализа, отладки или мониторинга. Внешним разработчикам, фрилансерам или интеграторам предоставляется доступ с динамическим маскированием без передачи настоящих данных.
Интеграция с BI-системами. Обезличивание чувствительных данных «на лету» при передаче в аналитические панели.
Защита данных в CRM, ERP, HRM-системах. В CRM скрываются контактные данные клиентов от рядовых сотрудников. В ERP отображаются маскированные зарплаты или финансовые отчеты в зависимости от уровня доступа.
Внешний аудит и демонстрации. Внешним аудиторам или проверяющим предоставляется доступ к системе с динамически обезличенными данными, без риска утечки.
Поддержка пользователей и тестирование на проде. Техническая поддержка получает доступ к системе, но видит только необходимые для работы данные, а другая информация маскируется (например, логины, телефоны или финансовые параметры сделки).
Облачные и мультиарендные среды. Разные клиенты или арендаторы в облаке и в SaaS-решениях видят только свои данные, остальное скрывается или маскируется.
Обеспечение нулевого знания (zero knowledge). Даже системные администраторы и разработчики, имеющие доступ к БД, не могут видеть реальные персональные данные.
Защита в API и микросервисах. При вызовах API чувствительные поля маскируются в ответах в зависимости от токена доступа или контекста запроса.
Встраивание в CI/CD. Когда в процессах CI/CD задействуются реальные данные (например, при автотестах или нагрузочном тестировании), возникает риск непреднамеренного раскрытия конфиденциальной информации. Чтобы этого избежать, можно встроить динамическое маскирование данных на этапе работы с продуктивной или тестовой БД.
Обучение персонала. Новые сотрудники могут проходить обучение на продуктивной системе, не получая доступ к реальным данным.
Техническая реализация маскирования в СУБД и приложениях
Динамическое маскирование можно реализовать как собственными средствами в СУБД, так и через middleware-приложения. Рассмотрим основные принципы технической реализации.
Встроенные механизмы в СУБД
Многие современные СУБД поддерживают нативное динамическое маскирование данных на уровне самой базы. Это позволяет задать как именно данные будут отображаться пользователю в зависимости от его роли или условий запроса.
Примеры реализации в популярных СУБД.
Microsoft SQL Server
Функция: Dynamic Data Masking
Маскирование задается на уровне столбцов:
sql
CopyEdit
ALTER TABLE Customers
ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()');
Пользователи без специального разрешения видят, например: aXXX@XXXX.com
Oracle Database
Использует Virtual Private Database (VPD) и Data Redaction
Маскирование на уровне политики: можно задать, какие данные и кому отображать
PostgreSQL
Нативно не поддерживает маскирование, но реализуется через VIEW с логикой маскирования, Row-Level Security (RLS) и функции для подмены данных
MySQL
Маскирование реализуется через триггеры, представления (VIEW) или сторонние расширения
Реализация в приложениях (middleware-уровень)
Когда маскирование невозможно или неудобно сделать на уровне базы, его реализуют на уровне промежуточного слоя – между приложением и БД. Подходы:
Прокси/шлюз перед базой данных, который перехватывает SQL-запросы и переписывает ответы
Маскирование в API – перед возвратом данных клиенту происходит подмена чувствительных значений
Примеры
• Middleware-приложение, читающее результат SQL-запроса, и заменяющее email, паспорт или телефон на *** или MASKED_VALUE
• REST API, возвращающее данные в JSON, в котором salary показывается как null или ***** в зависимости от прав
Политики маскирования и контроль доступа
Для динамического маскирования важно не только скрыть данные, но и определить, кому, что и при каких условиях показывать. Маскирование может применяться как ко всем пользователям по умолчанию, так и выборочно – при работе из внешней сети, на определенных устройствах и т.п.
Методы
• RBAC (Role-Based Access Control) – маскирование зависит от роли пользователя
• ABAC (Attribute-Based Access Control) – условия маскирования определяются набором атрибутов (например, время, IP, окружение, тип запроса)
Сравнение подходов
Итого, технически динамическое маскирование реализуется:
встроенными средствами СУБД (маскирование колонок, редактирование представлений);
через прокси, API, middleware-приложения;
специализированными продуктами для маскирования
гибридно: БД + приложение + контроль доступа
Сравним первые три подхода к динамическому маскированию, так как четвертый – комбинирует критерии из трех базовых, поэтому его вынесли за скобки.
Критерий |
Встроенное в СУБД |
Прокси/API/Middleware |
Спецприложения |
Сложность внедрения |
Низкая (если СУБД поддерживает) |
Средняя/высокая – нужна доп. инфраструктура |
Средняя – требует доработки кода приложения |
Гибкость и настройка |
Ограниченная (зависит от СУБД) |
Высокая: можно реализовать любую бизнес-логику |
Очень высокая: полный контроль, но требует усилий |
Производительность |
Может страдать при больших объемах |
Может добавлять задержку |
Практически без потерь, если оптимально реализовано |
Поддержка сложных сценариев |
Ограничена (условная логика, комбинированные поля – сложно) |
Отличная: можно маскировать по ролям, условиям, шаблонам |
Отличная: доступ ко всем данным и логике приложения |
Безопасность (при прямом доступе) |
Уязвимо при доступе с правами администратора |
Уязвимо при обходе прокси (если не настроена изоляция) |
Уязвимо при прямом доступе к БД в обход приложения |
Масштабируемость |
Хорошая, если работает на уровне самой БД |
Требует масштабирования прокси-инфраструктуры |
Зависит от архитектуры приложения |
Аудит и логирование доступа |
Почти отсутствует (нужно подключать доп. инструменты) |
Можно встроить мониторинг и аудит |
Есть полный контроль при логировании запросов |
Поддержка BI и сторонних систем |
Хорошая совместимость |
Может вызывать сложности (нужно писать адаптеры) |
Требует дополнительных API или шлюзов |
Интеграция в CI/CD |
Ограничена, нужна ручная настройка |
Хорошая – через API, скрипты и REST |
Отличная: можно заложить прямо в пайплайн |
Поддержка нескольких СУБД |
Требует отдельной настройки в каждой БД |
Унифицировано через единый слой |
Требует поддержки на всех уровнях приложения |
Как динамическое маскирование работает в «Гарда DBF»
Мы реализовали функционал динамического маскирования, как модуль «Гарда DBF» – продукте для защиты баз данных класса Database activity monitoring (DAM)/Database Firewall (DBF). Важная ремарка: для его работы необходимо, чтобы «Гарда DBF» был установлен по принципу L3 Reverse proxy, то есть «в разрыв», когда сессия заворачивается на сенсор продукта.
Правила маскирования задаются в формате JSON. Так, например, список пользователей, для которых не нужно применять маскирование будет выглядеть так:
“masking_whitelist”: [
“postgres”
]
Чтобы уметь работать с белыми списками, необходимо научить программный комплекс (или его отдельные модули) получать пользователя из протокола взаимодействия с БД. Важно отметить, что протокол и способы работы с ним для разных БД может отличаться.
Пожалуй, главными вопросами при настройке динамического маскирования будут: кому разрешено видеть данные и какие именно?
На первый вопрос отвечают белые списки: в конфигураторе «Гарда DBF» существует конечный список пользователей, которым разрешено видеть конфиденциальные данные (номер телефона, адрес фактического проживания, номер карты и другие).
Для ответа на второй вопрос нужно понять, каким образом мы будем ограничивать доступ к данным, ведь они могут храниться в разных таблицах, в представлениях - все в конфигуратор добавить не получится. Здесь нам на помощь приходит raw-формат ответа. Работа с raw-форматом хороша тем, что такой подход не привязан к конкретному протоколу БД. Поэтому мы будем смотреть на то, что содержится непосредственно в ответе на запрос. Поиск регулярных выражений идет непрерывно в потоке данных. Как мы уже отмечали ранее, для задания правил маскирования будем использовать формат JSON:
“masking_regex”: {
“name”: {
“regex”: [A-Z][a-z]”,
“mask_mode”: “inner”
…
}
}
“mask_mode”: “inner” – означает маскировать внутри строки, подходящий под регулярное выражение. Например:
Исходное Результат
Alice li*
Таким образом, мы получаем инструмент, который для легитимных пользователей никак не меняет работу, а всем остальным обеспечена возможность просматривать только разрешенные не критичные данные; все критичные заменяются на звездочки.
Заключение
Динамическое маскирование – практичный способ защитить чувствительные данные без создания отдельных копий БД и вмешательства в бизнес-логику приложений. Оно хорошо работает в случаях, когда нужно обеспечить избирательный доступ к информации: одни пользователи видят реальные значения, другие – обезличенные. Это удобно для аналитики, тестирования, удаленной поддержки и работы с подрядчиками. В отличие от статического подхода, DDM не требует обновления копий и не добавляет лишнюю нагрузку на инфраструктуру.
Мы показали, как технология реализуется в «Гарда DBF» – через маскирование на уровне сетевого трафика, без изменения самих данных. Используются правила в формате JSON, поддерживается работа с raw-ответами и регулярными выражениями. Такой подход позволяет централизованно управлять доступом к данным. В итоге можно гибко настраивать маскирование под разные сценарии и типы пользователей.