Перейти к основному содержанию
Маскирование данных — это метод защиты данных, при котором исходные данные заменяются версией, сохраняющей их формат и структуру, но исключающей любую информацию, позволяющую идентифицировать личность (PII), а также другие конфиденциальные сведения. В этом руководстве показано, как маскировать данные в ClickHouse несколькими способами:
  • 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 по-прежнему используется базовое маскирование.

Маскирование на основе хеша

Если вам нужно единообразное маскирование (когда один и тот же вход всегда дает один и тот же замаскированный результат), используйте хеш-функции:

Управление политиками маскирования

Просмотрите все политики маскирования:
Удалить политику маскирования:
Замените существующую политику:
Подробнее см. в документации CREATE MASKING POLICY.

Использование функций замены строк

Для базовых сценариев маскирования данных семейство функций replace предлагает удобный способ скрытия данных: Например, с помощью функции replaceOne можно заменить имя “John Smith” на заполнитель [CUSTOMER_NAME]:
Query
Response
В более общем виде можно использовать replaceRegexpOne, чтобы заменить любое имя клиента:
Query
Response
Или можно замаскировать номер социального страхования, оставив только последние 4 цифры, с помощью функции replaceRegexpAll.
Query
В приведённом выше запросе \3 используется для подстановки третьей группы захвата в результирующую строку, что даёт:
Response

Создание маскированных VIEW

VIEW можно использовать вместе с упомянутыми выше строковыми функциями, чтобы преобразовывать столбцы, содержащие конфиденциальные данные, прежде чем показывать их пользователю. При этом исходные данные остаются неизменными, а пользователи, выполняющие запросы к представлению, видят только замаскированные данные. Для примера представим, что у нас есть таблица, в которой хранятся записи о заказах клиентов. Нужно сделать так, чтобы группа сотрудников могла просматривать эту информацию, но не видела полные данные клиентов. Выполните запрос ниже, чтобы создать пример таблицы orders и вставить в неё несколько вымышленных записей о заказах клиентов:
Создайте представление masked_orders:
В предложении SELECT запроса на создание представления выше мы задаём преобразования с помощью replaceRegexpOne для полей name, email, phone и shipping_address — именно эти поля содержат конфиденциальную информацию, которую мы хотим частично замаскировать. Выберите данные из представления:
Query
Response
Обратите внимание, что данные, возвращаемые представлением, частично замаскированы, что скрывает конфиденциальную информацию. Вы также можете создать несколько представлений с разными уровнями маскирования — в зависимости от того, какой уровень привилегированного доступа к информации есть у пользователя, просматривающего данные. Чтобы пользователи могли обращаться только к представлению, возвращающему замаскированные данные, а не к таблице с исходными незамаскированными данными, следует использовать ролевое управление доступом, чтобы у определённых ролей были привилегии только на выборку из представления. Сначала создайте роль:
Затем выдайте роли привилегию SELECT на представление:
Поскольку роли в ClickHouse аддитивны, необходимо убедиться, что пользователи, которым должен быть доступен только маскированный VIEW, не имеют привилегии SELECT на базовую таблицу ни через одну роль. Поэтому для надежности следует явно отозвать доступ к базовой таблице:
Наконец, назначьте роль нужным пользователям:
Это гарантирует, что пользователи с ролью masked_orders_viewer смогут видеть только маскированные данные из представления, а не исходные немаскированные данные из таблицы.

Использование столбцов MATERIALIZED и ограничений доступа на уровне столбцов

Если вы не хотите создавать отдельное представление, можно хранить маскированные версии данных вместе с исходными данными. Для этого можно использовать материализованные столбцы. Значения таких столбцов автоматически вычисляются по указанному материализованному выражению при вставке строк, и их можно использовать для создания новых столбцов с маскированными версиями данных. Возвращаясь к предыдущему примеру, вместо создания отдельного VIEW для маскированных данных теперь создадим маскированные столбцы с помощью MATERIALIZED:
Если теперь выполнить следующий запрос SELECT, вы увидите, что маскированные данные «материализуются» при вставке и сохраняются вместе с исходными, немаскированными данными. Необходимо явно выбирать маскированные столбцы, поскольку по умолчанию ClickHouse не включает материализованные столбцы в запросы SELECT *.
Query
Response
Чтобы пользователи могли получать доступ только к столбцам с маскированными данными, можно снова использовать управление доступом на основе ролей, чтобы у определённых ролей были привилегии на выборку только из маскированных столбцов таблицы orders. Заново создайте роль, которую мы создали ранее:
Затем предоставьте право SELECT на таблицу orders:
Отзовите доступ к конфиденциальным столбцам:
Наконец, назначьте роль нужным пользователям:
Если вы хотите хранить в таблице orders только маскированные данные, можно пометить чувствительные немаскированные столбцы как EPHEMERAL, тогда столбцы этого типа не будут сохраняться в таблице.
Если выполнить тот же запрос, что и ранее, вы увидите, что в таблицу были вставлены только материализованные замаскированные данные:
Query
Response

Используйте правила маскирования запросов для данных журналов

Пользователи ClickHouse OSS, которым нужно маскировать именно данные в журналах, могут использовать правила маскирования запросов (маскирование журналов). Для этого можно определить в конфигурации сервера правила маскирования на основе регулярных выражений. Эти правила применяются к запросам и всем сообщениям лога до их сохранения в серверном журнале или системных таблицах (таких как system.query_log, system.text_log и system.processes). Это помогает предотвратить утечку конфиденциальных данных только в журналы. Обратите внимание, что результаты запросов при этом не маскируются. Например, чтобы замаскировать номер социального страхования, можно добавить следующее правило в конфигурацию сервера:
Последнее изменение 29 июня 2026 г.