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:
- Criar tags controladas
- Crie um catálogo Unity Catalog , um esquema e uma tabela.
- Aplicar tags regulamentadas às colunas
- Crie uma UDF para detectar endereços da UE.
- Criar uma política de filtro de linha
- Teste o filtro de linha
- Crie uma UDF para mascarar números de segurança social.
- Criar uma política de máscara de coluna
- 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).
MANAGEpermissão no catálogo ou esquema de destino.EXECUTEnas 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
piicom três valores permitidos:ssn,addresseemail - 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.
- No seu workspace Databricks , clique em
Catálogo .
- Clique no
Botão Governar .
- No menu dropdown , clique em Etiquetas regulamentadas .
- Clique em Criar taggovernada .
- Para a key tag , insira
pii. - Insira uma descrição para a tag em questão.
- Para valores permitidos, insira:
ssn,addresseemail. Somente esses valores podem ser atribuídos a essa key tag . - Clique em Criar .
- Repita os passos 4–8 para criar uma segunda tag governada com a key
consent. Deixe os valores permitidos em branco ( tag somente key ).
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:
-- 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;
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
);
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.
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:
FALSEse o endereço contiverEU,E.U.ouEurope— a linha ficará oculta.TRUECaso contrário, a linha é exibida.
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
);
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.
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.
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.
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.
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.
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 correspondenteconsent: o valor da colunahas_consentna mesma linha
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.
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.
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.
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 | número_ssn | |
|---|---|---|---|
John | True | ***-**-**** | |
Jane | False | ***-**-**** | |
Alice | True | ***-**-**** | |
Prumo | False | ***-**-**** | |
Charlie | True | ***-**-**** | |
Emily | False | ***-**-**** | |
Frank | True | ***-**-**** | |
Graça | True | ***-**-**** | |
Hank | False | ***-**-**** | |
Hera | True | ***-**-**** |
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.
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.