- Masking policies (ClickHouse Cloud, 25.12+): встроенное динамическое маскирование, применяемое во время выполнения запроса для определённых пользователей/ролей
- String replacement functions: базовое маскирование с помощью встроенных функций
- Masked views: создание представлений с логикой преобразования
- Materialized columns: хранение замаскированных версий рядом с исходными данными
- Query masking rules: маскирование конфиденциальных данных в журналах (ClickHouse OSS)
Использование политик маскирования (ClickHouse Cloud)
Политики маскирования доступны в ClickHouse Cloud, начиная с версии 25.12.
CREATE MASKING POLICY предоставляет встроенный механизм для динамического маскирования значений столбцов для определённых пользователей или ролей во время выполнения запроса. В отличие от других подходов, политики маскирования не требуют создавать отдельные представления или хранить замаскированные данные — преобразование выполняется прозрачно, когда пользователи отправляют запрос к таблице.
Базовая политика маскирования
orders, содержащую информацию о клиентах:
masked_data_viewer:
masked_data_viewer выполняет запрос к таблице orders, он автоматически видит замаскированные данные:
Query
Response (for masked_data_viewer role)
masked_data_viewer видят исходные данные без маскировки.
Условное маскирование
WHERE, чтобы применять маскирование только к определённым строкам. Например, чтобы маскировать только заказы с высокой стоимостью:
Несколько политик с приоритетом
PRIORITY, чтобы указать, какое преобразование будет применено. Более высокие значения приоритета применяются последними:
total_amount > 100 политика refined_masking (приоритет 10) имеет приоритет над политикой basic_masking (приоритет 0) для столбца name, а для email по-прежнему используется базовое маскирование.
Маскирование на основе хеша
Управление политиками маскирования
Использование функций замены строк
replace предлагает удобный способ скрытия данных:
| Function | Description |
|---|---|
replaceOne | Заменяет первое вхождение подстроки в исходной строке на указанную строку замены. |
replaceAll | Заменяет все вхождения подстроки в исходной строке на указанную строку замены. |
replaceRegexpOne | Заменяет первое вхождение подстроки в исходной строке, соответствующей шаблону регулярного выражения (в синтаксисе re2), на указанную строку замены. |
replaceRegexpAll | Заменяет все вхождения подстроки в исходной строке, соответствующей шаблону регулярного выражения (в синтаксисе re2), на указанную строку замены. |
replaceOne можно заменить имя “John Smith” на заполнитель [CUSTOMER_NAME]:
Query
Response
replaceRegexpOne, чтобы заменить любое имя клиента:
Query
Response
replaceRegexpAll.
Query
\3 используется для подстановки третьей группы захвата в результирующую строку, что даёт:
Response
Создание маскированных VIEW
VIEW можно использовать вместе с упомянутыми выше строковыми функциями, чтобы преобразовывать столбцы, содержащие конфиденциальные данные, прежде чем показывать их пользователю.
При этом исходные данные остаются неизменными, а пользователи, выполняющие запросы к представлению, видят только замаскированные данные.
Для примера представим, что у нас есть таблица, в которой хранятся записи о заказах клиентов.
Нужно сделать так, чтобы группа сотрудников могла просматривать эту информацию, но не видела полные данные клиентов.
Выполните запрос ниже, чтобы создать пример таблицы orders и вставить в неё несколько вымышленных записей о заказах клиентов:
masked_orders:
SELECT запроса на создание представления выше мы задаём преобразования с помощью replaceRegexpOne для полей name, email, phone и shipping_address — именно эти поля содержат конфиденциальную информацию, которую мы хотим частично замаскировать.
Выберите данные из представления:
Query
Response
SELECT на представление:
SELECT на базовую таблицу ни через одну роль.
Поэтому для надежности следует явно отозвать доступ к базовой таблице:
masked_orders_viewer смогут видеть только
маскированные данные из представления, а не исходные немаскированные данные из таблицы.
Использование столбцов MATERIALIZED и ограничений доступа на уровне столбцов
VIEW для маскированных данных теперь создадим маскированные столбцы с помощью MATERIALIZED:
SELECT *.
Query
Response
orders.
Заново создайте роль, которую мы создали ранее:
SELECT на таблицу orders:
orders только маскированные данные,
можно пометить чувствительные немаскированные столбцы как EPHEMERAL,
тогда столбцы этого типа не будут сохраняться в таблице.
Query
Response
Используйте правила маскирования запросов для данных журналов
system.query_log, system.text_log и system.processes).
Это помогает предотвратить утечку конфиденциальных данных только в журналы.
Обратите внимание, что результаты запросов при этом не маскируются.
Например, чтобы замаскировать номер социального страхования, можно добавить следующее правило в конфигурацию сервера: