Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Esta página descreve padrões comuns para implementar políticas de filtro de linha ABAC e máscara de coluna. Para obter conceitos gerais, consulte os conceitos principais do ABAC (controle de acesso baseado em atributo). Para obter a sintaxe da política, consulte Criar e gerenciar políticas ABAC.
Funções de mascaramento compatíveis com casting
Azure Databricks converte automaticamente a saída da função de mascaramento para corresponder ao tipo de dados da coluna de destino. Consulte conversão automática de tipo para máscaras de coluna.
Os padrões a seguir ajudam você a criar funções de mascaramento compatíveis com casting.
Retornar um tipo convertível
Ao mascarar uma coluna, retorne o mesmo tipo de dados ou um tipo que pode ser convertido nela. Verifique os tipos de dados das colunas visadas pela política e assegure-se de que cada ramificação da função retorna um valor compatível.
-- Succeeds: Masks a DOUBLE column, returns DOUBLE in every branch
CREATE FUNCTION mask_salary(salary DOUBLE, user_role STRING)
RETURNS DOUBLE
RETURN CASE
WHEN user_role IN ('admin', 'hr') THEN salary
WHEN user_role = 'manager' THEN ROUND(salary / 1000) * 1000
ELSE 0.0
END;
-- Fails: 'CONFIDENTIAL' cannot be cast to a DOUBLE column type
CREATE FUNCTION mask_salary_as_text(salary DOUBLE, user_role STRING)
RETURNS STRING
RETURN CASE
WHEN user_role IN ('admin', 'hr') THEN CAST(salary AS STRING)
ELSE 'CONFIDENTIAL'
END;
Evitar estouro numérico
Quando uma função de máscara aceita e retorna um tipo numérico mais amplo do que a coluna de destino, o resultado é convertido automaticamente para o tipo da coluna. Se o valor retornado exceder o intervalo do tipo mais restrito, a conversão resultará em estouro e a consulta falhará em tempo de execução.
-- The target column is TINYINT (max 127). The input is upcast to BIGINT
-- for the function. Adding 1000 produces a BIGINT result that overflows
-- when cast back to TINYINT.
CREATE FUNCTION mask_score(score BIGINT)
RETURNS BIGINT
RETURN score + 1000;
Usar VARIANT para vários tipos de coluna
Consulte funções de mascaramento baseadas em VARIANT para vários tipos de coluna.
Compatibilidade de conjunto de testes
Teste funções de mascaramento com diferentes padrões de dados.
SELECT CAST(mask_salary(salary, 'admin') AS DOUBLE) FROM employees;
SELECT CAST(mask_salary(salary, 'manager') AS DOUBLE) FROM employees;
SELECT CAST(mask_salary(salary, 'viewer') AS DOUBLE) FROM employees;
Funções de mascaramento baseadas em VARIANT para vários tipos de coluna
Quando você precisa mascarar colunas de diferentes tipos de dados (por exemplo, INT, DOUBLE, DECIMAL(10,2), DECIMAL(15,5), e assim por diante), você pode escrever uma única UDF de máscara que aceita e retorna um tipo VARIANT. Azure Databricks converte automaticamente a saída da função de máscara de coluna para corresponder ao tipo de dados da coluna de destino seguindo os padrões da SQL ANSI.
Essa abordagem reduz o número de UDFs e políticas necessárias. Em vez de escrever funções de mascaramento separadas para cada tipo de coluna, uma função manipula todos os tipos.
Mascarar vários tipos numéricos com uma única função
Em vez de criar uma função de máscara separada para cada precisão numérica, você pode usar VARIANT para lidar com todas elas com uma única função:
CREATE FUNCTION mask_numeric(val VARIANT)
RETURNS VARIANT
DETERMINISTIC
RETURN 0::VARIANT;
Essa função retorna 0 como um VARIANT, que o Azure Databricks converte automaticamente para o tipo da coluna de destino. Uma única política ABAC usando essa função pode mascarar INT, DOUBLEe DECIMAL colunas sem exigir funções separadas para cada precisão.
Se preferir preservar o tipo explicitamente dentro da função, você poderá ramificar no tipo e retornar um valor mascarado apropriado para cada um usando schema_of_variant():
-- Use VARIANT to accommodate different data types
CREATE FUNCTION flexible_mask(data VARIANT)
RETURNS VARIANT
RETURN CASE
WHEN schema_of_variant(data) = 'INT' THEN 0::VARIANT
WHEN schema_of_variant(data) = 'DATE' THEN DATE'1970-01-01'::VARIANT
WHEN schema_of_variant(data) = 'DOUBLE' THEN 0.00::VARIANT
ELSE NULL::VARIANT
END;
Mascarar colunas de estrutura com VARIANT
Para o Databricks Runtime 18.1 e superior, você também pode mascarar colunas de struct convertendo-as em VARIANT dentro de uma política ABAC. Ramificar na forma do struct para redigir seletivamente os campos:
Observação
A conversão de structs para VARIANT durante o mascaramento tem suporte apenas nas políticas de máscara de coluna ABAC.
O exemplo a seguir usa schema_of_variant() para identificar duas formas de struct diferentes e redigir campos confidenciais em cada uma:
CREATE FUNCTION flexible_mask(data VARIANT)
RETURNS VARIANT
RETURN CASE
WHEN schema_of_variant(data) = 'OBJECT<age: BIGINT, email: STRING>' THEN
to_variant_object(named_struct('age', data:age, 'email', 'redacted'))
WHEN schema_of_variant(data) = 'OBJECT<id: BIGINT, ssn: STRING>' THEN
to_variant_object(named_struct('id', data:id, 'ssn', 'xxx-xx-xxxx'))
ELSE NULL::VARIANT
END;
Impedir o acesso até que colunas confidenciais sejam marcadas
Um padrão de governança comum é controlar o acesso com base em se os dados foram classificados. Você pode implementá-lo com uma marca restritiva padrão e políticas que impõem diferentes níveis de proteção, dependendo do status de classificação.
- Aplique uma marca como
classification : unverifieda todos os novos objetos por padrão, por meio da automação ou por meio da herança da marca aplicando a marca no nível de catálogo ou esquema, de modo que quaisquer novas tabelas adicionadas ao catálogo ou esquema herdem automaticamente a marca. - Crie uma política de filtro de linha que bloqueia o acesso a tabelas marcadas
classification : unverified. - Crie uma política de máscara para coluna que oculte colunas confidenciais em tabelas onde a tag
classification : unverifiednão está mais presente. - Quando um administrador de dados conclui a classificação, ele atualiza a etiqueta. A política de bloqueio não corresponde mais e a política de mascaramento entra em vigor.
-- Block access to unverified tables for all non-admin users
CREATE FUNCTION catalog.schema.block_all() RETURNS BOOLEAN
RETURN FALSE;
CREATE POLICY block_unverified
ON CATALOG my_catalog
ROW FILTER catalog.schema.block_all
TO `account users` EXCEPT `data_admins`
FOR TABLES
WHEN has_tag_value('classification', 'unverified');
Para proteger dados confidenciais depois de classificados, defina uma política de máscara de coluna que se aplica quando a marca classification : unverified não estiver mais presente:
CREATE FUNCTION catalog.schema.mask_pii(val STRING)
RETURNS STRING
RETURN '***';
CREATE POLICY mask_reviewed_pii
ON CATALOG my_catalog
COLUMN MASK catalog.schema.mask_pii
TO `account users`
EXCEPT `data_admins`
FOR TABLES
WHEN NOT has_tag_value('classification', 'unverified')
MATCH COLUMNS (has_tag_value('pii', 'name') OR has_tag_value('pii', 'address')) AS m
ON COLUMN m;
Revelação parcial sem regex
Revele parte de um valor confidencial usando operações de cadeia de caracteres em vez de regex. O mascaramento baseado em Regex verifica todo o valor de cada linha, que é caro em campos de texto grandes (consulte Evitar máscara regex em campos de texto grandes).
CREATE FUNCTION mask_ssn(ssn STRING, show_last INT) RETURNS STRING
DETERMINISTIC
RETURN CONCAT('***-**-', RIGHT(ssn, show_last));
Hashing consistente (pseudonimização determinística)
O hash consistente (também chamado de pseudonimização determinística) substitui dados confidenciais por um valor hash que é o mesmo em várias tabelas. Marcar uma função informa DETERMINISTIC ao mecanismo que a função sempre retorna o mesmo resultado para a mesma entrada, o que a ajuda a otimizar a consulta. Consulte Usar expressões determinísticas e com segurança de erro.
A função a seguir faz um hash consistente de um valor de string e usa um parâmetro version para dar suporte à rotação de chaves. Incremente o version número mediante a cláusula de USING COLUMNS da política para gerar novos hashes sem quebrar dados históricos que usaram a versão anterior. A função concatena o valor original com o número de versão antes do hash, portanto, a mesma entrada com a mesma versão sempre produz o mesmo hash.
CREATE FUNCTION pseudonymize(val STRING, version INT) RETURNS STRING
DETERMINISTIC
RETURN SHA2(CONCAT(val, CAST(version AS STRING)), 256);
Filtragem de linhas com predicados exclusivamente de coluna
Filtrar linhas usando uma lógica booliana simples que referencia apenas colunas de tabela. Os predicados de apenas coluna permitem o processamento de predicado, o que possibilita que o mecanismo ignore dados irrelevantes durante as varreduras (consulte Entenda o processamento de predicado em tabelas protegidas).
CREATE FUNCTION filter_by_region(region STRING, allowed STRING)
RETURNS BOOLEAN
DETERMINISTIC
RETURN array_contains(split(allowed, ','), lower(region));
Use com uma política que passe as regiões permitidas como uma constante:
CREATE POLICY regional_access
ON CATALOG analytics
ROW FILTER filter_by_region
TO 'emea_team'
FOR TABLES
MATCH COLUMNS has_tag('region') AS rgn
USING COLUMNS (rgn, 'emea,apac');
Filtragem de linha em várias colunas relacionadas
Quando uma tabela tem várias colunas que representam atributos relacionados (por exemplo, ship_to_country e bill_to_country), você pode combiná-las com condições de marca separadas e passar ambas para uma única UDF. Isso evita a criação de políticas separadas para cada coluna. Uma política pode incluir até três expressões de coluna na cláusula MATCH COLUMNS (consulte cotas de política).
CREATE FUNCTION filter_by_countries(ship_country STRING, bill_country STRING, allowed STRING)
RETURNS BOOLEAN
DETERMINISTIC
RETURN array_contains(split(allowed, ','), lower(ship_country))
OR array_contains(split(allowed, ','), lower(bill_country));
CREATE POLICY regional_orders
ON SCHEMA prod.orders
ROW FILTER filter_by_countries
TO analysts
FOR TABLES
WHEN has_tag_value('sensitivity', 'high')
MATCH COLUMNS
has_tag('ship_country') AS ship,
has_tag('bill_country') AS bill
USING COLUMNS (ship, bill, 'us,ca,mx');
Um analista vê apenas pedidos em que o país de remessa ou cobrança está em sua lista autorizada.
Tabelas de pesquisa em UDFs de políticas ABAC
Quando as regras de acesso variam por usuário e não podem ser expressas apenas por meio das cláusulas da TO/EXCEPT política, você pode verificar os direitos de acesso em uma tabela de pesquisa pequena. Use TO/EXCEPT quando possível, pois é a abordagem preferencial para entidades principais de destino (consulte Abordagem para entidades principais de destino). Mantenha a tabela de pesquisa pequena para que o otimizador converta a subconsulta em uma junção de hash de transmissão (consulte Mantenha tabelas de pesquisa pequenas).
CREATE TABLE access_rules (
principal VARCHAR(255),
priority VARCHAR(64)
);
INSERT INTO access_rules VALUES
('alice@company.com', '1-URGENT'),
('alice@company.com', '2-HIGH'),
('bob@company.com', '1-URGENT');
CREATE FUNCTION priority_allowed(o_priority STRING) RETURNS BOOLEAN
RETURN EXISTS (
SELECT 1 FROM access_rules
WHERE principal = session_user() AND priority = o_priority
);
CREATE POLICY priority_filter
ON CATALOG operations
ROW FILTER priority_allowed
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag('priority') AS pri
USING COLUMNS (pri);