Compartilhar via


Filtrar dados confidenciais da tabela usando filtros de linha e máscaras de coluna

Este artigo fornece diretrizes e exemplos para usar filtros de linha, máscaras de coluna e tabelas de mapeamento para filtrar dados confidenciais em suas tabelas. Esses recursos exigem o Catálogo do Unity.

O que são filtros de linha?

Os filtros de linha permitem que você aplique um filtro a uma tabela para que as consultas retornem apenas linhas que atendam aos critérios de filtro. Você implementa um filtro de linha como uma UDF (função definida pelo usuário) do SQL. As UDFs do Python e do Scala também são compatíveis, mas somente quando são encapsuladas em UDFs do SQL.

O que são máscaras de coluna?

As máscaras de coluna permitem aplicar uma função de mascaramento a uma coluna de tabela. A função de mascaramento é avaliada no runtime de consulta, substituindo cada referência da coluna de destino pelos resultados da função de mascaramento. Para a maioria dos casos de uso, as máscaras de coluna determinam se o valor da coluna original deve ser retornado ou redigido com base na identidade do usuário invocado. Máscaras de coluna são expressões escritas como UDFs do SQL ou como UDFs do Python ou do Scala encapsuladas em UDFs do SQL.

Cada coluna de tabela pode, opcionalmente, ter uma função de mascaramento aplicada a ela. A função de mascaramento usa o valor desmascarado da coluna como entrada e retorna o valor mascarado como resultado. O valor retornado da função de mascaramento deve ser do mesmo tipo que a coluna que está sendo mascarada. A função de mascaramento também pode usar colunas adicionais como parâmetros de entrada e usá-las em sua lógica de mascaramento.

Qual é a diferença entre esses filtros e exibições dinâmicas?

Tanto exibições dinâmicas quanto filtros de linha e máscaras de coluna permitem aplicar lógica complexa às tabelas e processar as decisões de filtragem delas no runtime de consulta.

Uma exibição dinâmica é uma exibição abstrata e somente leitura de uma ou mais tabelas de origem. O usuário pode acessar uma exibição dinâmica sem ter acesso diretamente às tabelas de origem. A criação de uma exibição dinâmica define um novo nome de tabela que não deve corresponder ao nome de nenhuma tabela de origem ou de outras tabelas e exibições presentes no mesmo esquema.

Por outro lado, associar um filtro de linha ou máscara de coluna a uma tabela de destino aplica a lógica correspondente diretamente à própria tabela sem introduzir novos nomes de tabela. As consultas subsequentes podem continuar se referindo diretamente à tabela de destino usando o nome original dela.

Use exibições dinâmicas se precisar aplicar a lógica de transformação, como filtros e máscaras, a tabelas somente leitura e se for aceitável que os usuários se refiram aos modos de exibição dinâmicos usando nomes diferentes. Se você quiser filtrar dados ao compartilhá-los usando o Compartilhamento Delta, precisará usar exibições dinâmicas. Use filtros de linha e máscaras de coluna se quiser filtrar ou calcular expressões em dados específicos, mas ainda fornecer aos usuários acesso às tabelas usando seus nomes originais.

Antes de começar

Para adicionar filtros de linha e máscaras de coluna a tabelas, você precisa ter:

Você também precisa atender aos seguintes requisitos:

  • Para atribuir uma função que adiciona filtros de linha ou máscaras de coluna a uma tabela, você precisa ter o privilégio EXECUTE na função, USE SCHEMA no esquema e USE CATALOG no catálogo pai.
  • Se você estiver adicionando filtros ou máscaras ao criar uma nova tabela, é necessário ter o privilégio de CREATE TABLE no esquema.
  • Se você estiver adicionando filtros ou máscaras a uma tabela existente, é necessário ser o proprietário da tabela ou ter os privilégios MODIFY e SELECT na tabela.

Para acessar uma tabela que tenha filtros de linha ou máscaras de coluna, seu recurso de computação deve atender a um destes requisitos:

  • Um SQL warehouse.

  • Modo de acesso compartilhado no Databricks Runtime 12.2 LTS ou em versões posteriores.

  • Modo de acesso de usuário único no Databricks Runtime 15.4 LTS ou superior.

    Você não pode ler filtros de linha ou máscaras de coluna usando a computação de usuário único no Databricks Runtime 15.3 ou inferior.

    Para aproveitar a filtragem de dados fornecida no Databricks Runtime 15.4 LTS e superior, você também deve verificar se seu espaço de trabalho está habilitado para computação sem servidor, porque a funcionalidade de filtragem de dados que suporta filtros de linha e máscaras de coluna é executada na computação sem servidor. Portanto, você pode ser cobrado por recursos de computação sem servidor ao usar a computação de usuário único para ler tabelas que usam filtros de linha ou máscaras de coluna. Consulte Controle de acesso refinado na computação de usuário único.

Aplicar um filtro de linha

Para criar um filtro de linha, primeiro escreva uma função (UDF) para definir a política de filtro e, em seguida, aplique-a a uma tabela. Cada tabela pode ter apenas um filtro de linha. Um filtro de linha aceita zero ou mais parâmetros de entrada em que cada parâmetro de entrada se associa a uma coluna da tabela correspondente.

Você pode aplicar um filtro de linha usando o Gerenciador de Catálogos ou comandos SQL. As instruções do Gerenciador de Catálogos pressupõem que você já criou uma função e que ela está registrada no Catálogo do Unity. As instruções SQL incluem exemplos de como criar uma função de filtro de linha e aplicá-la a uma tabela.

Explorador do Catálogo

  1. No workspace do Azure Databricks, clique em Ícone do catálogo Catálogo.
  2. Procure ou pesquise a tabela que você deseja filtrar.
  3. Na guia Visão geral, clique em Filtro de linha: Adicionar filtro.
  4. Na caixa de diálogo Adicionar filtro de linha, selecione o catálogo e o esquema que contêm a função de filtro e selecione a função.
  5. Na caixa de diálogo expandida, exiba a definição da função e selecione as colunas de tabela que correspondem às colunas incluídas na instrução de função.
  6. Clique em Adicionar.

Para remover o filtro da tabela, clique em Filtro de Linha fx e clique em Remover.

SQL

Para criar um filtro de linha e adicioná-lo a uma tabela existente, use CREATE FUNCTION e aplique a função usando ALTER TABLE. Você também pode aplicar uma função ao criar uma tabela usando CREATE TABLE.

  1. Crie o filtro de linha:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {filter clause whose output must be a boolean};
    
  2. Aplique o filtro de linha a uma tabela usando um nome de coluna:

    ALTER TABLE <table_name> SET ROW FILTER <function_name> ON (<column_name>, ...);
    

Exemplos de sintaxe adicionais:

  • Aplique o filtro de linha a uma tabela usando um literal constante que corresponda a um parâmetro de função:

    ALTER TABLE <table_name> SET ROW FILTER <function_name> ON (<constant_literal>, ...);
    
  • Remova um filtro de linha de uma tabela:

    ALTER TABLE <table_name> DROP ROW FILTER;
    
  • Modifique um filtro de linha:

    Run a DROP FUNCTION statement to drop the existing function, or use CREATE OR REPLACE FUNCTION to replace it.
    
  • Exclua um filtro de linha:

    ALTER TABLE <table_name> DROP ROW FILTER;
    DROP FUNCTION <function_name>;
    

    Observação

    Você precisa executar o comando ALTER TABLE ... DROP ROW FILTER antes de remover a função. Se você não fizer isso, a tabela estará em um estado inacessível.

    Se a tabela se tornar inacessível dessa forma, altere a tabela e solte a referência de filtro de linha órfã usando ALTER TABLE <table_name> DROP ROW FILTER;.

Consulte também a Cláusula ROW FILTER.

Exemplos de filtros de linha

Este exemplo cria uma função definida pelo usuário do SQL que se aplica aos membros do grupo admin na região US.

Quando essa função de exemplo é aplicada à tabela sales, os membros do grupo admin podem acessar todos os registros na tabela. Se a função for chamada por um não administrador, a condição RETURN_IF falhará e a expressão region='US' será avaliada, filtrando a tabela para mostrar apenas registros na região US.

CREATE FUNCTION us_filter(region STRING)
RETURN IF(IS_ACCOUNT_GROUP_MEMBER('admin'), true, region='US');

Aplique a função a uma tabela como um filtro de linha. As consultas subsequentes da tabela sales retornam um subconjunto de linhas.

CREATE TABLE sales (region STRING, id INT);
ALTER TABLE sales SET ROW FILTER us_filter ON (region);

Desabilite o filtro de linha. As consultas futuras do usuário da tabela sales retornam todas as linhas da tabela.

ALTER TABLE sales DROP ROW FILTER;

Crie uma tabela com a função aplicada como um filtro de linha como parte da instrução CREATE TABLE. Consultas futuras da tabela sales, em seguida, cada uma retorna um subconjunto de linhas.

CREATE TABLE sales (region STRING, id INT)
WITH ROW FILTER us_filter ON (region);

Aplicar uma máscara de coluna

Para aplicar uma máscara de coluna, crie uma função (UDF) e aplique-a a uma coluna de tabela.

Você pode aplicar uma máscara de coluna usando o Gerenciador de Catálogos ou comandos SQL. As instruções do Gerenciador de Catálogos pressupõem que você já criou uma função e que ela está registrada no Catálogo do Unity. As instruções SQL incluem exemplos de como criar uma função de máscara de coluna e aplicá-la a uma coluna de tabela.

Explorador do Catálogo

  1. No workspace do Azure Databricks, clique em Ícone do catálogo Catálogo.
  2. Procure ou pesquise a tabela.
  3. Na guia Visão Geral, localize a linha à qual você deseja aplicar a máscara de coluna e clique no ícone de edição ícone EditarMáscara.
  4. Na caixa de diálogo Adicionar máscara de coluna, selecione o catálogo e o esquema que contêm a função de filtro e selecione a função.
  5. Na caixa de diálogo expandida, exiba a definição da função. Se a função incluir parâmetros além da coluna que está sendo mascarada, selecione as colunas de tabela para as quais você deseja converter esses parâmetros de função adicionais.
  6. Clique em Adicionar.

Para remover a máscara de coluna da tabela, clique em Máscara de coluna fx na linha da tabela e clique em Remover.

SQL

Para criar uma máscara de coluna e adicioná-la a uma coluna de tabela existente, use CREATE FUNCTION e aplique a função de mascaramento usando ALTER TABLE. Você também pode aplicar uma função ao criar uma tabela usando CREATE TABLE.

Você usa SET MASK para aplicar a função de mascaramento. Dentro da cláusula MASK, você pode usar qualquer uma das funções de runtime internas do Azure Databricks ou chamar outras funções definidas pelo usuário. Casos de uso comuns incluem inspecionar a identidade do usuário invocando a função usando current_user( ) ou obtendo os grupos dos quais eles são membros usando is_account_group_member( ). Para obter detalhes, consulte a Cláusula de máscara de coluna e as Funções internas.

  1. Crie uma máscara de coluna:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {expression with the same type as the first parameter};
    
  2. Aplique a máscara de coluna a uma coluna em uma tabela existente:

    ALTER TABLE <table_name> ALTER COLUMN <col_name> SET MASK <mask_func_name> USING COLUMNS <additional_columns>;
    

Exemplos de sintaxe adicionais:

  • Aplique a máscara de coluna a uma coluna em uma tabela existente usando um literal constante que corresponda a um parâmetro de função:

    ALTER TABLE <table_name> ALTER COLUMN <col_name> SET MASK <mask_func_name> USING COLUMNS (<constant_name>, ...);
    
  • Remova uma máscara de coluna de uma coluna em uma tabela:

    ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;
    
  • Modificar uma máscara de coluna: a função DROP existente ou use CREATE OR REPLACE TABLE.

  • Exclua uma máscara de coluna:

    ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;
    DROP FUNCTION <function_name>;
    

    Observação

    Você deve executar o comando ALTER TABLE antes de remover a função ou a tabela estará em um estado inacessível.

    Se a tabela se tornar inacessível dessa maneira, altere a tabela e descarte a referência de máscara órfã usando ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;.

Exemplos de máscara de coluna

Nesse exemplo, você cria uma função definida pelo usuário que mascara a coluna ssn para que somente os usuários que são membros do grupo HumanResourceDept possam exibir valores nessa coluna.

CREATE FUNCTION ssn_mask(ssn STRING)
  RETURN CASE WHEN is_member('HumanResourceDept') THEN ssn ELSE '***-**-****' END;

Aplique a nova função a uma tabela como uma máscara de coluna. Você pode adicionar a máscara de coluna ao criar a tabela ou depois.

--Create the `users` table and apply the column mask in a single step:

CREATE TABLE users (
  name STRING,
  ssn STRING MASK ssn_mask);
--Create the `users` table and apply the column mask after:

CREATE TABLE users
  (name STRING, ssn STRING);

ALTER TABLE users ALTER COLUMN ssn SET MASK ssn_mask;

As consultas nessa tabela agora retornam valores de coluna ssn mascarados quando o usuário que consulta não é membro do grupo HumanResourceDept:

SELECT * FROM users;
  James  ***-**-****

Para desabilitar a máscara de coluna para que as consultas retornem os valores originais na coluna ssn:

ALTER TABLE users ALTER COLUMN ssn DROP MASK;

Usar tabelas de mapeamento para criar uma lista de controle de acesso

Para obter segurança em nível de linha, considere definir uma tabela de mapeamento (ou lista de controle de acesso). Cada tabela de mapeamento é abrangente e codifica quais linhas de dados na tabela original são acessíveis a determinados usuários ou grupos. Tabelas de mapeamento são úteis porque oferecem integração simples com suas tabelas de fatos por meio de junções diretas.

Essa metodologia é benéfica para lidar com muitos casos de uso com requisitos personalizados. Os exemplos incluem:

  • Impondo restrições com base no usuário conectado ao acomodar regras diferentes para grupos de usuários específicos.
  • Criando hierarquias complexas, como estruturas organizacionais, exigindo conjuntos diversos de regras.
  • Replicando modelos de segurança complexos de sistemas de origem externos.

Ao adotar tabelas de mapeamento dessa forma, você pode lidar efetivamente com esses cenários desafiadores e garantir implementações robustas de segurança em nível de linha e de coluna.

Exemplos de tabela de mapeamento

Use uma tabela de mapeamento para verificar se o usuário atual está em uma lista:

USE CATALOG main;

Crie uma nova tabela de mapeamento:

DROP TABLE IF EXISTS valid_users;

CREATE TABLE valid_users(username string);
INSERT INTO valid_users
VALUES
  ('fred@databricks.com'),
  ('barney@databricks.com');

Crie um novo filtro:

Observação

Todos os filtros são executados com os direitos do definidor, exceto para funções que verificam o contexto do usuário (por exemplo, as funções CURRENT_USER e as funções IS_MEMBER) que são executadas como o invocador.

Neste exemplo, a função verifica se o usuário atual está na valid_users tabela. Se o usuário for encontrado, a função retornará true.

DROP FUNCTION IF EXISTS row_filter;

CREATE FUNCTION row_filter()
  RETURN EXISTS(
    SELECT 1 FROM valid_users v
    WHERE v.username = CURRENT_USER()
);

O exemplo a seguir aplica o filtro de linha durante a criação da tabela. Você também pode adicionar o filtro mais tarde usando uma instrução ALTER TABLE. Ao aplicar a uma tabela inteira, use a sintaxe ON (). Para um uso de linha específico use ON (row);.

DROP TABLE IF EXISTS data_table;

CREATE TABLE data_table
  (x INT, y INT, z INT)
  WITH ROW FILTER row_filter ON ();

INSERT INTO data_table VALUES
  (1, 2, 3),
  (4, 5, 6),
  (7, 8, 9);

Selecione dados da tabela. Isso só deverá retornar dados se o usuário estiver na tabela valid_users.

SELECT * FROM data_table;

Crie uma tabela de mapeamento composta por contas que sempre devem ter acesso para exibir todas as linhas na tabela, independentemente dos valores da coluna:

CREATE TABLE valid_accounts(account string);
INSERT INTO valid_accounts
VALUES
  ('admin'),
  ('cstaff');

Agora, crie uma UDF do SQL que retorna true se os valores de todas as colunas na linha forem menores que cinco ou se o usuário invocado for um membro da tabela de mapeamento acima.

CREATE FUNCTION row_filter_small_values (x INT, y INT, z INT)
  RETURN (x < 5 AND y < 5 AND z < 5)
  OR EXISTS(
    SELECT 1 FROM valid_accounts v
    WHERE IS_ACCOUNT_GROUP_MEMBER(v.account));

Por fim, aplique o UDF do SQL à tabela como um filtro de linha:

ALTER TABLE data_table SET ROW FILTER row_filter_small_values ON (x, y, z);

Suporte e limitações

Não há suporte para filtros de linha e máscaras de coluna com todas as funcionalidades do Azure Databricks ou em todos os recursos de computação. Esta seção lista as funcionalidades com suporte e as limitações.

Recursos e formatos com suporte

Esta lista de funcionalidades com suporte não é exaustiva. Alguns itens estão listados porque não tinham suporte durante a Visualização Pública.

  • Há suporte para notebooks Databricks SQL e Databricks para cargas de trabalho SQL.

  • Os comandos em DML executados por usuários com privilégios MODIFY têm suporte. Filtros e máscaras são aplicados aos dados lidos por instruções UPDATE e DELETE e não são aplicados a dados gravados (incluindo INSERT).

  • Formatos de dados compatíveis:

    • Delta e Parquet para tabelas gerenciadas e externas.
    • Vários outros formatos de dados para tabelas estrangeiras registradas no Catálogo do Unity usando a Federação Lakehouse.
  • Os parâmetros de política podem incluir expressões constantes (cadeias de caracteres, numéricas, intervalos, booleanos, nulos).

  • As UDFs SQL, Python e Scala têm suporte como funções de filtro de linha ou máscara de coluna, desde que sejam registrados no Catálogo do Unity. As UDFs do Python e do Scala precisam ser encapsuladas em uma UDF do SQL.

  • Você pode criar exibições em tabelas que fazem referência a máscaras de coluna ou filtros de linha, mas não pode adicionar máscaras de coluna ou filtros de linha a uma exibição.

  • Os feeds de dados de alteração do Delta Lake têm suporte desde que o esquema seja compatível com os filtros de linha e máscaras de coluna que podem se aplicar à tabela de destino.

  • Há suporte para tabelas estrangeiras.

  • Há suporte para amostragem de tabela.

  • Há suporte para instruções MERGE quando tabelas de origem, tabelas de destino ou ambos usam filtros de linha e máscaras de coluna. Isso inclui tabelas com funções de filtro de linha que contêm subconsultas simples, mas há limitações listadas na seção a seguir.

  • As exibições materializadas do SQL do Databricks e as tabelas de streaming do SQL do Databricks dão suporte a filtros de linha e máscaras de coluna (Visualização Pública):

    • Você pode adicionar filtros de linha e máscaras de coluna a uma exibição materializada ou tabela de fluxo do Databricks SQL. Isso deve ser feito declarativamente quando a exibição materializada ou a tabela de streaming é definida. Consulte CREATE MATERIALIZED VIEW ou CREATE STREAMING TABLE.
    • Você pode definir exibições materializadas do SQL do Databricks ou tabelas de streaming em tabelas que incluem filtros de linha e máscaras de coluna.
  • Exibições materializadas e tabelas de streaming declaradas e publicadas no Delta Live Tables dão suporte a filtros de linha ou máscaras de coluna (Visualização Pública):

    • Você pode adicionar filtros de linha e máscaras de coluna a uma exibição materializada ou tabela de streaming do Delta Live Tables.
    • Você pode definir exibições materializadas ou tabelas de fluxo contínuo do Delta Live Tables em tabelas que incluem filtros de linha e máscaras de coluna.

    Confira Publicar tabelas com filtros de linha e máscaras de coluna.

Considerações sobre desempenho

Filtros de linha e máscaras de coluna garantem a visibilidade dos seus dados, assegurando que nenhum usuário possa visualizar o conteúdo dos valores das tabelas base antes das operações de filtragem e mascaramento. Eles foram projetados para ter um bom desempenho em resposta a consultas nos casos de uso mais comuns. Em aplicativos menos frequentes, em que o mecanismo de consulta deve escolher entre otimizar o desempenho da consulta e proteger contra vazamento de informações dos valores filtrados/mascarados, ele sempre tomará a decisão segura, mesmo que isso impacte o desempenho da consulta. Para minimizar esse impacto no desempenho, aplique os seguintes princípios:

  • Use funções de política simples: As funções de política com menos expressões geralmente terão melhor desempenho do que as expressões mais complexas. Evite usar tabelas de mapeamento e subconsultas de expressão em favor de funções CASE simples.
  • Reduza o número de argumentos de função: O Azure Databricks não pode otimizar referências de coluna à tabela de origem resultantes de argumentos de função de política, mesmo que essas colunas não sejam usadas de outra forma na consulta. Use funções de política com menos argumentos, pois as consultas dessas tabelas geralmente terão um melhor desempenho.
  • Evite adicionar filtros de linha com muitos AND: Como cada tabela dá suporte apenas à adição de no máximo um filtro de linha, uma abordagem comum é combinar várias funções de política desejadas com AND. No entanto, para cada conjunto, aumentam as chances de que o(s) conjunto(s) inclua(m) componentes mencionados em outra parte desta tabela que possam afetar o desempenho (como o uso de tabelas de mapeamento). Use menos conjuntos para melhorar o desempenho.
  • Use expressões determinísticas que não possam gerar erros em políticas de tabela e consultas dessas tabelas: Algumas expressões podem gerar erros se as entradas fornecidas forem inválidas, como a divisão ANSI. Nesses casos, o compilador SQL não deve empurrar operações com essas expressões (como filtros) muito para baixo no plano de consulta, para evitar a possibilidade de erros como "divisão por zero" que revelem informações sobre valores antes da filtragem e/ou mascaramento. Use expressões que sejam determinísticas e nunca gerem erros, como try_divide neste exemplo.
  • Execute consultas de teste na sua tabela para avaliar o desempenho: Construa consultas realistas que representem a carga de trabalho esperada para sua tabela com filtros de linha e/ou máscaras de coluna e meça o desempenho. Faça pequenas modificações nas funções de política e observe seus efeitos até chegar a um bom equilíbrio entre desempenho e expressividade da lógica de filtragem e mascaramento.

Limitações

  • As versões do Databricks Runtime abaixo da 12.2 LTS não dão suporte a filtros de linha ou máscaras de coluna. Esses runtimes falham com segurança, ou seja, se você tentar acessar tabelas de versões sem suporte desses runtimes, nenhum dado será retornado.
  • O Compartilhamento Delta não funciona com máscaras de coluna ou segurança em nível de linha.
  • Não é possível aplicar segurança em nível de linha ou máscaras de coluna a uma exibição.
  • A viagem no tempo não funciona com máscaras de coluna ou segurança em nível de linha.
  • No momento, não há suporte para o acesso baseado em caminho a arquivos em tabelas com políticas.
  • Não há suporte para políticas de filtro de linha ou máscara de coluna com dependências circulares de volta às políticas originais.
  • Não há suporte para clones profundos nem superficiais.
  • As instruções MERGE não dão suporte a tabelas com políticas de filtro de linha que contêm aninhamento, agregações, janelas, limites ou funções não determinísticas.
  • Não há suporte para APIs do Delta Lake.

Limitação de computação de usuário único

Você não pode acessar uma tabela que tenha filtros de linha ou máscaras de coluna de um único recurso de computação de usuário no Databricks Runtime 15.3 ou inferior. Você pode usar o modo de acesso de usuário único no Databricks Runtime 15.4 LTS ou superior, se o workspace estiver habilitado para computação sem servidor. Para obter mais informações, consulte Controle de acesso refinado na computação de usuário único.