Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Mascaramento dinâmico de dados no SQL Server para iniciantes


O artigo apresenta os conceitos básicos de mascaramento de dados dinâmicos (DDM) no SQL Server juntamente com sua visão geral com suporte em um exemplo simples de implementação de mascaramento de dados. Além disso, os leitores vão se familiarizar com os benefícios do mascaramento dinâmico de dados. Este artigo também destaca a importância do mascaramento de dados nas tarefas de desenvolvimento de banco de dados do dia a dia, quando alguns campos devem ser mascarados devido à sua natureza sensível para cumprir as práticas padrão.

Sobre o mascaramento de dados


Vejamos os conceitos básicos de mascaramento de dados e a disponibilidade desse recurso no SQL Server.

Definição simples


O mascaramento de dados é um método de ocultar dados total ou parcialmente, dificultando o reconhecimento ou a compreensão dos dados após a aplicação do mascaramento.

Definição da Microsoft


De acordo com a documentação da Microsoft, o mascaramento de dados dinâmicos (DDM) limita a exposição de dados confidenciais mascarando-os para usuários não privilegiados.

O que são dados confidenciais


Por dados sensíveis, queremos dizer quaisquer dados que contenham informações privadas, de identificação pessoal, financeiras ou de segurança que, se reveladas, podem ser usadas indevidamente ou prejudicar a reputação de uma organização.

Exemplo de dados confidenciais


Um bom exemplo de dados confidenciais é um número de cartão de débito armazenado em um banco de dados que deve ser protegido contra qualquer uso não autorizado. Outro bom exemplo de dados confidenciais é o endereço de e-mail pessoal que pode identificar facilmente uma pessoa.

Usuários não privilegiados


Qualquer usuário de banco de dados que não tenha permissão para ver os dados confidenciais é considerado um usuário sem privilégios.

Mascaramento de Dados Dinâmicos (DDM)


O recurso de mascaramento de dados suportado pelo SQL Server é conhecido como mascaramento de dados dinâmico, também referenciado como DDM na documentação da Microsoft. Em outras palavras, a Microsoft se refere ao mascaramento de dados como mascaramento de dados dinâmicos no SQL Server.

Compatibilidade


De acordo com a documentação da Microsoft, o recurso de mascaramento de dados dinâmicos é suportado pelas seguintes versões do SQL Server:
1. SQL Server 2016 e versões posteriores
2. Banco de Dados SQL do Azure
3. Azure SQL Data Warehouse
Portanto, se você ainda não começou a usar o(s) banco(s) de dados SQL do Azure, precisará do SQL Server 2016 mínimo para usar o recurso de mascaramento de dados dinâmico.

Configurando o mascaramento de dados dinâmico


O mascaramento dinâmico de dados pode ser configurado simplesmente usando comandos T-SQL.
A implementação do mascaramento dinâmico de dados é feita por meio de script T-SQL para evitar que usuários não autorizados visualizem dados confidenciais.

Benefícios do mascaramento de dados dinâmico


Finalmente, vamos passar por alguns dos principais benefícios do mascaramento dinâmico de dados, mas antes disso, gostaria de perguntar aos iniciantes em SQL e não aos profissionais de SQL, quais são os benefícios das restrições de integridade?
Vamos considerar um exemplo de uma restrição de chave que garante que a coluna na qual ela é aplicada tenha valores distintos (sem duplicatas). Se eu posso impor valores de coluna distintos no momento da entrada de dados em meu aplicativo front-end, por que devo me preocupar em aplicá-lo por meio de um banco de dados aplicando uma restrição de chave exclusiva?
A resposta é garantir as regras (restrições de integridade ) permanecem consistentes e são controlados centralmente. Eu tenho que fazer isso em um nível de banco de dados, caso contrário talvez eu tenha que escrever o código para impor valores exclusivos em todos os aplicativos presentes e futuros que acessam o banco de dados.
O mesmo é verdadeiro para o mascaramento de dados dinâmico, pois define o mask em uma coluna em um nível de banco de dados para que não haja necessidade de realizar nenhum mascaramento adicional (código) pelos aplicativos que acessam o banco de dados.

O mascaramento de dados dinâmico tem os seguintes benefícios em relação às abordagens tradicionais:
1. O mascaramento dinâmico de dados implementa a política centralizada de ocultar ou alterar os dados confidenciais em um banco de dados que é herdado por qualquer aplicativo que deseje acessar os dados.
2. O mascaramento de dados dinâmicos no SQL Server pode ajudar a gerenciar usuários com privilégios para ver os dados confidenciais e os usuários que não estão autorizados a vê-los.
3. Tem uma implementação simples na forma de script T-SQL.


Implementação do mascaramento dinâmico de dados


Antes de implementarmos o mascaramento de dados dinâmicos, precisamos entender os tipos de mascaramento de dados dinâmicos que podem ser aplicados a uma coluna em uma tabela de um banco de dados SQL ou SQL do Azure.

Tipos de máscaras de dados


Existem quatro tipos de máscaras de dados que podemos aplicar a uma coluna:
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 personalizada(s)
Neste artigo, vamos nos concentrar no tipo de mascaramento de dados padrão.

Aplicando máscaras de dados dinâmicas


As máscaras de dados dinâmicas podem ser aplicadas a uma coluna de uma tabela das seguintes maneiras:
1. Ao criar uma nova tabela
2. Alterando uma tabela já criada para aplicar mascaramento de dados à(s) sua(s) coluna(s)

Configurar banco de dados de amostra


Vamos criar um banco de dados de exemplo chamado SQLDevBlogV5 executando o seguinte script T-SQL:
-- Create sample database (SQLDevBlogV5)
CREATE DATABASE SQLDevBlogV5;
GO


USE SQLDevBlogV5;

-- (1) Create Article table in the sample database
CREATE TABLE Article (
  ArticleId INT PRIMARY KEY IDENTITY (1, 1)
 ,Category	VARCHAR(50)
 ,Author VARCHAR(50)
 ,Title VARCHAR(150)
 ,Published DATETIME2
 ,Notes VARCHAR(400)  
)

GO

-- (2) Populating Article table
SET IDENTITY_INSERT [dbo].[Article] ON
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (1, N'Development', N'Atif', N'Introduction to T-SQL Programming ', N'2017-01-01 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (2, N'Testing', N'Peter', N'Database Unit Testing Fundamentals', N'2017-01-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (3, N'DLM', N'Sadaf', N'Database Lifecycle Management for beginners', N'2017-01-20 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (4, N'Development', N'Peter', N'Common Table Expressions (CTE)', N'2017-02-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (5, N'Testing', N'Sadaf', N'Manual Testing vs. Automated Testing', N'2017-03-20 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (6, N'Testing', N'Atif', N'Beyond Database Unit Testing', N'2017-11-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (7, N'Testing', N'Sadaf', N'Cross Database Unit Testing', N'2017-12-20 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (8, N'Development', N'Peter', N'SQLCMD - A Handy Utitliy for Developers', N'2018-01-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (9, N'Testing', N'Sadaf', N'Scripting and Testing Database for beginners ', N'2018-02-15 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (10, N'Development', N'Atif', N'Advanced Database Development Methods', N'2018-07-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (11, N'Testing', N'Sadaf', N'How to Write Unit Tests for your Database', N'2018-11-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (12, N'Development', N'Peter', N'Database Development using Modern Tools', N'2018-12-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (13, N'DLM', N'Atif', N'Designing, Developing and Deploying Database ', N'2019-01-01 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (14, N'DLM', N'Peter', N'How to Apply Database Lifecycle Management  ', N'2019-02-10 00:00:00', NULL)
SET IDENTITY_INSERT [dbo].[Article] OFF

Use a seguinte consulta para visualizar os artigos:
-- View articles 
SELECT
  [a].[ArticleId]
 ,[a].[Category]
 ,[a].[Author]
 ,[a].[Title]
 ,[a].[Published]
 ,[a].[Notes]
FROM dbo.Article A

Requisito comercial para mascarar nomes de autores


Agora suponha que você receba um requisito de negócios que afirma que os nomes dos autores devem ser mascarados devido à confidencialidade dessas informações. A melhor maneira de atender a esse requisito comercial é mascarar a coluna Nome usando o DDM.

Ocultar nomes de autores


Vamos alterar a tabela para adicionar a função de mascaramento de dados da seguinte forma:
-- Masking Author column
ALTER TABLE Article
ALTER COLUMN [Author] varchar(50) MASKED WITH (FUNCTION = 'default()');

Verificando o status de mascaramento


Você pode verificar o status do mascaramento de dados dinâmicos a qualquer momento usando o seguinte script T-SQL fornecido na documentação da Microsoft:
-- Checking dynamic data masking status
SELECT c.name, tbl.name as 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;

A saída nos mostra quais colunas foram mascaradas com sucesso:


Verificação de dados


Agora verifique os dados consultando os 5 principais registros da tabela onde aplicamos o mascaramento:
-- View top 5 artices records
SELECT TOP 5
  [a].[ArticleId]
 ,[a].[Category]
 ,[a].[Author]
 ,[a].[Title]
 ,[a].[Published]
 ,[a].[Notes]
FROM dbo.Article A
ORDER BY a.ArticleId

A saída não parece estar nos mostrando o resultado esperado:



Como você pode ver, apesar de termos mascarado a coluna Author, ela ainda está mostrando seus valores reais. A razão por trás desse comportamento é que a conta que usamos para aplicar o mascaramento dinâmico de dados tem privilégios elevados e é por isso que os dados mascarados ficam visíveis em sua forma original quando consultamos a tabela usando a conta atual.
A solução é para criar um novo usuário com permissão Selecionar.

Criando um usuário com permissão Selecionar na tabela


Vamos agora criar um novo usuário de banco de dados sem login tendo apenas a permissão Selecionar na tabela Artigo da seguinte forma:
-- Create ArticleUser to have Select access to Article table
CREATE USER ArticleUser WITHOUT LOGIN;  
GRANT SELECT ON Article TO ArticleUser;

Visualizando os 5 principais artigos como ArticleUser


Em seguida, execute a instrução Select para obter os 5 principais artigos usando o usuário recém-criado ArticleUser apenas com permissão de seleção:
-- Execute SELECT Article as ArtilceUser
EXECUTE AS USER = 'ArticleUser';  

-- View artices 
SELECT TOP 5
  [a].[ArticleId]
 ,[a].[Category]
 ,[a].[Author]
 ,[a].[Title]
 ,[a].[Published]
 FROM dbo.Article A
ORDER BY a.ArticleId

-- Revert the User back to what user it was before
REVERT;



Parabéns! Você mascarou com sucesso a coluna Autor conforme o requisito.

Descartando coluna mascarada


Você pode descartar o mascaramento de dados dinâmicos na coluna que você aplicou antes simplesmente emitindo o seguinte comando T-SQL:
-- Removing dynamic data masking on Author column
ALTER TABLE Article   
ALTER COLUMN Author DROP MASKED;

Por favor, mantenha contato, pois um uso mais avançado de mascaramento de dados dinâmico está a caminho no próximo artigo.

Coisas para fazer


Agora que você pode mascarar colunas de uma tabela em um banco de dados, tente as seguintes coisas para melhorar ainda mais suas habilidades:
1. Tente mascarar a coluna Categoria no banco de dados de amostra.
2. Tente criar a tabela Author com as colunas AuthorId, Name e Email e, em seguida, passe AuthorId como uma chave estrangeira na tabela Article e, em seguida, aplique o mascaramento de dados dinâmico nas colunas Name e Email da tabela Author criando um 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