Para permitir que determinados usuários visualizem dados confidenciais em um projeto do MaxCompute ocultando informações essenciais, ative o mascaramento dinâmico de dados. Esse recurso oculta ou substitui dados confidenciais em tempo real no momento do acesso, evitando vazamentos. Este tópico descreve como ativar o mascaramento dinâmico de dados no MaxCompute e fornece exemplos de uso.
Introdução
O MaxCompute oferece mascaramento dinâmico de dados para proteger informações confidenciais, como dados de identificação pessoal (PII), em cenários de desenvolvimento, testes, compartilhamento de dados e operações. Diferentemente das listas de controle de acesso (ACLs) no nível de coluna, que exigem a modificação de consultas para excluir colunas sem permissão de acesso, o mascaramento dinâmico funciona automaticamente, sem alterar consultas existentes. Quando um usuário acessa os dados, o sistema aplica a política de mascaramento adequada com base no usuário ou em sua função. Isso garante que os dados sejam mascarados durante consultas, downloads, junções e computações de funções definidas pelo usuário (UDF), mitigando o risco de exposição de informações sensíveis.
As políticas de mascaramento suportam diversos métodos, incluindo mascaramento, hashing, substituição de caracteres, arredondamento numérico e truncamento de datas, protegendo dados como números de identificação, cartões bancários, endereços e telefones. O MaxCompute aplica o mascaramento na etapa inicial da recuperação dos dados do armazenamento. Essa abordagem assegura alto desempenho e segurança.

Notas de uso
-
Regiões suportadas
Este recurso está em preview público e disponível apenas nas seguintes regiões: China (Hangzhou), China (Shanghai), China (Beijing), China (Zhangjiakou), China (Ulanqab), China (Shenzhen), China (Chengdu), China (Hong Kong), Japan (Tokyo), Singapore, Malaysia (Kuala Lumpur), Indonesia (Jakarta), Germany (Frankfurt), US (Silicon Valley) e US (Virginia).
-
Versões de driver suportadas
Método de conexão
Versão mínima
Suporte a mascaramento
Java SDK
0.48.0-public ou posterior
Suportado
odpscmd
0.47.1 ou posterior
Suportado
JDBC
3.4.3 ou posterior
Suportado
MaxFrame
Todas as versões
Suportado
PyODPS
Todas as versões
Suportado
Go SDK
Todas as versões
Suportado
-
Tabelas internas e externas
Políticas de mascaramento são suportadas tanto em tabelas internas quanto externas do MaxCompute.
Atualmente, se uma tabela contiver dados do tipo JSON e uma consulta envolver colunas JSON, os recursos de mascaramento de dados e permissões no nível de linha são mutuamente exclusivos. Não é possível configurar uma política de permissão no nível de linha em uma tabela que já possui uma política de mascaramento de dados, e vice-versa.
Ao aplicar uma política de mascaramento a caracteres chineses, a codificação deve ser UTF-8.
-
Visualizações
Visualizações padrão suportam políticas de mascaramento. As políticas de uma visualização são sincronizadas com as da tabela de origem. Quando uma política de mascaramento é vinculada ou desvinculada da tabela de origem, a alteração entra em vigor imediatamente na visualização.
Uma visualização materializada herda as políticas de mascaramento da tabela de origem no momento da criação. Alterações posteriores nas políticas da tabela de origem não afetam a visualização materializada.
-
Políticas de mascaramento
Se várias políticas de mascaramento se aplicarem a um usuário, aquela com a maior prioridade será utilizada. Para mais informações, consulte Policy priorities.
Funcionamento
O proprietário do projeto ou usuários com a função Super_Administrator ou Admin podem gerenciar políticas de mascaramento. Quando um usuário acessa uma tabela com dados confidenciais, o sistema verifica as políticas associadas ao usuário ou à sua função e retorna dados mascarados ou em texto simples, conforme apropriado.

Permissões de mascaramento
Somente o proprietário do projeto ou usuários com a função Super_Administrator ou Admin no nível do projeto podem ativar ou desativar o mascaramento dinâmico de dados para um projeto.
As permissões necessárias para gerenciar políticas de mascaramento de uma tabela são as seguintes:
Por padrão, o proprietário do projeto ou usuários com a função Super_Administrator ou Admin no nível do projeto possuem as permissões necessárias.
-
Também é possível conceder permissões a um RAM User ou RAM Role usando uma função administrativa personalizada de projeto. Acesse o MaxCompute console. No painel de navegação à esquerda, escolha . Na página de gerenciamento do seu projeto, acesse a página Project Settings e selecione a aba Role Permissions. Clique em Create Project-level Role para criar uma função de projeto com permissões do MaxCompute. Defina o Role Type como Admin (management role) e utilize uma declaração de política semelhante ao exemplo abaixo:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "odps:CreateDataMaskingPolicy","odps:ListDataMaskingPolicies"], "Resource": [ "acs:odps:*:projects/[project_name]/authorization/datamaskingpolicies" ] }, { "Effect": "Allow", "Action": [ "odps:DropDataMaskingPolicy", "odps:DescribeDataMaskingPolicy" ], "Resource": [ "acs:odps:*:projects/[project_name]/authorization/datamaskingpolicies/*" ] }, { "Effect": "Allow", "Action": "odps:ApplyDataMaskingPolicy", "Resource": [ "acs:odps:*:projects/[project_name]/authorization/tables/*", "acs:odps:*:projects/[project_name]/authorization/datamaskingpolicies/*" ] } ] }
Comandos
Ativar ou desativar o mascaramento de dados
A chave de mascaramento de dados odps.data.masking.policy.enable é uma propriedade no nível do projeto. Apenas o proprietário do projeto ou usuários com a função Super_Administrator ou Admin no nível do projeto podem configurar essa propriedade. Para mais informações, consulte Manage built-in roles.
Após ativar ou desativar o mascaramento, a alteração leva aproximadamente 15 minutos para entrar em vigor devido à latência de atualização do cache.
-
Ative o mascaramento dinâmico de dados para o projeto.
setproject odps.data.masking.policy.enable=true; -
Desative o mascaramento dinâmico de dados para o projeto.
setproject odps.data.masking.policy.enable=false;
Criar e excluir políticas de mascaramento
Um projeto pode ter no máximo 1.000 políticas de mascaramento.
-
Sintaxe
-
Crie uma política de mascaramento.
CREATE DATA MASKING POLICY [IF NOT EXISTS] <policy_name> TO { USER <user_list> | ROLE <role_list> | default } USING <Predefined Masking Policy>; -
Exclua uma política de mascaramento.
DROP DATA MASKING POLICY <policy_name>;
-
-
Parâmetros
Parâmetro
Obrigatório
Descrição
policy_name
Sim
Nome da política de mascaramento. O nome não diferencia maiúsculas de minúsculas e pode conter apenas letras (a–z, A–Z), dígitos (0–9) e sublinhados (_). Recomenda-se iniciar o nome com uma letra. O tamanho máximo é de 128 bytes.
USER | ROLE | default
Sim
Escolha uma das opções a seguir:
USER: Aplica a política a usuários específicos. Em
<user_list>, especifique os nomes dos usuários. Execute o comandolist users;para visualizar as informações dos usuários.ROLE: Aplica a política a funções específicas. Em
<role_list>, especifique os nomes das funções. Execute o comandolist roles;para visualizar as informações das funções.default: Aplica a política por padrão. Se nenhuma outra política de mascaramento corresponder a um usuário ou função, a política padrão será aplicada.
Predefined Masking Policy
Sim
Uma política de mascaramento predefinida. Para mais informações, consulte Predefined masking policies.
-
Exemplos
-
Exemplo 1: Crie uma política de hashing MD5 para userA, userB e userC.
CREATE data masking policy IF NOT EXISTS masking_test_001 TO USER (userA, userB, userC) USING MASKED_MD5(0); -
Exemplo 2: Crie uma política de hashing MD5 para as funções de desenvolvimento e operações de um projeto.
CREATE data masking policy IF NOT EXISTS masking_test_001 TO ROLE (role_project_deploy, role_project_dev) USING MASKED_MD5(0);
-
Aplicar políticas a colunas
-
Sintaxe
--Bind a policy to a column APPLY DATA MASKING POLICY <policy_name> BIND TO TABLE <table_name> COLUMN <column_name>; --Unbind a specific masking policy from a sensitive data column APPLY DATA MASKING POLICY <policy_name> UNBIND FROM TABLE <table_name> COLUMN <column_name>; --Unbind all masking policies from a sensitive data column APPLY DATA MASKING POLICY UNBIND ALL FROM TABLE <table_name> COLUMN <column_name>; --Unbind all masking policies from all sensitive data columns of a table APPLY DATA MASKING POLICY UNBIND ALL FROM TABLE <table_name>; -
Parâmetros
Parâmetro
Obrigatório
Descrição
policy_name
Sim
Nome da política de mascaramento.
table_name
Sim
Nome da tabela que contém dados confidenciais.
column_name
Sim
Nome da coluna que contém dados confidenciais.
Visualizar políticas de mascaramento
-
Sintaxe
--View the creation information of a masking policy DESC DATA MASKING POLICY <policy_name>; --View a table's extended information, including its masking policies DESC EXTENDED <table_name>; --List the names of all masking policies in the current project LIST DATA MASKING POLICY; --List the names of masking policies bound to a specific user LIST DATA MASKING POLICY TO USER <user_name>; --List the names of masking policies bound to a specific role LIST DATA MASKING POLICY TO ROLE <role_name>; --List the names of all masking policies bound to a specific table LIST DATA MASKING POLICY ON <table_name>; --List the names of all masking policies bound to a specific column of a table LIST DATA MASKING POLICY ON <table_name> TO COLUMN <column_name>; -
Parâmetros
Parâmetro
Obrigatório
Descrição
policy_name
Sim
Nome da política de mascaramento.
table_name
Sim
Nome da tabela que contém dados confidenciais.
column_name
Sim
Nome da coluna que contém dados confidenciais.
user_name
Sim
Nome do usuário.
role_name
Sim
Nome da função.
Políticas de mascaramento predefinidas
As políticas de mascaramento predefinidas incluem métodos como mascaramento, hashing, substituição de caracteres e arredondamento. Escolha uma política com base no tipo de dado e nos seus requisitos de proteção.
Tipo de política | Nome da política | Sintaxe | Descrição |
Geral | Sem mascaramento | UNMASKED | Retorna dados em texto simples. Tipos de dados suportados: Todos. |
Anular | MASKED_NULLIFY | Substitui os dados por NULL.
| |
Valor padrão | MASKED_DV | Substitui o valor pelo valor padrão do tipo de dado correspondente. Para mais informações, consulte Default values for MASKED_DV.
| |
Truncamento de data | MASKED_DATE_YEAR | Mantém apenas a parte do ano de um valor de tempo e redefine o mês, dia e hora para o início daquele ano (1º de janeiro, 00:00:00 UTC).
| |
Arredondamento | MASKED_POINT_RESERVE(<num>) | Arredonda um número para um número especificado de casas decimais, de 0 a 5.
| |
Mascaramento | Mascarar início e fim | MASKED_STRING_MASKED_BA(<before>, <after>) | Mascara o início e o fim de uma string com asteriscos (
|
Mascarar meio | MASKED_STRING_UNMASKED_BA(<before>, <after>) | Exibe o início e o fim de uma string em texto simples e mascara a parte central com asteriscos (
| |
Hashing | Hashing SHA-256 | MASKED_SHA256(<salt>) | Mascara dados utilizando o algoritmo de hashing SHA-256.
|
Hashing SHA-512 | MASKED_SHA512(<salt>) | Mascara dados utilizando o algoritmo de hashing SHA-512.
| |
Hashing MD5 | MASKED_MD5(<salt>) | Mascara dados utilizando o algoritmo de hashing MD5.
| |
Hashing SM3 | MASKED_SM3(<salt>) | Mascara dados utilizando o algoritmo de hashing SM3.
| |
Substituição de caracteres | Substituição aleatória | MASKED_REPLACE_RANDOM(<position>) | Substitui dados por caracteres aleatórios, incluindo dígitos e letras. O comprimento da string permanece inalterado.
|
Substituição aleatória no início e fim | MASKED_REPLACE_RANDOM_BA(<before>, <after>) | Substitui o início e o fim de uma string por caracteres aleatórios, incluindo dígitos e letras. O comprimento da string permanece inalterado.
| |
Substituição fixa | MASKED_REPLACE_FIXED(<position>, <fixed_string>) |
|
Exemplos
Mascarar informações pessoais confidenciais
Este exemplo mostra como configurar políticas de mascaramento para ocultar informações pessoais confidenciais.
-
Prepare os dados.
Crie uma tabela para armazenar informações pessoais e insira dados confidenciais.
-- Create a table for sensitive information. CREATE TABLE if NOT EXISTS personal_info ( id bigint COMMENT 'The unique ID of the user.', name string COMMENT 'The name of the user.', age int COMMENT 'The age of the user.', gender string COMMENT 'The gender of the user.', height float COMMENT 'The height of the user.', birthday date COMMENT 'The birth date of the user.', phone_number string COMMENT 'The phone number of the user.', email string COMMENT 'The email address of the user.', address string COMMENT 'The address of the user.', salary decimal(18, 2) COMMENT 'The salary of the user.', create_time timestamp COMMENT 'The time when the user information was created.', update_time timestamp COMMENT 'The time when the user information was updated.', is_deleted boolean COMMENT 'Indicates whether the user information is deleted.' ); -- Insert sensitive data. INSERT INTO personal_info VALUES (1, 'Zhang San', 18, 'Male', 178.56, '1990-01-01', '13800000000', 'zhangsan@example.com', 'Haidian District, Beijing', 5000.00, '2023-04-19 11:32:00', '2023-04-19 11:32:00', false), (2, 'Li Si', 20, 'Female', 162.70, '1992-02-02', '13900000000', 'lisi@example.com', 'Pudong New Area, Shanghai', 6000.00, '2023-04-19 11:32:00', '2023-04-19 11:32:00',false), (3, 'Wang Wu', 22, 'Male', 185.21, '1994-03-03', '14000000000', 'wangwu@example.com', 'Nanshan District, Shenzhen', 7000.00, '2023-04-19 11:32:00', '2023-04-19 11:32:00', false); -
Configure as políticas de mascaramento.
-
Para nomes, mantenha apenas o primeiro caractere e substitua o restante por asteriscos (
*).CREATE data masking policy IF NOT EXISTS masking_name TO USER (RAM$xxx@test.aliyunid.com:xxx) USING MASKED_STRING_UNMASKED_BA(1, 0); apply data masking policy masking_name bind TO TABLE personal_info COLUMN name; -
Arredonde os valores de altura para o inteiro mais próximo.
CREATE data masking policy IF NOT EXISTS masking_height TO USER (RAM$xxx@test.aliyunid.com:xxx) USING MASKED_POINT_RESERVE(0); apply data masking policy masking_height bind TO TABLE personal_info COLUMN height; -
Para datas de nascimento, mantenha apenas o ano.
CREATE data masking policy IF NOT EXISTS masking_birthday TO USER (RAM$xxx@test.aliyunid.com:xxx) USING MASKED_DATE_YEAR; apply data masking policy masking_birthday bind TO TABLE personal_info COLUMN birthday; -
Para usuários padrão, aplique hash aos números de telefone usando o algoritmo SM3.
CREATE DATA MASKING POLICY default_sm3 TO DEFAULT USING MASKED_SM3(0); apply data masking policy default_sm3 bind TO TABLE personal_info COLUMN phone_number;
-
-
Use uma conta sujeita às políticas de mascaramento para consultar os dados.
SELECT id, name, height, birthday, phone_number FROM personal_info; -- Before masking +------------+-----------+--------+------------+--------------+ | id | name | height | birthday | phone_number | +------------+-----------+--------+------------+--------------+ | 1 | Zhang San | 178.56 | 1990-01-01 | 13800000000 | | 2 | Li Si | 162.7 | 1992-02-02 | 13900000000 | | 3 | Wang Wu | 185.21 | 1994-03-03 | 14000000000 | +------------+-----------+--------+------------+--------------+ -- After masking +------------+------------+------------+------------+------------------------------------------------+ | id | name | height | birthday | phone_number | +------------+------------+------------+------------+------------------------------------------------+ | 1 | Z******** | 179.0 | 1990-01-01 | lvYJaH4ElL2ilpQx/8tfMUw7xP22yblIgmfWp0/msUQ= | | 2 | L**** | 163.0 | 1992-01-01 | 9fFWacNSwCRZLAjMHqunlfwkqhTbP2ubuDOeOSh4N1c= | | 3 | W****** | 185.0 | 1994-01-01 | k/0JoQCSarJg9ATJ5tyVnhQf1jIBxHXRbB+cvUm4OmE= | +------------+------------+------------+------------+------------------------------------------------+
Mascaramento padrão
Este exemplo demonstra como funciona a prioridade de políticas quando um usuário ou função corresponde a múltiplas políticas de mascaramento.
Aplique a política MASKED_SHA256(5) aos usuários padrão.
CREATE DATA MASKING POLICY default_hash_policy
TO DEFAULT
USING MASKED_SHA256(5);
Aplique a política UNMASKED aos usuários específicos A e B.
CREATE DATA MASKING POLICY ab_unmask_policy
TO USER (A, B)
USING UNMASKED;
Resultado: Os usuários A e B podem acessar dados em texto simples. Outros usuários podem acessar apenas os dados com hash SHA-256.
Os usuários A e B correspondem tanto às políticas MASKED_SHA256(5) quanto UNMASKED. O sistema aplica UNMASKED porque ela tem prioridade mais alta. Para mais informações, consulte Policy priorities. Outros usuários correspondem apenas à política MASKED_SHA256(5).
Apêndice
Prioridades de políticas
Quando várias políticas de mascaramento se aplicam a um usuário, aquela com a maior prioridade é utilizada.
Por exemplo, um usuário chamado A acessa a coluna col_string e corresponde a duas políticas de mascaramento: MASKED_REPLACE_RANDOM(3) com nível de prioridade 3 e MASKED_SM3 com nível de prioridade 4. Como um número menor indica maior prioridade, a política MASKED_REPLACE_RANDOM(3) é aplicada. O usuário A vê os dados mascarados com caracteres aleatórios.
Prioridade | Política de mascaramento |
0 (Mais alta) | UNMASKED |
1 | MASKED_POINT_RESERVE(num) |
2 | MASKED_DATE_YEAR |
3 | MASKED_STRING_MASKED_BA(before, after) |
MASKED_STRING_UNMASKED_BA(before, after) | |
MASKED_REPLACE_RANDOM(position) | |
MASKED_REPLACE_RANDOM_BA(before, after) | |
MASKED_REPLACE_FIXED(position, fixed_string) | |
4 | MASKED_SHA256 |
MASKED_SHA512 | |
MASKED_MD5 | |
MASKED_SM3 | |
5 | MASKED_DV |
6 (Mais baixa) | MASKED_NULLIFY |
Valores padrão para MASKED_DV
|
Tipo |
Padrão |
|
BIGINT |
0 |
|
DOUBLE |
0,0 |
|
DECIMAL |
0 |
|
STRING |
"" (string vazia) |
|
DATETIME |
DATETIME '1970-01-01 00:00:00' (UTC) |
|
BOOLEAN |
false |
|
TINYINT |
0 |
|
SMALLINT |
0 |
|
INT |
0 |
|
BINARY |
'' (string binária vazia) |
|
FLOAT |
0,0 |
|
DOUBLE |
0,0 |
|
DECIMAL |
0 |
|
VARCHAR(n) |
"" (string vazia) |
|
CHAR(n) |
" " (n espaços) |
|
DATE |
DATE '1970-01-01' |
|
TIMESTAMP |
TIMESTAMP '1970-01-01 00:00:00' (UTC) |
|
TIMESTAMP_NTZ |
TIMESTAMP '1970-01-01 00:00:00' (UTC) |
|
ARRAY |
Um array vazio. |
|
MAP |
Um mapa vazio. |
|
JSON |
"" (string vazia) |
|
STRUCT |
(valores padrão dos tipos de campo) |