[T-SQL] Dynamic Data Mask

Fala Galera,

Mascaramento de dados vem se tornando uma necessidade cada vez maior para empresas que armazenam informações sensíveis;(CPF, CNH, Número de Passaporte etc). Exibir estas informações para todos os usuários da sua aplicação pode levar a implicações jurídicas e muita dor de cabeça.

Para nos apoiar com esta demanda, o  SQL Server 2016 introduziu uma nova feature a “Dynamic Data Masking” que tem como objetivo mascarar dados para usuários que não tenham direto de vê-los, limitando a quantidade de dados sensíveis expostos.
Por ser uma configuração realizada somente a nível de banco de dados, ou seja, totalmente transparente para a cada da aplicação, o Data Masking pode, além de ser efetivo, economizar muito esforço do time de desenvolvimento.

Existem quatro tipos de mascaras disponíveis:

  1. Default: Máscara aplicada para todo o valor contido no campo.
  2. E-mail: Preparado para que apenas a primeira letra do endereço de e-mail e o sulfixo “.com” sejam exibidos.
  3. Random: Exibe um valor  inteiro randomico
  4. Custom String: Definido pelo usuário

Hands On

Para nossa demo vamos usar a base de dados de exemplo da Microsoft. Se você ainda não tem o AdventureWorks2016: Click Aqui

Você precisará estar logado como sysadmin do SQL para os primeiros passos (ficará claro o porquê em alguns instantes)

 

Para deixar as coisas um pouco mais simples, vamos fazer um select * into em uma nova entidade e depois usa-la para a demo.

use AdventureWorks2016CTP3
GO
SELECT P.FirstName, P.LastName, B.EmailAddress, PN.PhoneNumber
INTO PERSON.BLOG_PIROTO_TB1
FROM PERSON.Person P
JOIN PERSON.EmailAddress B ON P.BusinessEntityID = B.BusinessEntityID
JOIN Person.PersonPhone PN ON P.BusinessEntityID = PN.BusinessEntityID

Faça um select na nossa nova tabela e veja como estão os dados

capturar

Agora que carregamos os dados para nossa tabela PERSON.BLOG_PIROTO_TB1, vamos adicionar mascaras a seus campos.

ALTER TABLE PERSON.BLOG_PIROTO_TB1 ALTER COLUMN LASTNAME ADD MASKED WITH (FUNCTION = 'default()')

ALTER TABLE PERSON.BLOG_PIROTO_TB1 ALTER COLUMN emailAddress ADD MASKED WITH (FUNCTION = 'email()')

ALTER TABLE PERSON.BLOG_PIROTO_TB1 ALTER COLUMN FirstName ADD MASKED WITH (FUNCTION = 'partial(2, "BL-Piroto-X", 2)')

No total estamos usando três tipos diferentes de mascaramento:

  1. Default na coluna LASTNAME
  2. Email na coluna EMAILADDRESS
  3. Custom na coluna FIRSTNAME

Faça um select na tabela e vamos ver o que mudou nos dados

capturar

Os dados continuam os mesmos? Sem mascara nenhuma?
Bem, como eu disse no início do post, a ideia aqui é que os dados sensíveis não sejam apresentados para usuários que não devem ter acesso.
Se você está conectado com uma conta de ADM você terá aceso aos dados sem máscara. (Se   é uma premissa proteger seus dados, inclusive do DBA, você pode partir para outras features de criptografia como, por exemplo, o Always Encrypted.

Vamos criar um usuário com privilégios inferiores e ver como os dados são mostrados

CREATE LOGIN SUPORTE WITH PASSWORD = 'IXn*321Mnn#'
CREATE USER SUPORTE FOR LOGIN SUPORTE
ALTER AUTHORIZATION ON SCHEMA::person TO [suporte]

Faça o login com o novo usuário “suporte” e refaça o select na tabela PERSON.BLOG_PIROTO_TB1

capturar

Agora sim 🙂
Todas as máscaras estão configuradas conforme fizemos no segundo passo.

OBS: Mesmo que o usuário faça um select * into em uma nova entidade, os dados serão armazenados tal qual o retorno do select.

Se você precisar remover uma máscara ou conceder/revogar a permissão de um usuário (não ADM) a ver o dado original, faça o seguinte:

--remover máscara
ALTER TABLE PERSON.BLOG_PIROTO_TB1 ALTER COLUMN FIRSTNAME DROP MASKED
--Permissionamento
GRANT UNMASK TO SUPORTE
REVOKE UNMASK TO SUPORTE

Por fim, para descobrir quais colunas do seu banco possuem a feature de masking habilitada, há uma nova DMV chamada: SYS.MASKED_COLUMNS

SELECT
 OBJECT_NAME(A.OBJECT_ID) AS TABELA,
 A.NAME COLUNA,
 A.MASKING_FUNCTION MASCARA
FROM SYS.MASKED_COLUMNS A

Espero que, depois desse overview, vocês possam ter uma ideia de como implementar e obter vantagens dessa feature de mascaramento de dados no SQL Server 2016.

por agora é isso.

[]’s

Piroto

 

Anúncios

Sobre dhiegopiroto
Graduando em Sistemas de Informação, apaixonado por tecnologia, literatura e musica. Possui experiencia com desenvolvimento em T-SQL, XML, XSD e administração de bancos de dados SQL Server; Detém os titulos de MCP e MCTS SQL Server 2008.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Alex Souza

Banco de dados, Business Intelligence, Big Data, Governança de TI ... /* Um eterno aprendiz... */

Blog - Thiago Carlos de Alencar

Aprendendo SQL Server !

SQL Authority with Pinal Dave

SQL Server Performance Tuning Expert

Vitor Fava

SELECT (CrazyIdeas*2), (InsaneIdeas*100), MyExperience FROM MyBigHead WHERE InsaneLevel > 1000

Think Think SQL

DBCC DumpMemory 'TECH','ALL'

Gustavo Maia Aguiar

Artigos, dicas e algumas reflexões sobre o SQL Server

Kimberly L. Tripp

DBCC DumpMemory 'TECH','ALL'

Thiago Zavaschi R2

www.zavaschi.com

Blog do Luti

DBCC DumpMemory 'TECH','ALL'

Luan.Moreno a.k.a [SQL.Soul]

Lead Database Consultant at Pythian

Blog do Leka

let's make things better

%d blogueiros gostam disto: