[SQL SERVER 2016] Dynamic Data Masking

El enmascaramiento de datos dinámico (Dynamic Data Masking) permite aplicar una directiva de enmascaramiento a datos confidenciales. Por ejemplo, supongamos que tenemos una columna con la dirección de correo y queremos que los usuarios vean el correo con el formato sXXX@XXX.com

Este enmascaramiento se podría realizar a nivel de aplicación, de forma que los recuperados no estarian enmascarados y seria la aplicación la responsable de ocultar parcial o totalmente la información confidencial. El problema de esta solución es que la mascará no se aplica a nivel de datos de datos, y por tanto la información es accesible si se tiene acceso a la base de datos por medio o app.

Nota: Hay que tener en cuenta que DDM no es una una característica de seguridad. Para ello existen otras mecanismos: TDE, Allways Encrypted, Cell-Encrypted. Los cuales veremos en futuros artículos.

A partir de Sql Server 2016 se ha incluido la característica “Dynamic Data Masking” la cual permite aplicar una mascara a nivel de columna (Esta opción mejora la seguridad y simplifica el diseño de la aplicación)

Su configuración es muy simple pues basta con aplicar el modificador “MASKED” en la definición de la columna. A continuación, mostramos un ejemplo de una consulta T-SQL


CREATE TABLE dbo.PruebasDDM
    (
	Id int IDENTITY(1,1) not null,
	Nombre nvarchar(200) not null,
	FechaNacimiento datetime MASKED WITH (FUNCTION = 'default()') null,
	Telefono varchar(20) MASKED WITH (FUNCTION = 'default()') null,
	NumeroSeguimiento int MASKED WITH (FUNCTION = 'default()') null,
	DNI varchar(20) MASKED WITH (FUNCTION= 'partial(2,"###",2)') null,
    Email varchar(255) MASKED WITH (FUNCTION = 'email()') null,
	Puntos int  MASKED WITH (FUNCTION = 'random(100,1000)') not null,
	CONSTRAINT PK_PruebasDDM PRIMARY KEY CLUSTERED (Id) 
    )  ON [PRIMARY]

donde podemos ver diferentes alternativas de uso. Para personalizar la mascará, usamos el parámetro “FUNCTION”, cuyos posibles valores son:

  1. default:
    Aplica la mascara por defecto en base al tipo de datos de la columna:
    • char, nchar, varchar, nvarchar, text, ntext: muestra la cadena “XXXX” (o una más pequeña si el contenido es inferior a 4 carateres)
    • (bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real): muestra el valor 0.
  2. (date, datetime2, datetime, datetimeoffset, smalldatetime, time): muestra la fecha ’01/01/1900 0:00:00′
  3. email: enmascara direcciones de correo usando una mascara del tipo aXXXX@XXX.com
  4. random(Inicio,Fin): enmascara valores numéricos usando un valor aleatorio entre un rango.
  5. partial(prefijo,relleno,sufijo): un número caracteres iniciales y finales (prefijo y sufijo respectivamente) no son enmascarados, el resto es sustituido por la cadena de relleno

Para poder crear, modificar y eliminar mascaras es necesario disponer de los permisos “ALTER ANY MASK” y “ALTER” (sobre la tabla). Los usuario que dispongan del permiso “SELECT” podrán acceder a los datos con la mascará aplicada. Por último, el permiso “UNMASK” permite ver los datos sin mascara.

Vamos a probarlo insertando un registro en la tabla

INSERT INTO PruebasDDM (Nombre,FechaNacimiento,Telefono,NumeroSeguimiento,DNI,Email,Puntos) 
values ('Sergio Montes','01/10/1990','123123123',23232423,'555444333K','sergio@programmingapps.net',50)

Para probar el funcionamiento vamos a crear un usuario de prueba al que vamos a asignar el permiso de selección sobre la tabla “PruebasDDM”

CREATE USER UsuarioDDM WITHOUT LOGIN;  
GRANT SELECT ON PruebasDDM TO UsuarioDDM;  

Por último, vamos a lanzar una consulta de selección usando el impersonate sobre el usuario “PruebasDDM”

EXECUTE AS USER = 'UsuarioDDM';  
select * from PruebasDDM;  
REVERT;  

Antes de aplicarla, hay que tener en cuentas las siguientes restricciones:

  • Columnas cifradas usando Always Encrypted
  • FILESTREAM
  • Columna calculada
  • Columna con un indice FULLTEXT.
  • Una columna definida como COLUMN_SET (retorna todas las columnas sparse) o una columna tipo “SPARSE” que forme parte de un COLUMN_SET.

En el siguiente enlace se puede descargar el script T-SQL.