O Hologres oferece um recurso de mascaramento de dados para proteger informações sensíveis no nível da coluna. Quando esse recurso está ativado, os dados sensíveis são mascarados automaticamente nos resultados das consultas, aumentando a segurança dos dados. Este tópico descreve como ativar o mascaramento de dados e gerencie as regras de mascaramento.
Contexto
A adoção generalizada de tecnologias de big data, como cloud e IA, está extraindo um valor sem precedentes dos dados. No entanto, isso também cria desafios significativos na proteção de informações sensíveis e privadas.
O mascaramento de dados do Hologres permite que você defina regras nos níveis de usuário e coluna. No momento da consulta, os dados são mascarados de acordo com essas regras, evitando a exposição não autorizada de informações sensíveis. Isso permite compartilhar e analisar dados com segurança, garantindo que as informações privadas permaneçam não identificáveis.
Comparação de versões
O Hologres otimizou seu comportamento de mascaramento de dados a partir da V3.1. A tabela a seguir compara os recursos da V3.1 e posteriores com as versões anteriores.
|
Recurso |
V3.1 e posteriores |
V3.0 e anteriores |
|
Mascaramento para tipos de dados não TEXT |
Suporta políticas de mascaramento padrão para tipos de dados como INT, FLOAT e arrays. Essas políticas entram em vigor apenas quando a política de mascaramento é definida para usar um valor padrão. Para mais informações, consulte Default values. |
Não suportado. Você pode contornar isso usando |
|
Visualização |
Os resultados são mascarados. |
Os resultados não são mascarados. (Não recomendado) |
|
Cláusulas JOIN ou WHERE com colunas mascaradas |
O resultado é vazio. |
Os resultados não são mascarados. (Não recomendado) |
|
Consumo de logs binários do Flink para colunas mascaradas |
|
|
|
Leituras diretas de colunas mascaradas do MaxCompute |
Proíbe o MaxCompute de ler diretamente colunas mascaradas do Hologres. |
A leitura é suportada. (Não recomendado) |
Verificar a versão do mascaramento de dados
SELECT hologres.get_hg_anon_version();
Pré-requisitos
Antes de usar o mascaramento de dados, execute os seguintes comandos no nível do banco de dados como superusuário.
--Run as a superuser
CREATE EXTENSION IF NOT EXISTS hg_anon;
ALTER DATABASE <current_db> SET hg_anon_enable = on;
Após executar essas instruções, o comportamento do mascaramento de dados é determinado pela versão da sua instância do Hologres. Selecione também manualmente um comportamento específico com base nas suas necessidades de negócios:
-
Se o comportamento de mascaramento de dados na V3.1 ou posterior não atender às suas expectativas, você pode reverter para o comportamento da V3.0 execute a seguinte instrução:
CALL hologres.set_hg_anon_version(1); -
Instâncias da V3.0 e anteriores não suportam o procedimento armazenado
set_hg_anon_version. Se você atualizou uma instância com mascaramento de dados existente para a V3.1, execute a seguinte instrução para ativar os novos recursos da V3.1. Caso contrário, o sistema mantém o comportamento legado de mascaramento de dados.CALL hologres.set_hg_anon_version(2);NotaSe a instrução for executada com sucesso, o comportamento de mascaramento de dados para a V3.1 e posteriores será ativado.
Se a instrução falhar na execução e o log de erros exibir
"Error: not safe to upgrade to hg_anon version 2", a ativação do recurso falhou. Isso ocorre porque o mascaramento de dados está configurado para colunas de tipos diferentes de TEXT, VARCHAR ou CHAR no banco de dados atual. Nas versões V3.1 e posteriores, os resultados do mascaramento de dados não são os esperados, e o comportamento de mascaramento de dados precisa ser corrigido.
Limitações
-
Você não pode importar dados de uma tabela com regras de mascaramento para uma tabela sem regras de mascaramento definidas. O sistema retorna o seguinte erro:
ERROR: The insert table has not set SECURITY LABEL -
Você não pode execute consultas
UNIONouDISTINCTem tabelas com regras de mascaramento. O sistema retorna o seguinte erro:ERROR: UNION is not support on security item O mascaramento de dados pode afetar o desempenho da consulta. O impacto varia de acordo com o método de mascaramento e o volume de dados. O desempenho pode cair de 10% a 20%, e em uma margem maior em casos extremos.
Você não pode defina regras de mascaramento para tabelas externas.
Usar o mascaramento de dados
Configure regras de mascaramento
O Hologres permite que você defina regras de mascaramento de dados para colunas ou usuários específicos. Antes de configurar as regras de mascaramento, configure o parâmetro GUC de mascaramento de dados e ative o recurso. Para mais informações, consulte Prerequisites.
-
Sintaxe
-
Defina uma política de mascaramento para uma coluna
Para mascarar dados em várias colunas, execute esta instrução para cada coluna.
SECURITY LABEL FOR hg_anon ON COLUMN <tablename>.<col_name> IS <label_name>/'default_value'; -
Defina uma política de mascaramento para um usuário
SECURITY LABEL FOR hg_anon ON ROLE <user_name> IS '[<label_name>|all]:[masked|unmasked]';
-
-
Parâmetros
Parâmetro
Descrição
hg_anon
A extensão hg_anon fornece a funcionalidade de mascaramento de dados. especifique hg_anon como o provedor na instrução SECURITY LABEL.
tablename
O nome da tabela que contém a coluna a ser mascarada.
col_name
O nome da coluna a ser mascarada.
label_name
Para as funções de anonimização predefinidas pelo sistema, você pode usar
SHOW hg_anon_labels;para visualizar olabel_namedefinido no banco de dados atual.user_name
O ID da conta. Você pode encontrá-lo na página Security Settings.
masked|unmasked
-
masked: Usa mascaramento de dados. -
unmasked: Não usa mascaramento de dados.
A tabela a seguir descreve os valores predefinidos de
label_name.Tipo de dados
label_name
Política de mascaramento
Tipo de mascaramento
Descrição
Exemplo
TEXT
name
name
mask
Mascara um nome.
-
Antes do mascaramento:
Li Hua; Após o mascaramento:* Hua. -
Antes do mascaramento:
Wang Xiaoqiang; Após o mascaramento:** Qiang.
email
email
mask
Mascara um endereço de e-mail.
Antes do mascaramento:
lihuang@alibaba.com; Após o mascaramento:lih***@alibaba.com.ip
ip
mask
Mascara um endereço IP.
Antes do mascaramento:
1.2.3.4; Após o mascaramento:1...*.id
id
mask
Mascara um número de documento de identidade.
Antes do mascaramento:
110345188812011234; Após o mascaramento:14.phone
phone
mask
Mascara um número de telefone.
Antes do mascaramento:
13900001234; Após o mascaramento:***1234.bank_id
bank_id
mask
Mascara um número de conta bancária ou cartão de crédito.
Antes do mascaramento:
2349867902834701928; Após o mascaramento:*1928.hash
md5
hash
Mascara dados usando o algoritmo MD5.
Antes do mascaramento:
Wenyi West Road, Hangzhou, Zhejiang; Após o mascaramento:dbf894b409d4a2ef17dfd9c7fdcafcd8.first_mask
first_mask
mask
A regra
first_maskexibe apenas o primeiro caractere.Antes do mascaramento:
123456789; Após o mascaramento:1****.INT, FLOAT e outros tipos numéricos
Padrão
default_value
default_value
Mascara dados com um valor padrão.
Nota-
Se o
label_nameespecificado não existir quando você configure o mascaramento de dados, o sistema usará o mascaramento de valor padrão como fallback. -
Suportado apenas no Hologres V3.1 e posteriores.
Mapeamentos entre tipos de dados e seus valores mascarados padrão:
-
TEXT/VARCHAR/CHAR:
*** -
BOOLEAN:
false -
INT8/INT4/INT2:
0 -
TIMESTAMPTZ/TIMESTAMP:
2000-01-01 00:00:00 -
FLOAT8/FLOAT4/DECIMAL/NUMERIC:
0,0 -
MONEY:
0 -
DATE:
2000-01-01 -
TIME/TIMETZ: Hora atual
-
UUID:
00000000-0000-0000-0000-000000000000
-
Visualize regras de mascaramento
-
visualize as regras de mascaramento definidas para colunas executando:
--View the masking rules set for columns SELECT c.relname, a.attname, provider, label FROM pg_seclabel s JOIN pg_class c ON s.objoid = c.oid JOIN pg_attribute a ON s.objoid = a.attrelid AND s.objsubid = a.attnum; -
visualize as regras de mascaramento definidas para usuários executando:
--View the masking rules set for users SELECT usename, label FROM pg_shseclabel s INNER JOIN pg_catalog.pg_user u ON s.objoid = u.usesysid;
Personalizar regras de mascaramento
Se as regras de mascaramento de dados existentes não atenderem aos seus requisitos, crie regras personalizadas modificando o parâmetro GUC hg_anon_lables.
-
Sintaxe
-- label_name is a custom name, and method specifies a built-in Hologres function. ALTER DATABASE <db_name> SET hg_anon_labels = '[ {"label": <label_name1>, "method":<method1>}, {"label": <label_name2>, "method":<method2>}, ... ]';Após execute o comando
ALTER DATABASE, a conexão atual se torna inválida. Você deve estabelecer uma nova conexão. Você pode usar o seguinte comando para verificar se a configuração entrou em vigor.SHOW hg_anon_enable;
-
Exemplo
ALTER DATABASE test_db SET hg_anon_labels = '[ {"label":"ip", "method":{"desensType":"mask", "type":"ip"}}, {"label":"email", "method":{"desensType":"mask", "type":"email"}}, {"label":"name", "method":{"desensType":"mask", "type":"name"}}, {"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}}, {"label":"hash", "method":{"desensType":"hash", "type":"md5", "salt":""}}]';Parâmetros:
Item
Descrição
Resultado do exemplo
{"desensType":"mask", "type":"ip"}
Mascara um endereço IP.
192...*
{"desensType":"mask", "type":"email"}
Mascara um endereço de e-mail.
abc***@example.net
{"desensType":"mask", "type":"name"}
Mascara um nome.
*Wu
{"desensType":"hash", "type":"md5", "salt":""}
Mascara dados usando uma função de hash.
e086aa137fa19f67d27b39d0eca186103228f322c9c98a125554a24f875f0f7e
{"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}}{"label":"last_mask", "method":{"desensType":"mask", "type":"user_define", "before":0, "after":1}}
Permite padrões de mascaramento personalizados, como manter um número especificado de caracteres no início ou no fim de uma string.
N/A
Exemplos
Dados de amostra
Prepare uma fonte de dados. Você também pode usar seus próprios dados de negócios.
--Create a database.
CREATE DATABASE hg_anon_demo;
--Create a sample data table.
DROP TABLE IF EXISTS personal_basic_information;
CREATE TABLE personal_basic_information
(
name TEXT
,email TEXT
,ip TEXT
,id TEXT
,phone TEXT
,bank_id TEXT);
--Insert sample data.
INSERT INTO personal_basic_information(name,email,ip,id,phone,bank_id) VALUES
('Zhang San','jiaxi***@alibaba-inc.com','127.0.0.1','142732199104050022','18157161223','4514610803067088'),
('Li Si','wb-hy583***@antgroup.com','127.0.0.1','510622198412248000','15757121834','6252470010027800'),
('Li Xiaoyao','wb-hy583***@antgroup.com','172.21.4.234','511025198812271696','18215451832','6252470010027800');
Defina regra de mascaramento de coluna
--Create the hg_anon extension.
CREATE EXTENSION IF NOT EXISTS hg_anon;
--Enable data masking for the hg_anon_demo database.
ALTER DATABASE hg_anon_demo SET hg_anon_enable = on;
--Set the masking rule for each column.
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.name IS 'name';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.id IS 'id';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.phone IS 'phone';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.email IS 'email';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.bank_id IS 'bank_id';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.ip IS 'ip';
Em uma nova conexão, execute o seguinte comando e visualize os resultados mascarados.
SELECT * FROM personal_basic_information;
O seguinte resultado é retornado:
name | email | ip | id | phone | bank_id
-------+------------------------+--------------+--------------------+-------------+------------------
* Si | wb-***@antgroup.com | 127.*.*.* | 5****************0 | *********34 | ************7800
** Yao| wb-***@antgroup.com | 172.**.*.*** | 5****************6 | *********32 | ************7800
* San | jia***@alibaba-inc.com | 127.*.*.* | 1****************2 | *********23 | ************7088
(3 rows)
Remover mascaramento de coluna
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.name IS null;
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.id IS null;
execute o seguinte comando e visualize o resultado após remover as regras de mascaramento das colunas.
SELECT name,id FROM personal_basic_information;
O seguinte resultado é retornado:
SELECT name,id FROM personal_basic_information;
name | id
--------+--------------------
Li Si | 510622198412248000
Li Xiaoyao | 511025198812271696
Zhang San | 142732199104050022
(3 rows)
Remover mascaramento de usuário
--Cancel all masking rules for the user 'BASIC$test'.
SECURITY LABEL FOR hg_anon ON ROLE "BASIC$test" IS 'all:unmasked';
execute o seguinte comando e visualize o resultado após remover a regra de mascaramento do usuário.
SELECT * FROM personal_basic_information;
O seguinte resultado é retornado:
name | email | ip | id | phone | bank_id
--------+--------------------------+--------------+--------------------+-------------+------------------
Li Si | wb-hy583***@antgroup.com | 127.0.0.1 | 510622198412248000 | 15757121834 | 6252470010027800
Li Xiaoyao | wb-hy583***@antgroup.com | 172.21.4.234 | 511025198812271696 | 18215451832 | 6252470010027800
Zhang San | jiaxi***@alibaba-inc.com | 127.0.0.1 | 142732199104050022 | 18157161223 | 4514610803067088
(3 rows)
Defina mascaramento em uma coluna JOIN
--Example of setting masking for a JOIN column
CREATE TABLE tbl1 (
id text
);
INSERT INTO tbl1
VALUES ('142732199102290022');
--The id column of the personal_basic_information table is already masked.
SELECT * FROM personal_basic_information a JOIN tbl1 b ON a.id = b.id;
O seguinte resultado é retornado:
name | email | ip | id | phone | bank_id | id
------+-------+----+----+-------+---------+----
(0 rows)
Usar o Data Security Guard
Além de configurar manualmente as regras de mascaramento, você também pode usar o Data Security Guard para automatizar o mascaramento de dados.
-
Limitações
-
Apenas o Hologres V1.1 e posteriores suportam o uso do Data Security Guard para mascaramento de dados.
NotaSe a versão da sua instância for anterior à V1.1, consulte Troubleshooting upgrade preparation errors ou entre no grupo do DingTalk do Hologres para obter suporte. Para mais informações, consulte How do I get more online support?.
Para permitir a detecção de dados sensíveis, o Data Security Guard não mascara dados para a conta root.
O Data Security Guard amostra dados às 09:00:00 (UTC+8) todos os dias para identificar dados sensíveis e defina regras de mascaramento para as colunas que os contêm.
Você pode usar o Data Security Guard para mascarar dados no Hologres nas seguintes regiões: China (Beijing), China (Zhangjiakou), China (Shanghai), China (Hangzhou), China (Shenzhen), China (Hong Kong), Singapore, Germany (Frankfurt), Malaysia (Kuala Lumpur), Indonesia (Jakarta) e US (Silicon Valley).
-
-
Procedimento
-
ative o recurso de mascaramento de dados.
O mascaramento de dados é desativado por padrão. Um superusuário deve execute os seguintes comandos no banco de dados de destino para ativá-lo.
--Install the data masking EXTENSION. CREATE EXTENSION IF NOT EXISTS hg_anon; --Enable data masking for the specified database. It is disabled by default. ALTER DATABASE <db_name> SET hg_anon_enable = on;db_name é o banco de dados para o qual você deseja ativar o mascaramento de dados.
Importantehg_anon_enableé um GUC. Após execute o comando ALTER DATABASE, a alteração não entra em vigor para a conexão atual.-
Você pode execute a seguinte instrução SQL para verificar se a configuração entrou em vigor.
SHOW hg_anon_enable;
-
Configure o banco de dados para o mascaramento.
Faça login no console do Data Security Guard. Para mais informações, consulte Go to the Data Security Guard page.
Na barra de navegação à esquerda, clique em e acesse a página Data Identification Rule.
Na página Sensitive Data Identification, crie uma regra de identificação de dados. Para mais informações, consulte Data identification rules.
Na barra de navegação à esquerda, clique em Data Masking Management e acesse a página Data Masking Management.
Na lista suspensa Masking Scenario, selecione Hologres display masking (hologres_display_desense_code) e, em seguida, clique em Select Database for Masking à direita.
Na caixa de diálogo Authorize Account for Masking, selecione um banco de dados na lista Unmasked Databases e mova-o para a lista Masked Databases. Marque a caixa de seleção I agree to authorize Data Security Guard to mask this database e, em seguida, clique em OK.
Na página Data Masking Management, clique em Create Masking Rule no canto superior direito. Para mais informações, consulte Data Masking Management. O sistema então aplica o mascaramento ao banco de dados especificado.
-
Perguntas frequentes
Os dados não estão mascarados?
Sintoma: Você segue as etapas do exemplo, mas os resultados da consulta não são mascarados.
-
Possíveis causas:
Uma regra está definida para desativar o mascaramento para alguns usuários.
Os rótulos de mascaramento não estão configurados.
-
Solução:
-
execute o seguinte comando SQL para verificar se há regras de remoção de mascaramento específicas para usuários.
SELECT usename, label FROM pg_shseclabel s INNER JOIN pg_catalog.pg_user u on s.objoid = u.usesysid;Por padrão, essa consulta retorna um resultado vazio, o que significa que o mascaramento de dados se aplica a todos os usuários. Se o resultado não estiver vazio, você deve ativar o mascaramento para os usuários listados.
-
execute a seguinte instrução SQL para verificar os rótulos de mascaramento configurados.
SHOW hg_anon_labels;Se o resultado não incluir rótulos como
ip, execute o seguinte comando SQL para defini-los.ALTER DATABASE compress_test SET hg_anon_labels = '[ {"label":"ip", "method":{"desensType":"mask", "type":"ip"}}, {"label":"email", "method":{"desensType":"mask", "type":"email"}}, {"label":"name", "method":{"desensType":"mask", "type":"name"}}, {"label":"id", "method":{"desensType":"mask", "type":"id"}}, {"label":"phone", "method":{"desensType":"mask", "type":"phone"}}, {"label":"bank_id", "method":{"desensType":"mask", "type":"bank_id"}}, {"label":"hash", "method":{"desensType":"hash", "type":"md5", "salt":""}}, {"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}} ]';Para mais informações sobre as regras correspondentes a esses rótulos, consulte Predefined label_name values.
-