Pular para o conteúdo principal
O mascaramento de dados é uma técnica de proteção de dados na qual os dados originais são substituídos por uma versão que preserva seu formato e sua estrutura, mas remove qualquer informação de identificação pessoal (PII) ou informação sensível. Este guia mostra como mascarar dados no ClickHouse usando várias abordagens:
  • Masking policies (ClickHouse Cloud, 25.12+): Mascaramento dinâmico nativo aplicado no momento da consulta para usuários ou funções específicos
  • String replacement functions: Mascaramento básico com funções integradas
  • Masked views: Criação de views com lógica de transformação
  • Materialized columns: Armazenamento de versões mascaradas junto com os dados originais
  • Query masking rules: Mascaramento de dados sensíveis em logs (ClickHouse OSS)

Usar políticas de mascaramento (ClickHouse Cloud)

As políticas de mascaramento estão disponíveis no ClickHouse Cloud a partir da versão 25.12.
A instrução CREATE MASKING POLICY oferece uma forma nativa de mascarar dinamicamente valores de colunas para usuários ou papéis específicos durante a consulta. Diferentemente de outras abordagens, as políticas de mascaramento não exigem a criação de views separadas nem o armazenamento de dados mascarados - a transformação ocorre de forma transparente quando os usuários consultam a tabela.

Política de mascaramento básica

Para demonstrar as políticas de mascaramento, vamos criar uma tabela orders que contém informações de clientes:
Agora, crie uma role para os usuários que devem ver dados mascarados:
Crie uma política de mascaramento para a role masked_data_viewer:
Quando um usuário com a função masked_data_viewer consulta a tabela orders, ele vê automaticamente dados mascarados:
Query
Response (for masked_data_viewer role)
Usuários sem o papel masked_data_viewer veem os dados originais, não mascarados.

Mascaramento condicional

Você pode usar a cláusula WHERE para aplicar o mascaramento somente a linhas específicas. Por exemplo, para mascarar apenas pedidos de alto valor:

Múltiplas políticas com prioridade

Quando várias políticas de mascaramento se aplicarem à mesma coluna, use a cláusula PRIORITY para definir qual transformação será aplicada. Valores de prioridade mais altos são aplicados por último:
Neste exemplo, para pedidos com total_amount > 100, a política refined_masking (prioridade 10) substitui a política basic_masking (prioridade 0) para a coluna name, enquanto email continua usando o mascaramento básico.

Mascaramento baseado em hash

Nos casos em que você precisa de um mascaramento consistente (a mesma entrada sempre produz a mesma saída mascarada), use funções hash:

Gerenciar políticas de mascaramento

Veja todas as políticas de mascaramento:
Exclua uma política de mascaramento:
Substitua uma política existente:
Para mais informações, consulte a documentação de CREATE MASKING POLICY.

Use funções de substituição de strings

Para casos básicos de mascaramento de dados, a família de funções replace oferece uma forma prática de mascarar dados: Por exemplo, você pode substituir o nome “John Smith” por um marcador [CUSTOMER_NAME] usando a função replaceOne:
Query
Response
De maneira mais genérica, você pode usar replaceRegexpOne para substituir qualquer nome de cliente:
Query
Response
Ou você pode mascarar um número do seguro social, deixando visíveis apenas os últimos 4 dígitos com a função replaceRegexpAll.
Query
Na consulta acima, \3 é usado para substituir o terceiro grupo de captura pela string resultante, o que produz:
Response

Criar VIEWs mascaradas

Uma VIEW pode ser usada em conjunto com as funções de string mencionadas anteriormente para aplicar transformações a colunas que contêm dados sensíveis antes de serem apresentados ao usuário. Dessa forma, os dados originais permanecem inalterados, e os usuários que consultam a view veem apenas os dados mascarados. Para demonstrar, imagine que temos uma tabela que armazena registros de pedidos de clientes. Queremos garantir que um grupo de funcionários possa visualizar essas informações, mas não queremos que eles vejam todos os dados dos clientes. Execute a consulta abaixo para criar uma tabela de exemplo orders e inserir nela alguns registros fictícios de pedidos de clientes:
Crie a view masked_orders:
Na cláusula SELECT da consulta de criação da view acima, definimos transformações com replaceRegexpOne nos campos name, email, phone e shipping_address, que contêm informações sensíveis e que queremos mascarar parcialmente. Selecione os dados da view:
Query
Response
Observe que os dados retornados pela view estão parcialmente mascarados, ocultando as informações sensíveis. Você também pode criar várias views, com diferentes níveis de ofuscação, dependendo do nível de acesso privilegiado às informações que o usuário tem. Para garantir que os usuários possam acessar apenas a view que retorna os dados mascarados, e não a tabela com os dados originais sem máscara, use Controle de Acesso Baseado em Papéis para garantir que papéis específicos tenham permissões apenas para consultar a view. Primeiro, crie o papel:
Em seguida, conceda privilégios SELECT sobre a view ao role:
Como as roles do ClickHouse são cumulativas, você deve garantir que os usuários que devem ver apenas a view mascarada não tenham nenhum privilégio SELECT na tabela base por meio de nenhuma role. Assim, por segurança, você deve revogar explicitamente o acesso à tabela base:
Por fim, atribua a função aos usuários adequados:
Isso garante que os usuários com a função masked_orders_viewer possam ver apenas os dados mascarados da view, e não os dados originais, sem máscara, da tabela.

Use colunas MATERIALIZED e restrições de acesso no nível da coluna

Nos casos em que você não quiser criar uma visualização separada, é possível armazenar versões mascaradas dos seus dados junto com os dados originais. Para isso, você pode usar colunas materializadas. Os valores dessas colunas são calculados automaticamente de acordo com a expressão materializada especificada quando as linhas são inseridas, e podemos usá-los para criar novas colunas com versões mascaradas dos dados. Retomando o exemplo anterior, em vez de criar uma VIEW separada para os dados mascarados, agora vamos criar colunas mascaradas usando MATERIALIZED:
Se você executar agora a consulta select a seguir, verá que os dados mascarados são ‘materializados’ no momento da inserção e armazenados junto com os dados originais, sem mascaramento. É necessário selecionar explicitamente as colunas mascaradas, pois o ClickHouse não inclui automaticamente colunas materializadas em consultas SELECT * por padrão.
Query
Response
Para garantir que os usuários só possam acessar colunas que contenham os dados mascarados, você pode novamente usar o controle de acesso baseado em papéis para garantir que papéis específicos tenham apenas permissões de SELECT nas colunas mascaradas de orders. Recrie o papel que criamos anteriormente:
Em seguida, conceda a permissão SELECT na tabela orders:
Revogue o acesso a colunas sensíveis:
Por fim, atribua a role aos usuários apropriados:
No caso de você querer armazenar apenas os dados mascarados na tabela orders, é possível marcar as colunas sensíveis não mascaradas como EPHEMERAL, o que garante que colunas desse tipo não sejam armazenadas na tabela.
Se executarmos a mesma consulta de antes, você verá agora que apenas os dados mascarados já materializados foram inseridos na tabela:
Query
Response

Use regras de mascaramento de consultas para dados de log

Para usuários do ClickHouse OSS que desejam mascarar especificamente dados de log, é possível usar query masking rules (mascaramento de logs) para mascarar dados. Para isso, você pode definir regras de mascaramento baseadas em expressões regulares na configuração do servidor. Essas regras são aplicadas às consultas e a todas as mensagens de log antes de serem armazenadas nos logs do servidor ou em tabelas de sistema (como system.query_log, system.text_log e system.processes). Isso ajuda a evitar que dados sensíveis vazem apenas nos logs. Observe que isso não mascara dados nos resultados da consulta. Por exemplo, para mascarar um número de seguro social, você pode adicionar a seguinte regra à sua configuração do servidor:
Última modificação em 19 de junho de 2026