Pular para o conteúdo principal

Implementar mascaramento de colunas em múltiplos domínios com níveis de sensibilidade.

Este tutorial mostra como implementar mascaramento de colunas com reconhecimento de domínio e níveis de sensibilidade, combinado com filtragem de linhas baseada em região. Você usa condições AND em MATCH COLUMNS para coluna de destino por domínio e nível de sensibilidade, e cláusulas EXCEPT para isentar o grupo proprietário de cada domínio da política de máscara correspondente.

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.
  • Grupos de contas: hr_team, finance_team, marketing_team, us_team, eu_team.

Para criar os grupos necessários, acesse Configurações do espaço de trabalho > Identidade e acesso > Grupos , clique em Adicionar grupo e crie cada um deles. Adicione-se pelo menos a hr_team e us_team para seguir a perspectiva de RH + EUA na etapa 7.

Cenário​

Sua organização mantém uma tabela central employee_records compartilhada entre RH, Finanças e marketing. Cada equipe é proprietária de determinadas colunas e deve visualizar seus próprios dados sem máscara, mas não deve visualizar os dados confidenciais de outras equipes.

O tutorial usa uma tag governada chamada domain para representar qual equipe é proprietária de cada coluna. O nome é arbitrário. Você também pode usar team, department ou business_unit. A ideia key é que cada coluna é atribuída a exatamente um grupo proprietário, e uma segunda tag sensitivity controla o quão agressivamente os dados são mascarados para usuários fora desse grupo.

Coluna

domain Etiqueta

sensitivity Etiqueta

Grupo autorizado

employee_name

hr

internal

hr_team

ssn

hr

confidential

hr_team

email

marketing

internal

marketing_team

customer_list

marketing

confidential

marketing_team

cost_center

finance

internal

finance_team

salary_band

finance

confidential

finance_team

Coluna

domain Etiqueta

sensitivity Etiqueta

Grupo autorizado

employee_name

hr

internal

hr_team

ssn

hr

confidential

hr_team

email

marketing

internal

marketing_team

customer_list

marketing

confidential

marketing_team

cost_center

finance

internal

finance_team

salary_band

finance

confidential

finance_team

O comportamento de mascaramento depende do nível de sensibilidade:

  • Interno : usuários fora do grupo proprietário veem uma máscara parcial (primeiro caractere + ***).
  • Confidencial : usuários fora do grupo proprietário veem ***REDACTED***.

Usuários em múltiplos grupos de domínio visualizam todas as colunas de seus domínios sem máscara.

o passo 1: Criar tagsgovernadas​

Crie as seguintes tags controladas na interface do usuário do Explorador de Catálogo ( Catálogo > Controle > Etiquetas controladas > Criar tagcontrolada ):

keyde etiqueta

Valores permitidos

region

( tag somente key )

domain

hr, finance, marketing

sensitivity

internal, confidential

keyde etiqueta

Valores permitidos

region

( tag somente key )

domain

hr, finance, marketing

sensitivity

internal, confidential

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.

o passo 2: Criar dados de exemplo​

Crie uma única tabela employee_records compartilhada entre RH, Finanças e Marketing. Cada coluna sensível será marcada com um nível domain e um nível sensitivity no próximo passo.

SQL
CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;

CREATE SCHEMA IF NOT EXISTS domain_demo;
USE SCHEMA domain_demo;
SQL
CREATE OR REPLACE TABLE employee_records (
id INT,
employee_name STRING,
ssn STRING,
email STRING,
customer_list STRING,
cost_center STRING,
salary_band STRING,
emp_region STRING,
department STRING
);

INSERT INTO employee_records VALUES
(1, 'Alice Johnson', '123-45-6789', 'alice@acme.com', 'Tier-1 Enterprise', 'CC-4010', 'Band 7', 'us', 'Engineering'),
(2, 'Bob Smith', '234-56-7890', 'bob@acme.com', 'SMB Accounts', 'CC-3020', 'Band 5', 'us', 'Sales'),
(3, 'Carol White', '345-67-8901', 'carol@acme.com', 'Tier-1 Enterprise', 'CC-5010', 'Band 8', 'eu', 'Engineering'),
(4, 'David Lee', '456-78-9012', 'david@acme.com', 'Growth Segment', 'CC-2010', 'Band 4', 'eu', 'Marketing'),
(5, 'Eva Martinez', '567-89-0123', 'eva@acme.com', 'Mid-Market', 'CC-4020', 'Band 6', 'us', 'HR');

o passo 3: Aplicar tagsregulamentadas​

Marque cada coluna sensível com seus valores domain e sensitivity . Essas duas tags juntas permitem que cada política vise uma combinação específica de domínio e sensibilidade usando condições AND em MATCH COLUMNS. A coluna emp_region recebe uma tag region somente keyporque a política só precisa identificar a coluna em vez de verificar um valor específico.

SQL
-- HR domain
ALTER TABLE employee_records
ALTER COLUMN employee_name SET TAGS ('domain' = 'hr', 'sensitivity' = 'internal');
ALTER TABLE employee_records
ALTER COLUMN ssn SET TAGS ('domain' = 'hr', 'sensitivity' = 'confidential');

-- Marketing domain
ALTER TABLE employee_records
ALTER COLUMN email SET TAGS ('domain' = 'marketing', 'sensitivity' = 'internal');
ALTER TABLE employee_records
ALTER COLUMN customer_list SET TAGS ('domain' = 'marketing', 'sensitivity' = 'confidential');

-- Finance domain
ALTER TABLE employee_records
ALTER COLUMN cost_center SET TAGS ('domain' = 'finance', 'sensitivity' = 'internal');
ALTER TABLE employee_records
ALTER COLUMN salary_band SET TAGS ('domain' = 'finance', 'sensitivity' = 'confidential');

-- Region tag for row filtering
ALTER TABLE employee_records
ALTER COLUMN emp_region SET TAGS ('region' = '');

o passo 4: Criar as UDFs​

A UDF de filtro de linha aceita o valor da região da linha e uma região permitida como argumento estático e retorna TRUE quando eles correspondem. Passar a região permitida como uma constante mantém a UDF simples e reutilizável. Cada política de filtro de linha tem como alvo um grupo específico e repassa a região que esse grupo está autorizado a visualizar.

SQL
CREATE OR REPLACE FUNCTION abac_tutorial.domain_demo.region_filter(region_val STRING, allowed_region STRING)
RETURNS BOOLEAN
RETURN region_val = allowed_region;

Crie uma UDF de máscara parcial para colunas internas e uma UDF de redação completa para colunas confidenciais.

SQL
CREATE OR REPLACE FUNCTION abac_tutorial.domain_demo.partial_mask(val STRING)
RETURNS STRING
RETURN CONCAT(LEFT(val, 1), '***');

CREATE OR REPLACE FUNCTION abac_tutorial.domain_demo.redact(val STRING)
RETURNS STRING
RETURN '***REDACTED***';

o passo 5: Criar as políticas de filtro de linha​

Crie uma política de filtro de linha por região. Cada política visa um grupo específico e passa a região permitida como uma constante através de USING COLUMNS.

SQL
CREATE POLICY region_filter_us
ON SCHEMA abac_tutorial.domain_demo
ROW FILTER abac_tutorial.domain_demo.region_filter
TO `us_team`
FOR TABLES
MATCH COLUMNS has_tag('region') AS region_col
USING COLUMNS (region_col, 'us');

CREATE POLICY region_filter_eu
ON SCHEMA abac_tutorial.domain_demo
ROW FILTER abac_tutorial.domain_demo.region_filter
TO `eu_team`
FOR TABLES
MATCH COLUMNS has_tag('region') AS region_col
USING COLUMNS (region_col, 'eu');
nota

Uma alternativa é incorporar a lógica do grupo dentro da UDF usando funções de identidade como is_account_group_member(). Essa abordagem utiliza uma política única sem valores estáticos, mas move o mapeamento de grupo para região para a UDF (Função Definida pelo Usuário). Use a opção que melhor se adequar à sua organização.

o passo 6: Criar as políticas de máscara de coluna de domínio​

Crie uma política para cada combinação de domínio e nível de sensibilidade. Cada política usa AND para corresponder colunas com um nível específico domain AND sensitivity e EXCEPT para isentar o grupo de domínio proprietário.

Domínio

interno (partial_mask)

confidencial (redact)

RH

mask_internal_hr

mask_confidential_hr

Finanças

mask_internal_finance

mask_confidential_finance

Marketing

mask_internal_marketing

mask_confidential_marketing

Domínio

interno (partial_mask)

confidencial (redact)

RH

mask_internal_hr

mask_confidential_hr

Finanças

mask_internal_finance

mask_confidential_finance

Marketing

mask_internal_marketing

mask_confidential_marketing

Como cada coluna tem exatamente um valor domain e um valor sensitivity , cada coluna corresponde a exatamente uma política por usuário. Não há conflitos.

Colunas internas (máscara parcial)​

Aplicar uma máscara parcial às colunas de nível interno para usuários fora do domínio proprietário.

SQL
CREATE POLICY mask_internal_hr
ON SCHEMA abac_tutorial.domain_demo
COLUMN MASK abac_tutorial.domain_demo.partial_mask
TO `account users` EXCEPT `hr_team`
FOR TABLES
MATCH COLUMNS (
has_tag_value('domain', 'hr')
AND has_tag_value('sensitivity', 'internal')
) AS m
ON COLUMN m;

CREATE POLICY mask_internal_finance
ON SCHEMA abac_tutorial.domain_demo
COLUMN MASK abac_tutorial.domain_demo.partial_mask
TO `account users` EXCEPT `finance_team`
FOR TABLES
MATCH COLUMNS (
has_tag_value('domain', 'finance')
AND has_tag_value('sensitivity', 'internal')
) AS m
ON COLUMN m;

CREATE POLICY mask_internal_marketing
ON SCHEMA abac_tutorial.domain_demo
COLUMN MASK abac_tutorial.domain_demo.partial_mask
TO `account users` EXCEPT `marketing_team`
FOR TABLES
MATCH COLUMNS (
has_tag_value('domain', 'marketing')
AND has_tag_value('sensitivity', 'internal')
) AS m
ON COLUMN m;

Colunas confidenciais (redação completa)​

Redija completamente as colunas de nível confidencial para usuários fora do domínio proprietário.

SQL
CREATE POLICY mask_confidential_hr
ON SCHEMA abac_tutorial.domain_demo
COLUMN MASK abac_tutorial.domain_demo.redact
TO `account users` EXCEPT `hr_team`
FOR TABLES
MATCH COLUMNS (
has_tag_value('domain', 'hr')
AND has_tag_value('sensitivity', 'confidential')
) AS m
ON COLUMN m;

CREATE POLICY mask_confidential_finance
ON SCHEMA abac_tutorial.domain_demo
COLUMN MASK abac_tutorial.domain_demo.redact
TO `account users` EXCEPT `finance_team`
FOR TABLES
MATCH COLUMNS (
has_tag_value('domain', 'finance')
AND has_tag_value('sensitivity', 'confidential')
) AS m
ON COLUMN m;

CREATE POLICY mask_confidential_marketing
ON SCHEMA abac_tutorial.domain_demo
COLUMN MASK abac_tutorial.domain_demo.redact
TO `account users` EXCEPT `marketing_team`
FOR TABLES
MATCH COLUMNS (
has_tag_value('domain', 'marketing')
AND has_tag_value('sensitivity', 'confidential')
) AS m
ON COLUMN m;

o passo 7: Verifique os resultados​

Todas as oito políticas (dois filtros de linhas e seis máscaras de colunas) já estão ativas. Execute a seguinte query e verifique se os resultados correspondem ao que os membros do seu grupo permitem.

SQL
SELECT * FROM abac_tutorial.domain_demo.employee_records;

Membro da equipe de RH na região dos EUA (hr_team + us_team):

| id | nome_do_funcionário | ssn | email | lista_de_clientes | centro_de_custo | faixa_salário | região_do_funcionário | departamento | | -- | -------------- | ----------- | ------ | -------------------- | ------------ | -------------------- | ----------- | ----------- | | 1 | Alice Johnson | 123-45-6789 | a*** | ***REDACTED*** | C*** | ***REDACTED*** | nós | engenharia | | 2 | Bob Smith | 234-56-7890 | b*** | ***REDACTED*** | C*** | ***REDACTED*** | nós | vendas | | 5 | Eva Martinez | 567-89-0123 | e*** | ***REDACTED*** | C*** | ***REDACTED*** | nós | RH |

As colunas HR (employee_name, ssn) são desmascaradas. O marketing interno (email) está parcialmente mascarado e o confidencial (customer_list) está redigido. As informações financeiras internas (cost_center) estão parcialmente mascaradas e as informações confidenciais (salary_band) estão redigidas.

Membro da equipe de finanças na região da UE (finance_team + eu_team):

| id | nome_do_funcionário | ssn | email | lista_de_clientes | centro_de_custo | faixa_salário | região_do_funcionário | departamento | | -- | -------------- | -------------------- | ------ | -------------------- | ------------ | ------------ | ----------- | ----------- | | 3 | C*** | ***REDACTED*** | c*** | ***REDACTED*** | CC-5010 | Banda 8 | eu | engenharia | | 4 | D*** | ***REDACTED*** | d*** | ***REDACTED*** | CC-2010 | Banda 4 | eu | marketing |

As colunas de finanças (cost_center, salary_band) são desmascaradas. Todas as outras colunas de domínio estão mascaradas ou ocultadas.

Usuário em hr_team + marketing_team + us_team:

| id | nome_do_funcionário | ssn | email | lista_de_clientes | centro_de_custo | faixa_salário | região_do_funcionário | departamento | | -- | -------------- | ----------- | ---------------------------------------- | ----------------- | ------------ | -------------------- | ----------- | ----------- | | 1 | Alice Johnson | 123-45-6789 | alice@acme.com | Empresa de Nível 1 | C*** | ***REDACTED*** | nós | engenharia |

As colunas de RH e marketing estão visíveis porque o usuário pertence a ambos os grupos. As colunas de finanças permanecem ocultas.

Por que esse padrão funciona​

Cada coluna tem exatamente um valor domain e um valor sensitivity , portanto, cada coluna corresponde a exatamente uma política por usuário. Não existem conflitos de política.

A cláusula EXCEPT é a key. Cada política se aplica a account users exceto ao grupo de domínio que possui essas colunas. Se você faz parte do grupo proprietário, a política não se aplica e você vê os dados brutos. Caso contrário, a política se aplica e os dados são mascarados. Usuários de múltiplos grupos se beneficiam naturalmente: um usuário em hr_team e marketing_team é excluído de ambos os conjuntos de políticas de RH e marketing.

Adicionar um novo domínio (por exemplo, Jurídico) requer:

  1. Um novo grupo (legal_team).
  2. Um novo valor permitido legal para a tag domain .
  3. Duas novas políticas (mask_internal_legal, mask_confidential_legal).
  4. etiquetas nas novas colunas.

Não é necessário alterar as políticas existentes.

Limpar​

Para remover todos os objetos criados neste tutorial, execute o seguinte comando.

SQL
DROP POLICY region_filter_us ON SCHEMA abac_tutorial.domain_demo;
DROP POLICY region_filter_eu ON SCHEMA abac_tutorial.domain_demo;
DROP POLICY mask_internal_hr ON SCHEMA abac_tutorial.domain_demo;
DROP POLICY mask_internal_finance ON SCHEMA abac_tutorial.domain_demo;
DROP POLICY mask_internal_marketing ON SCHEMA abac_tutorial.domain_demo;
DROP POLICY mask_confidential_hr ON SCHEMA abac_tutorial.domain_demo;
DROP POLICY mask_confidential_finance ON SCHEMA abac_tutorial.domain_demo;
DROP POLICY mask_confidential_marketing ON SCHEMA abac_tutorial.domain_demo;
DROP FUNCTION IF EXISTS abac_tutorial.domain_demo.region_filter;
DROP FUNCTION IF EXISTS abac_tutorial.domain_demo.partial_mask;
DROP FUNCTION IF EXISTS abac_tutorial.domain_demo.redact;
DROP TABLE IF EXISTS abac_tutorial.domain_demo.employee_records;
DROP SCHEMA IF EXISTS abac_tutorial.domain_demo CASCADE;

Para remover as tags governadas region, domain e sensitivity e os grupos account (hr_team, finance_team, marketing_team, us_team, eu_team), use a interface do usuário do Explorador de Catálogo e as configurações workspace , respectivamente.