Pular para o conteúdo principal

Tutorial: Configurar ABAC com SQL

Este tutorial mostra como configurar políticas ABAC de filtro de linha e máscara de coluna no Unity Catalog usando SQL. Para a versão baseada na interface gráfica do Catalog Explorer, consulte o tutorial: Configurar ABAC.

Neste exemplo, uma equipe de análise não pode acessar os registros de clientes da UE e os números de segurança social (SSNs) são sempre mascarados. Os clientes que consentiram com o compartilhamento de dados têm seu email completo mostrado. Outros veem apenas uma versão mascarada.

Este tutorial inclui os seguintes passos:

  1. Criar tags controladas
  2. Crie um catálogo Unity Catalog , um esquema e uma tabela.
  3. Aplicar tags regulamentadas às colunas
  4. Crie uma UDF para detectar endereços da UE.
  5. Criar uma política de filtro de linha
  6. Teste o filtro de linha
  7. Crie uma UDF para mascarar números de segurança social.
  8. Criar uma política de máscara de coluna
  9. Teste a máscara da coluna

Após concluir esses passos, você pode opcionalmente estender o tutorial com mascaramento condicional email (passos 10 a 12).

Pré-requisitos

  • Databricks Runtime 16.4 ou superior, ou compute serverless .
  • Permissões de administrador da conta ou administrador workspace (para criar tags governadas).
  • MANAGE permissão no catálogo ou esquema de destino.
  • EXECUTE nas UDFs.

Computadores que executam versões antigas do ambiente de execução não podem acessar tabelas protegidas pelo ABAC.

o passo 1: Criar tagsgovernadas

tagsgovernadas são pares de key-valor definidos no nível account . As políticas ABAC usam esses dados para descobrir quais colunas filtrar ou mascarar. Neste tutorial, você criará duas tags governadas:

  • Uma tag pii com três valores permitidos: ssn, address e email
  • Uma key consent (sem valores permitidos) para identificar colunas de consentimento tag

Para criar uma tag governada, você precisa ter a permissão CRIAR tag governada no nível account . Os administradores de contas e workspace têm permissão para CRIAR por default.

  1. No seu workspace Databricks , clique em Ícone de dados. Catálogo .
  2. Clique no Ícone de escudo. Botão Governar .
  3. No menu dropdown , clique em Etiquetas regulamentadas .
  4. Clique em Criar taggovernada .
  5. Para a key tag , insira pii.
  6. Insira uma descrição para a tag em questão.
  7. Para valores permitidos, insira: ssn, address e email. Somente esses valores podem ser atribuídos a essa key tag .
  8. Clique em Criar .
  9. Repita os passos 4–8 para criar uma segunda tag governada com a key consent. Deixe os valores permitidos em branco ( tag somente key ).
atenção

Os dados das tags são armazenados como texto simples e podem ser replicados globalmente. Não utilize nomes tag , valores ou descritores que possam comprometer a segurança do seu recurso. Por exemplo, não utilize nomes tag , valores ou descritores que contenham informações pessoais ou sensíveis.

Passo 2: Crie a tabela de clientes

Crie um catálogo, um esquema e uma tabela com perfis de clientes. A coluna has_consent é usada posteriormente para mascaramento condicional email . Os clientes que deram consentimento (TRUE) têm seu email completo exibido.

execute o seguinte comando em um Notebook anexado para compute no Databricks Runtime 16.4 ou acima:

SQL
-- Create catalog (if not already exists)
CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;

-- Create schema
CREATE SCHEMA IF NOT EXISTS customers;
USE SCHEMA customers;
SQL
CREATE OR REPLACE TABLE profiles (
first_name STRING,
last_name STRING,
email STRING,
phone_number STRING,
home_address STRING,
ssn_number STRING,
has_consent BOOLEAN
);
SQL
INSERT INTO profiles (first_name, last_name, email, phone_number, home_address, ssn_number, has_consent)
VALUES
('John', 'Doe', 'john.doe@example.com', '123-456-7890', '123 Main St, NY', '123-45-6789', TRUE),
('Jane', 'Smith', 'jane.smith@example.com', '234-567-8901', '456 Oak St, CA', '234-56-7890', FALSE),
('Alice', 'Johnson', 'alice.j@example.com', '345-678-9012', '789 Pine St, TX', '345-67-8901', TRUE),
('Bob', 'Brown', 'bob.brown@example.com', '456-789-0123', '321 Maple St, FL', '456-78-9012', FALSE),
('Charlie', 'Davis', 'charlie.d@example.com', '567-890-1234', '654 Cedar St, IL', '567-89-0123', TRUE),
('Emily', 'White', 'emily.w@example.com', '678-901-2345', '987 Birch St, WA', '678-90-1234', FALSE),
('Frank', 'Miller', 'frank.m@example.com', '789-012-3456', '741 Spruce St, WA', '789-01-2345', TRUE),
('Grace', 'Wilson', 'grace.w@example.com', '890-123-4567', '852 Elm St, NV', '890-12-3456', TRUE),
('Hank', 'Moore', 'hank.moore@example.com', '901-234-5678', '963 Walnut St, CO', '901-23-4567', FALSE),
('Ivy', 'Taylor', 'ivy.taylor@example.com', '012-345-6789', '159 Aspen St, AZ', '012-34-5678', TRUE),
('Liam', 'Connor', 'liam.c@example.com', '111-222-3333', '12 Abbey Street, Dublin, Ireland EU', '111-22-3333', TRUE),
('Sophie', 'Dubois', 'sophie.d@example.com', '222-333-4444', '45 Rue de Rivoli, Paris, France Europe', '222-33-4444', FALSE),
('Hans', 'Müller', 'hans.m@example.com', '333-444-5555', '78 Berliner Str., Berlin, Germany E.U.', '333-44-5555', TRUE),
('Elena', 'Rossi', 'elena.r@example.com', '444-555-6666', '23 Via Roma, Milan, Italy Europe', '444-55-6666', FALSE),
('Johan', 'Andersson', 'johan.a@example.com', '555-666-7777', '56 Drottninggatan, Stockholm, Sweden EU', '555-66-7777', TRUE);

o passo 3: Adicionar tags regulamentadas às colunas

Marque as colunas ssn_number, home_address e email com a tag governada pii . As políticas ABAC correspondem às colunas por tag, não por nome.

A coluna has_consent contém as tags com a tag regida por consent . Isso é necessário para a política de mascaramento com reconhecimento de consentimento em o passo 11, que passa has_consent para a UDF via USING COLUMNS.

SQL
ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN ssn_number
SET TAGS ('pii' = 'ssn');

ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN home_address
SET TAGS ('pii' = 'address');

ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN email
SET TAGS ('pii' = 'email');

ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN has_consent
SET TAGS ('consent' = '');

o passo 4: Crie uma UDF para detectar endereços da UE

Esta UDF recebe o valor de cada tag de coluna pii = address e retorna:

  • FALSE se o endereço contiver EU, E.U. ou Europe — a linha ficará oculta.
  • TRUE Caso contrário, a linha é exibida.
SQL
CREATE OR REPLACE FUNCTION is_not_eu_address(address STRING)
RETURNS BOOLEAN
RETURN (
SELECT CASE
WHEN LOWER(address) LIKE '%eu%'
OR LOWER(address) LIKE '%e.u.%'
OR LOWER(address) LIKE '%europe%'
THEN FALSE
ELSE TRUE
END
);
nota

Esta é uma verificação simplificada para fins de demonstração. Em produção, utilize um método mais robusto, como uma coluna de código de país ou uma tabela de consulta para determinar a região.

o passo 5: Criar uma política de filtro de linha

Para criar uma política, você deve ter MANAGE no objeto ou a propriedade do objeto. Para adicionar uma UDF a uma política, você deve ter EXECUTE na UDF.

SQL
CREATE POLICY hide_eu_customers
ON SCHEMA abac_tutorial.customers
ROW FILTER is_not_eu_address
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'address') AS addr_col
USING COLUMNS (addr_col);

Você também pode criar políticas através da interface do usuário do Explorador de Catálogo. Consulte Criar e gerenciar políticas ABAC para obter detalhes.

o passo 6: Teste o filtro de linha

Execute a seguinte consulta para verificar se a política de filtro de linhas está funcionando.

SQL
SELECT * FROM abac_tutorial.customers.profiles;

Apenas as 10 linhas referentes a residentes fora da UE são retornadas. Os cinco clientes da UE (Liam, Sophie, Hans, Elena e Johan) estão ocultos.

o passo 7: Crie uma UDF para mascarar os números de segurança social

Esta UDF retorna um marcador de posição totalmente ocultado para qualquer valor de SSN que lhe for passado.

SQL
CREATE OR REPLACE FUNCTION redact_ssn(ssn STRING)
RETURNS STRING
RETURN '***-**-****';

o passo 8: Criar uma política de máscara de coluna

Crie uma política que tenha como alvo todas as colunas com a tag pii = ssn e aplique a função redact_ssn a cada uma delas.

SQL
CREATE POLICY redact_ssn_policy
ON SCHEMA abac_tutorial.customers
COLUMN MASK redact_ssn
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn_col
ON COLUMN ssn_col;

o passo 9: Teste a máscara da coluna

Execute a seguinte consulta para verificar se o filtro de linha e a máscara de coluna estão ativos.

SQL
SELECT * FROM abac_tutorial.customers.profiles;

Os números de segurança social agora retornam como ***-**-****. Somente residentes de fora da UE são exibidos, pois o filtro de linhas também está ativo.

Ampliar: Mascaramento condicional email

Os passos a seguir ampliam o tutorial com o mascaramento email com consentimento informado. Os clientes que optaram por participar (has_consent = TRUE) têm o seu email completo exibido; outros veem apenas o primeiro caractere e o domínio.

Passo 10: Criar uma UDFde mascaramento email com consentimento.

Esta UDF recebe dois argumentos:

  • email: o valor real email da coluna correspondente
  • consent: o valor da coluna has_consent na mesma linha
SQL
CREATE OR REPLACE FUNCTION mask_email_by_consent(email STRING, consent BOOLEAN)
RETURNS STRING
RETURN CASE
WHEN consent = TRUE THEN email
ELSE CONCAT(LEFT(email, 1), '***@', SUBSTRING_INDEX(email, '@', -1))
END;

Passo 11: Criar a política de mascaramento condicional email

Esta política coluna de destino marca pii = email e passa a coluna has_consent para a UDF.

nota

A coluna has_consent era marcada com a tag governada consent no passo 3. Isso é necessário porque USING COLUMNS só pode referenciar colunas que correspondem por meio de MATCH COLUMNS. Embora has_consent não esteja sendo mascarado, ele deve ser uma tag para que a política possa passar seu valor para a UDF.

SQL
CREATE POLICY mask_email_by_consent_policy
ON SCHEMA abac_tutorial.customers
COLUMN MASK mask_email_by_consent
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'email') AS email_col,
has_tag('consent') AS consent_col
ON COLUMN email_col
USING COLUMNS (consent_col);

o passo 12: Testar mascaramento condicional email

Execute a seguinte consulta para verificar se todas as três políticas estão funcionando em conjunto.

SQL
SELECT * FROM abac_tutorial.customers.profiles;

Os clientes com has_consent = TRUE têm seu email completo exibido. Clientes com has_consent = FALSE veem uma versão mascarada. Os números de segurança social permanecem totalmente mascarados e apenas os clientes não pertencentes à UE são contactados.

primeiro nome

tem_consentimento

email

número_ssn

John

True

john.doe@example.com

***-**-****

Jane

False

j***@exemplo.com

***-**-****

Alice

True

alice.j@example.com

***-**-****

Prumo

False

b***@exemplo.com

***-**-****

Charlie

True

charlie.d@example.com

***-**-****

Emily

False

e***@exemplo.com

***-**-****

Frank

True

frank.m@exemplo.com

***-**-****

Graça

True

grace.w@example.com

***-**-****

Hank

False

h***@example.com

***-**-****

Hera

True

ivy.taylor@example.com

***-**-****

Resumo

Este tutorial demonstrou três padrões ABAC:

  • Filtragem de linhas : oculte linhas com base em valores de coluna que correspondam às tags definidas.
  • Mascaramento de colunas : mascarar colunas correspondentes às tags definidas.
  • Mascaramento condicional : mascara uma coluna com base no valor de outra coluna na mesma linha, marcando a coluna de contexto e passando-a para a UDF Função Definida pelo Usuário) por meio de USING COLUMNS

Limpar

Para remover todos os objetos criados neste tutorial, execute o seguinte comando. Se você pulou os passos de mascaramento condicional email , as declarações DROP POLICY mask_email_by_consent_policy e DROP FUNCTION mask_email_by_consent falharão, o que é esperado.

SQL
DROP POLICY hide_eu_customers ON SCHEMA abac_tutorial.customers;
DROP POLICY redact_ssn_policy ON SCHEMA abac_tutorial.customers;
DROP POLICY mask_email_by_consent_policy ON SCHEMA abac_tutorial.customers;
DROP FUNCTION IF EXISTS abac_tutorial.customers.is_not_eu_address;
DROP FUNCTION IF EXISTS abac_tutorial.customers.redact_ssn;
DROP FUNCTION IF EXISTS abac_tutorial.customers.mask_email_by_consent;
DROP TABLE IF EXISTS abac_tutorial.customers.profiles;
DROP SCHEMA IF EXISTS abac_tutorial.customers CASCADE;

Para remover as tags controladas por pii e consent , use a interface do usuário do Explorador de Catálogo.