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 usando a IU do Explorador de Catálogos. Consulte Criar e gerenciar políticas de filtro de linha e máscara de coluna 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

***-**-****

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.