Protegendo seus dados com MSSQL – Parte 3

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.

Material de referência

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *