Mascarar colunas PII por tipo com introspecção de tag
Este tutorial mostra como usar o valor de uma tag de coluna governada para escolher uma regra de mascaramento para informações de identificação pessoal (PII). Uma única política de máscara de coluna baseada em atributos (ABAC) cobre todas as colunas marcadas como endereço de email ou número de telefone, e uma função definida pelo usuário (UDF) SQL aplica a máscara apropriada a cada coluna. A política usa a função de introspecção de tags get_column_tag_value() para passar o valor da tag de cada coluna para o UDF.
Para a sintaxe e o comportamento das funções de introspecção de tags, consulte Funções de introspecção de tags.
Pré-requisitos
- Um SQL Warehouse, compute Serverless ou Databricks Runtime 18 LTS e acima para criar a política. Para query a tabela protegida, use qualquer compute que atenda aos requisitos de compute ABAC.
- O privilégio
CREATEpara tags governadas no nível da account. Os administradores de account e administradores de Workspace têm esse privilégio por default. - O privilégio
ASSIGNna tag governada que você cria. Os administradores de account têm esse privilégio por default. Consulte Gerenciar permissões em tags controladas. - O privilégio
APPLY TAGna tabelacontactspara definir tags de coluna no o passo 3. MANAGEpermissão no catálogo ou esquema de destino.EXECUTEno UDF.
Cenário
Sua organização classifica colunas de PII com a tag governada pii_type, cujo valor identifica o tipo de dados, como email ou phone. Cada tipo precisa de uma máscara diferente: oculte a parte local de um endereço de email, mas mantenha os últimos quatro dígitos de um número de telefone.
Com a introspecção de tags, uma política protege todas as colunas marcadas com pii_type, enquanto aplica uma máscara diferente para cada tipo de PII.
A política corresponde a todas as colunas com a tag pii_type e passa o valor da tag de cada coluna para o UDF. O UDF usa esse valor para selecionar a máscara apropriada.
Você pode reutilizar uma política em diferentes tipos de PII em vez de criar uma política separada para cada um.
Se você precisa ou não de introspecção de tags depende se o valor da tag determina como o UDF mascara os dados:
Quando | Padrão |
|---|---|
O UDF aplica máscaras diferentes com base no valor da tag |
|
O UDF aplica a mesma máscara a todas as colunas correspondentes | Uma condição |
O passo 1: Criar uma tag governada
Para criar uma tag governada com valores permitidos para os dois tipos de PII, execução:
CREATE GOVERNED TAG pii_type
DESCRIPTION 'PII type used by the ABAC tag introspection tutorial'
VALUES ('email', 'phone');
As key de tag governadas são exclusivas dentro da account. Se uma tag governada chamada pii_type já existir, o comando retornará um erro ALREADY_EXISTS. Escolha uma key diferente e use-a durante o tutorial. Para a sintaxe completa, consulte CREATE GOVERNED TAG.
Os dados de tags são armazenados como texto sem formatação e podem ser replicados globalmente. Não use nomes, valores ou descritores de tags que possam comprometer a segurança dos seus recursos. Por exemplo, não use nomes, valores ou descritores de tags que contenham informações pessoais ou confidenciais.
o passo 2: Construir dados de exemplo
Crie um catálogo, um esquema e uma tabela contacts com uma coluna de email e uma coluna de telefone:
CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;
CREATE SCHEMA IF NOT EXISTS introspection_demo;
USE SCHEMA introspection_demo;
CREATE OR REPLACE TABLE contacts (
contact_id INT,
email STRING,
phone STRING
);
INSERT INTO contacts VALUES
(1, 'alex@example.com', '123-456-7890'),
(2, 'sam@example.com', '234-567-8901');
O passo 3: Aplicar a tag governada
Marcar as duas colunas com valores diferentes da mesma key de tag:
ALTER TABLE contacts
ALTER COLUMN email SET TAGS ('pii_type' = 'email');
ALTER TABLE contacts
ALTER COLUMN phone SET TAGS ('pii_type' = 'phone');
Ambas as colunas agora compartilham a key de tags pii_type. O valor da tag diz ao UDF qual máscara aplicar.
O passo 4: Criar o UDF de mascaramento
Criar um UDF SQL que usa o valor da coluna e seu tipo de PII:
CREATE OR REPLACE FUNCTION abac_tutorial.introspection_demo.mask_pii_by_type(
col_value STRING,
pii_type STRING
)
RETURNS STRING
RETURN CASE
WHEN col_value IS NULL THEN NULL
WHEN pii_type = 'email' THEN regexp_replace(col_value, '(^[^@]+)', '***')
WHEN pii_type = 'phone' THEN concat('***-***-', right(col_value, 4))
ELSE '***'
END;
A branch ELSE mascara totalmente o valor se o UDF receber um tipo PII que não reconhece ou nenhum tipo.
O passo 5: Criar a política de máscara de coluna
Crie uma política que se aplique a cada coluna no esquema com a tag pii_type:
CREATE POLICY mask_pii_columns
ON SCHEMA abac_tutorial.introspection_demo
COLUMN MASK abac_tutorial.introspection_demo.mask_pii_by_type
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag('pii_type') AS pii_col
ON COLUMN pii_col
USING COLUMNS (get_column_tag_value(pii_col, 'pii_type'));
Nesta política:
has_tag('pii_type')corresponde a todas as colunas que têm a tag, seja qual for seu valor.ON COLUMN pii_colpassa os dados da coluna correspondente como o primeiro argumento do UDF.USING COLUMNS (get_column_tag_value(pii_col, 'pii_type'))passa o valor da tag da coluna,emailouphone, como o segundo argumento.
O passo 6: Verificar os resultados
Como a política se aplica a account users, ela também se aplica a você. Para verificar os valores mascarados, execução:
SELECT * FROM abac_tutorial.introspection_demo.contacts;
A query retorna:
contact_id email phone
1 ***@example.com ***-***-7890
2 ***@example.com ***-***-8901
As colunas de email e telefone são mascaradas de forma diferente, mas a mesma política protege ambas.
Por que esse padrão funciona
A política corresponde a colunas com base na key de tag, independentemente de o valor ser email ou phone. O UDF recebe o valor da tag e aplica a máscara correspondente.
Para dar suporte a outro tipo de PII, como ssn:
- Adicione
ssnaos valores permitidos da tag governada. - Adicione uma branch
ssnao UDF. - Marque as novas colunas.
A política não muda.
Esse padrão consolida políticas que diferem apenas em como mascaram dados. Se tipos diferentes de PII precisarem de TO ou EXCEPT principais diferentes, você ainda precisará de políticas separadas. Consulte Implementar mascaramento de coluna multidomínio com camadas de sensibilidade para ver um exemplo.
Para introspecção de tag de tabela com get_tag_value(), consulte Funções de introspecção de tag.
Limpar
Para remover os objetos criados neste tutorial, execução:
DROP POLICY mask_pii_columns ON SCHEMA abac_tutorial.introspection_demo;
DROP FUNCTION IF EXISTS abac_tutorial.introspection_demo.mask_pii_by_type;
DROP TABLE IF EXISTS abac_tutorial.introspection_demo.contacts;
DROP SCHEMA IF EXISTS abac_tutorial.introspection_demo CASCADE;
Outros tutoriais de ABAC também usam o catálogo abac_tutorial, então esta limpeza o mantém no lugar. Para removê-lo, execução DROP CATALOG IF EXISTS abac_tutorial CASCADE.
Para remover a tag governada, solte a política primeiro e depois execução:
DROP GOVERNED TAG pii_type;