Dynamic Data Masking foi inserido no SQL Server 2016 em todas as edições e é um recurso de mascaramento de dados para pessoas não autorizadas. Por meio desta funcionalidade podemos criar máscaras em registros de determinadas colunas para ocultar o conteúdo original nelas armazenadas.
A definição de máscara de dados possui 4 tipos diferentes:
- Default: Retorna uma sequência de 4 X para textos longos e menos de 4 para quando o texto tiver menos de 4 caracteres.
ALTER TABLE ... ALTER COLUMN Sexo ADD MASKED WITH (FUNCTION = 'default()');
- Email: retorna primeira letra do e-mail seguido por uma sequência de “x” até o @. No domínio do e-mail temos outra sequência de “x” e finaliza com o sufixo fixo “.com”
ALTER TABLE ... ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
- Random: estabelece um valor de início e término aonde retornará um número aleatório estre estes limites.
ALTER TABLE ... ALTER COLUMN Dependentes ADD MASKED WITH (FUNCTION = 'random(1, 12)');
- Texto personalizado: método de mascaramento que permite expor parte do texto. A função partial([prefixo],[texto substitutivo],[sufixo]), desta forma serão exibidos os primeiro n caracteres informado no [prefixo], seguido do texto de substituição, e finaliza exibindo os m caracteres informados no [sufixo].
ALTER TABLE ... Nome varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL
Vamos a uma breve demonstração de como funciona o Dynamics Data Masking na prática. Para isto, criaremos uma tabela chamda TesteDDM com algumas colunas. Segue script de definição da tabela:
CREATE TABLE dbo.TesteDDM
(
Id INT IDENTITY(1,1) NOT NULL
CONSTRAINT PK_TesteDDM PRIMARY KEY (Id),
Nome VARCHAR(60) NOT NULL,
Sexo CHAR(1) NOT NULL,
Email VARCHAR(120) NOT NULL,
Dependentes INT
);
Em seguida adicionamos alguma informação na tabela:
INSERT INTO TesteDDM (Nome, Sexo, Email, Depedentes)
VALUES ('Rodrigo Costa', 'M', 'contato@agilidata.com.br', 1);
Ao consultarmos os registros na tabela:
Porém, surge a demanda da equipe de segurança de informação que os registros pessoais não devem estar disponíveis para qualquer pessoa que tenha acesso ao banco de dados. É preciso criar uma política para dificultar o acesso aos dados pessoais. Inicialmente devemos realizar uma ação que não traga impacto na aplicação e optaremos inicialmente pelo uso do Dynamic Data Masking.
ALTER TABLE TesteDDM ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()');
ALTER TABLE TesteDDM ALTER COLUMN Nome ADD MASKED WITH (FUNCTION = 'partial(3,"XXXXXX",2)');
ALTER TABLE TesteDDM ALTER COLUMN Sexo ADD MASKED WITH (FUNCTION = 'default()');
ALTER TABLE TesteDDM ALTER COLUMN Depedentes ADD MASKED WITH (FUNCTION = 'random(0, 10)');
Aplicamos 4 máscara de dados para cada coluna contendo informações pessoais. Agora, ao tentarmos acessar essas informações com um usuário que não tem permissão de UNMASK ele receberá como resultado:
O conteúdo original dos campos que foram mascarados não são retornado para o usuário. Ele terá acesso total apenas aos campos não mascarados, enquanto os outros ficarão com uma máscara.
Concedendo privilégio de leitura
Podemos atribuir a permissão de leitura de dados mascarados para um usuário específico. Para isto, basta concedermos a permissão de UNMASK.
GRANT UNMASK TO teste;
Agora as permissões estão disponíveis para o usuário teste.
Limitações
Atualmente não podemos aplicar o Data Masking em colunas:
- Criptogradas pelo Always Encrypted
- FILESTREAM
- COLUMN_SET ou colunas sparse
- Colunas cálculadas. Porém, caso a coluna calculada seja baseada em uma coluna já mascarada, a coluna retornará dados mascarados.
- Mascaramento de dados não substitui criptografia de dados. Ele pode ser contornado através de tentativas de leituras utilizando técnicas de brute-force.
Mesmo com os dados mascarados os usuários conseguem fazer consultas utilizando os valores originais da coluna como critério de busca.