Este artigo fornece uma compreensão de alto nível do mascaramento de dados dinâmicos no SQL Server, juntamente com seus casos de uso, práticas recomendadas e implicações de segurança para usuários avançados de SQL (incluindo desenvolvedores e testadores). Além disso, os leitores deste artigo vão se familiarizar com a aplicação de diferentes tipos de mascaramento de dados dinâmicos. O artigo também destaca a importância do uso de nível avançado de mascaramento de dados nas tarefas diárias de desenvolvimento e teste de banco de dados.
Pré-requisitos
Vamos passar pelos pré-requisitos para este artigo primeiro.
Conhecimento com T-SQL
Este artigo pressupõe que os leitores estejam bem familiarizados com scripts T-SQL e possam escrever e executar consultas SQL confortavelmente para visualizar e manipular os bancos de dados SQL.
Noções básicas de mascaramento dinâmico de dados
Este artigo também pressupõe que os leitores conheçam os conceitos básicos de mascaramento de dados dinâmicos no SQL Server. Consulte o artigo Mascaramento de dados no SQL Server para iniciantes para se familiarizar com os conceitos básicos do mascaramento dinâmico de dados, caso ainda não o tenha feito.
Banco de dados SQL do Azure ou compatibilidade com SQL Server 2016
O recurso de mascaramento de dados dinâmicos está disponível no SQL Server 2016 até o SQL Server 2019, portanto, é altamente recomendável ter um dos seguintes:
1. Banco de dados SQL do Azure
2. SQL Server 2016 instalado local ou remotamente.
Configurando o banco de dados de amostra
Lembre-se de criar um banco de dados de exemplo usando o seguinte script T-SQL compatível com o SQL Server 2016 ou como Banco de Dados SQL do Azure se desejar seguir o passo a passo neste artigo:
-- Criar banco de dados de amostra ITSalesV2CREATE DATABASE ITSalesV2;GOUSE [ITSalesV2]-- (2) Criar tabela de venda mensalCREATE TABLE [dbo].[venda mensal]( [SaleId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, [SellingDate] [datetime2](7) NULL, [Customer] [varchar](50) NULL, [Email] [varchar] (200) NULL, [Product] [varchar](150) NULL, [TotalPrice] [decimal] (10, 2) NULL,)-- (2) Preencher tabela de venda mensalSET IDENTITY_INSERT [dbo].[MonthlySale] ONINSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email] , [Product], [TotalPrice]) VALUES (1, N'2019-05-01 00:00:00', N'Asif', N'[email protected]', N'Dell Laptop', CAST(300,00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Email], [Product], [TotalPrice]) VALUES (2, N'2019 -05-02 00:00:00', N'Mike',N'[email protected]', N'Dell Laptop', CAST(300.00 AS Decimal(10, 2)))INSERT INTO [dbo].[ MonthlySale] ([SaleId], [SellingDate], [Customer], [Email], [Product], [TotalPrice]) VALUES (3, N'2019-05-02 00 :00:00', N'Adil',N'[email protected]',N'Lenovo Laptop', CAST(350.00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId ], [SellingDate], [Customer], [Email], [Product], [TotalPrice]) VALUES (4, N'2019-05-03 00:00:00', N'Sarah',N'example@sqldat .com', N'HP Laptop', CAST(250,00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product ], [TotalPrice]) VALUES (5, N'2019-05-05 00:00:00', N'Asif', N'[email protected]', N'Dell Desktop', CAST(200,00 AS Decimal( 10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (6, N'2019-05- 10 00:00:00', N'Sam',N'[email protected]', N'HP Desktop', CAST(300.00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ( [SaleId], [SellingDate], [Customer], [Email], [Product], [TotalPrice]) VALUES (7, N'2019-05-12 00:00:00', N'Mike',N'example @sqldat.com', N'iPad', CAST(250.00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate] , [Cliente], [E-mail], [Produto], [Preço Total]) VALORES (8, N'2019-05-13 00:00:00', N'Mike',N'[email protected]', N 'iPad', CAST(250,00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (9, N'2019-05-20 00:00:00', N'Peter',N'[email protected]', N'Dell Laptop', CAST(350,00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Email], [Product], [TotalPrice]) VALUES (10, N'2019-05-25 00:00:00 ', N'Peter',N'[email protected]', N'Asus Laptop', CAST(400.00 AS Decimal(10, 2)))SET IDENTITY_INSERT [dbo].[MonthlySale] OFF
Verificando dados
Verifique o banco de dados de amostra ITSalesV2 recém-criado e preenchido executando o seguinte script:
-- Visualizar dados de vendas mensaisSELECT s.SaleId ,s.SellingDate ,s.Customer ,s.Email ,s.Product ,s.TotalPriceFROM dbo.MonthlySale s
A saída é a seguinte:
Criando um usuário sem privilégios
Por favor, crie um usuário sem privilégios sem login tendo apenas permissão SELECT na tabela MonthlySale que verá os dados mascarados como um pré-requisito para este artigo. Use o script a seguir para fazer isso:
-- Criar DataUser para ter acesso Select à tabela MonthlySaleCREATE USER DataUser SEM LOGIN; GRANT SELECT ON MonthlySale TO DataUser;
Criando um procedimento para verificar o status de mascaramento
Este artigo também pressupõe que há um procedimento armazenado no banco de dados de exemplo que nos mostra o status de mascaramento de dados dinâmico das colunas nas tabelas do banco de dados:
-- Procedimento armazenado para verificar o status de mascaramento de dados dinâmicosCREATE PROC ShowMaskingStatusASBEGINSET NOCOUNT ON SELECT c.name, tbl.name como table_name, c.is_masked, c.masking_function FROM sys.masked_columns AS c JOIN sys.tables AS tbl ON c. [object_id] =tbl.[object_id] WHERE is_masked =1;END
Tipos de mascaramento de dados dinâmicos
Existem quatro tipos comuns de mascaramento de dados dinâmicos no SQL Server:
1. Máscara(s) de dados padrão
2. Máscara(s) de Dados Parciais
3. Máscara(s) de dados aleatórios
4. Máscara(s) de dados de string personalizada
Agora vamos implementar todos os quatro tipos comuns de mascaramento de dados dinâmicos.
Implementando o mascaramento de dados padrão
O mascaramento de dados padrão oculta uma coluna completamente de um usuário não autorizado, cobrindo todos os valores da coluna com um caractere especial, tornando muito difícil adivinhar o conteúdo da coluna.
Requisito Comercial
Agora suponha que você receba um requisito comercial que afirma que os endereços de e-mail dos clientes devem ser completamente ocultos (mascarados) devido à confidencialidade dessas informações.
A melhor maneira de atender a esse requisito comercial é mascarar a coluna E-mail usando DDM (Dynamic Data Masking).
Mascaramento de dados padrão de endereço de e-mail
Vamos alterar a tabela para mascarar os endereços de e-mail da seguinte forma:
--Mascaramento de dados dinâmicos padrão da coluna Email ALTER TABLE MonthlySaleALTER COLUMN Email varchar(200) MASKED WITH (FUNCTION ='default()');
Verificando o status de mascaramento
Verifique o status de mascaramento de dados dinâmicos usando o seguinte procedimento armazenado com base em um script T-SQL referenciado na documentação da Microsoft:
-- Verificando o status do mascaramento de dados dinâmicoEXEC ShowMaskingStatus
A saída nos mostra quais colunas foram mascaradas com sucesso:
Visualizando a coluna de e-mail como um usuário de dados
Em seguida, execute a instrução Select para visualizar as vendas mensais (tabela) como um usuário com poucos privilégios chamado DataUser, tendo apenas permissão de seleção na tabela da seguinte forma:
-- Executa SELECT como DataUserEXECUTE AS USER ='DataUser'; -- Visualizar vendas mensais SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s-- Reverter o usuário de volta para o usuário que era antes de REVERT;
A saída é a seguinte:
Implementando o Mascaramento Parcial de Dados
O mascaramento parcial de dados, como o nome indica, oculta parcialmente uma coluna da visualização por um usuário não autorizado, cobrindo parte dos valores da coluna com caracteres especiais, tornando o conteúdo da coluna um pouco legível, mas ainda difícil de adivinhar.
Requisito Comercial
Agora pense em um requisito de negócios no qual você foi solicitado a ocultar parcialmente o nome dos clientes de forma que apenas o primeiro caractere do nome permaneça visível. A melhor maneira de atender a esse requisito de negócios é mascarar a coluna Cliente usando Mascaramento de dados dinâmicos Parciais.
Mascaramento de dados parciais de nomes de clientes
Vamos alterar a tabela para mascarar parcialmente a coluna Cliente da seguinte forma:
-- Mascaramento de dados parciais de nomes de clientesALTER TABLE MonthlySaleALTER COLUMN [Cliente] ADD MASKED WITH (FUNCTION ='partial(1,"XXXXXXX",0)')
Verificando o status de mascaramento
Verifique o status de mascaramento de dados dinâmicos:
-- Verificando o status do mascaramento de dados dinâmicoEXEC ShowMaskingStatus
A saída nos mostra quais colunas foram mascaradas com sucesso:
Visualizando a coluna do cliente como um usuário de dados
Visualize a tabela como um usuário de teste DataUser que deve ver os dados mascarados:
-- Executa SELECT como DataUserEXECUTE AS USER ='DataUser'; -- Visualizar vendas mensais como DataUserSELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s-- Reverter o usuário de volta para o usuário que era antes de REVERT;
A saída é a seguinte:
Implementando o mascaramento de dados aleatórios
O mascaramento de dados aleatórios oculta uma coluna aleatoriamente de um usuário não autorizado, cobrindo uma coluna com base em um intervalo de valores, tornando muito difícil adivinhar o conteúdo da coluna. Lembre-se de que o tipo de mascaramento de dados aleatórios é aplicável apenas às colunas que armazenam apenas números e pode ser especificado fornecendo um intervalo para randomização.
Requisito Comercial
Você recebe um requisito comercial que afirma que o preço do produto deve ser mascarado com um intervalo aleatório de números para que os usuários com privilégios baixos não saibam os preços exatos do produto por motivos de privacidade. A melhor maneira de atender a essa especificação de negócios é mascarar a coluna TotalPrice usando mascaramento de dados dinâmicos aleatórios.
Mascaramento de dados aleatórios da coluna TotalPrice
Altere a tabela MonthlySale para mascarar o TotalPrice aleatoriamente da seguinte forma:
--Mascaramento de dados dinâmicos aleatórios da coluna TotalPrice ALTER TABLE MonthlySaleALTER COLUMN [TotalPrice] decimal(10,2) MASCARADO COM (FUNCTION ='random(1, 12)')Verificando o status de mascaramento
Verifique o status de mascaramento de dados dinâmicos executando o seguinte procedimento armazenado:
-- Verificando o status do mascaramento de dados dinâmicoEXEC ShowMaskingStatus
A saída nos mostra quais colunas foram mascaradas com sucesso:
Visualizando a coluna TotalPrice como um DataUser
Visualize a tabela como um DataUser agora:
-- Executa SELECT como DataUserEXECUTE AS USER ='DataUser'; -- Visualizar vendas mensais SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice de dbo.MonthlySale s-- Reverter o usuário de volta para o usuário que era antes de REVERT;
A saída é a seguinte:
Lembre-se de que a saída pode ser diferente para a coluna Random Data Masked devido à geração de números aleatórios.
Implementação do mascaramento de dados de string personalizado
O mascaramento de dados de string personalizado, como o próprio nome indica, adiciona caracteres personalizados para ocultar uma coluna, tornando muito difícil adivinhar seu conteúdo. Lembre-se de que o mascaramento de dados de string personalizado é usado em conjunto com o mascaramento de dados parcial, personalizando o caractere para mascarar os valores reais da coluna. Em outras palavras, o mascaramento de dados de string personalizado é uma forma aprimorada de mascaramento de dados parcial.
Requisito Comercial
Considere um requisito de negócios para mostrar apenas o primeiro e o último caractere da coluna Produto, enquanto o restante dos caracteres deve ser ocultado ou mascarado com hífens (-). A melhor maneira de atender a essa especificação de negócios é mascarar a coluna Produto usando o mascaramento de dados dinâmicos parciais com a string personalizada necessária.
Mascaramento de dados de string do cliente de dados de venda
Altere a tabela MonthlySale para mascarar a coluna Product da seguinte forma:
--Mascaramento de dados dinâmicos de string personalizada da coluna Produto ALTER TABLE MonthlySaleALTER COLUMN [Produto] ADD MASKED WITH (FUNCTION ='partial(1,"---",1)')Verificando o status de mascaramento
Vale a pena verificar o status do mascaramento de dados dinâmicos neste momento usando o seguinte script:
-- Verificando o status do mascaramento de dados dinâmicoEXEC ShowMaskingStatus
A saída mostra todas as colunas nas quais o mascaramento de dados dinâmico foi aplicado com sucesso, conforme mostrado abaixo:
Visualizando a coluna do produto como um usuário de dados
Visualize a tabela como um DataUser agora:
-- Executa SELECT como DataUserEXECUTE AS USER ='DataUser'; -- Visualizar vendas mensais SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice de dbo.MonthlySale s-- Reverter o usuário de volta para o usuário que era antes de REVERT;
A saída é a seguinte:
Parabéns! Você implementou com sucesso todas as quatro técnicas de mascaramento.
Consulte o artigo Mascaramento de Dados no SQL Server para iniciantes descartarem os tipos de mascaramento de dados aplicados.
Práticas recomendadas
Por favor, lembre-se das seguintes coisas:
1. O mascaramento de dados dinâmicos não protege nem criptografa os dados da coluna, portanto, não deve ser usado para essa finalidade.
2. O usuário em potencial que deveria ver os dados mascarados deve ter acesso muito limitado para visualizar os dados e não deve receber permissão de atualização para explorar os dados.
3. O usuário em potencial, mesmo com permissão apenas SELECT, pode executar consultas exaustivas para adivinhar o valor correto, portanto, tome cuidado com isso.
4. Você também pode usar ALTER COLUMN Email ADD MASKED WITH (FUNCTION ='email()') para mascarar colunas de e-mail em vez de usar o mascaramento dinâmico padrão.
5. Você pode usar o mascaramento de dados de string personalizado para ocultar um número de cartão de débito em um relatório de transação, mostrando apenas os últimos dois ou quatro dígitos, como você pode ter visto em recibos de compras.
Coisas para fazer
Agora que você pode implementar todos os quatro tipos de mascaramento, tente as seguintes coisas para melhorar ainda mais suas habilidades:
1. Crie um banco de dados de exemplo seguindo o passo a passo no artigo Desenvolvimento de relatórios do SSRS em termos simples seguido pelo desenvolvimento de um relatório do SSRS que mostra apenas o primeiro caractere dos nomes dos autores, ocultando o restante usando mascaramento de dados parcial.
2. Tente criar um banco de dados de exemplo mencionado no artigo Criando e implantando várias versões de banco de dados por meio de instantâneos de esquema e, em seguida, crie um usuário de teste chamado Aluno e aplique o mascaramento de dados dinâmico adequado para ocultar as marcas de todos os alunos para esse usuário de teste.
3. Tente criar e descartar o mascaramento de dados dinâmicos para garantir que você possa adicionar e remover com êxito o mascaramento de dados dinâmicos em uma tabela SQL.