Dynamic Data Masking en SQL Server

Dynamic Data Masking

SQL Server desde la versión 2016 incluye una nueva característica de enmascaramiento de datos dinámico que permite dar cierto grado de seguridad para poder cambiar los caracteres que se visualizan por
caracteres diferentes.

Conceptos básicos

  • El enmascaramiento dinámico de datos ayuda a evitar el acceso no autorizado a datos confidenciales al permitir que los clientes designen qué cantidad de datos confidenciales se revelarán con un impacto mínimo en la capa de aplicación.
  • El DDM se puede configurar en la base de datos para ocultar datos confidenciales en los conjuntos de resultados de consultas en los campos de la base de datos designados, mientras que los datos en la base de datos no se modifican.
  • El enmascaramiento dinámico de datos es fácil de usar con las aplicaciones existentes,
  • ya que las reglas de enmascaramiento se aplican en los resultados de la consulta.



Tipos de datos

DDM presenta cuatro tipos de enmascaramiento dinámico de datos, los que se manejan de acuerdo a funciones

  • Default
  • Email
  • Random
  • Cadena personalizada

Default

Enmascaramiento completo según los tipos de datos de los campos designados.

  • Para los tipos de datos de cadena, usa XXXX o menos X si el tamaño del campo es inferior a 4 caracteres (char, nchar, varchar, nvarchar, text, ntext).
  • Para los tipos de datos numéricos usa un valor cero (bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real).
  • Para los tipos de datos de fecha y hora, usa 01.01.1900 00: 00: 00.0000000 (Date, datetime2, datetime, datetimeoffset, smalldatetime, time).
  • Para los tipos de datos binarios, usa un solo byte de valor ASCII 0 (binario, varbinary, imagen)

Ejemplos
Al definir la columna:
Telefono nvarchar(12) MASKED WITH (FUNCTION = ‘default ()’) NULL
Modificar una columna
ALTER COLUMN Sexo ADD MASKED WITH (FUNCTION = ‘default ()’)

Email

Método de enmascaramiento que expone la primera letra de una dirección de correo electrónico y el sufijo constante «.com», en forma de una dirección de correo electrónico. . aXXX@XXXX.com.

Ejemplo
Al definir la columna
CorreoElectronico nvarchar(100) MASKED WITH (FUNCTION = ‘email ()’) NULL
Modificar la columna
ALTER COLUMN CorreoElectronico ADD MASKED WITH (FUNCTION = ‘email ()’)

Random

Una función de enmascaramiento aleatorio para usar en cualquier tipo numérico para enmascarar el valor original con un valor aleatorio dentro de un rango específico.

Ejemplos
Al definir la columna
NumeroCuenta bigint MASKED WITH (FUNCTION = ‘random ([rango inicial], [rango final])’)
Modificando la columna
ALTER COLUMN Mes ADD MASKED WITH (FUNCTION = ‘random (1, 12)’)

Cadena personalizada

Método de enmascaramiento que expone la primera y la última letra y agrega una cadena de relleno personalizada en el medio. prefijo, [relleno], sufijo Si el valor original es demasiado corto para completar toda la máscara, parte del prefijo o sufijo no se expondrá.
Ejemplos
Al definir la columna
EmpleadoNombre nvarchar(100) MASKED WITH (FUNCTION = ‘parcial (2, «XXXXXX», 1)’) NULL
Modificando la columna
ALTER COLUMN Fono Add Masked with (FUNCTION = ‘parcial (1, «XXXXXXX», 0)’)
ALTER COLUMN Telefono Add Masked with (FUNCTION= ‘parcial (5, «XXXXXXX», 0)’)
ALTER COLUMN NumeroSeguro Add Masked with (FUNCTION = ‘parcial (0, «XXX-XX -«, 4)’)



Permisos

Para poder realizar el DDM se deben tener los siguientes permisos:

  • CREATE TABLE y ALTER Table
  • Alter any mask, Alter table para agregar, reemplazar o eliminar la máscara de una columna.
  • Select para ver los datos
  • Las columnas que se definen como enmascaradas, mostrarán los datos enmascarados.
  • Conceda el permiso UNMASK a un usuario para que pueda recuperar los datos enmascarados de las
  • columnas para las que se define el enmascaramiento.
  • CONTROL en la base de datos incluye el permiso ALTER ANY MASK como UNMASK.

Ejercicio

Se creará una base de datos, luego una tabla para Empleados.

Create database BaseDDM
go
use BaseDDM
go

— Crear la tabla (Ver Creación de tablas)
Create table Empleados
(
EmpleadosCodigo nchar(6),
EmpleadosPaterno nvarchar(100) masked with (Function = ‘partial(1,»XXXXX»,4)’) not null,
EmpleadosMaterno nvarchar(100) masked with (Function = ‘partial(4,»XXXXX»,2)’) not null,
EmpleadosNombres nvarchar(100) not null,
EmpleadosEmail nvarchar(70) masked with (function = ‘email()’),
EmpleadosDireccion nvarchar(200) constraint EmpleadosDireccionDF default ‘Sin especificar’,
constraint EmpleadosPK primary key (EmpleadosCodigo)
)
go

— Insertar registros (Ver Insertar registros)
insert into Empleados values
(‘FG0059′,’Luque’,’Sánchez’, ‘Fernando’,’fls2307@hotmail.com’,’Av. República de Panamá 404′),
(‘GT7794′,’Villacorta’,’Alvarado’, ‘Carlos Ernesto’,’cevillacortaalva@gmail.com’,’Av. Brasil 3434′),
(‘UK4886′,’Mendoza’,’Huamán’, ‘Ingrid’,’jfiis_ert@hotmail.com’,’Av. Los Alamos 557′),
(‘BT6644′,’Solano’,’Villavicencio’, ‘Esmeralda Lizeth’,’esmelisolano@hotmail.com’,’Bolivar 3994′),
(‘ED5567′,’Montenegro’,’Gimenez’, ‘Julio César’,’jcmontenegro234@hotmail.com’,’Av. Javier Prado 4344′),
(‘WJ4468′,’Bocanegra’,’Pereda’, ‘Oscar’,’oscarbocanegra333@hotmail.com’,’Sucre 3995′)
go

— Ver los datos
select * from Empleados
go
— Crear un usuario sólo con permiso para ver los datos (Ver Creación de usuarios)
Create user Pepe without login
go
— Asignar el permiso (Ver Permisos)
Grant select on Object::dbo.Empleados to Pepe
go
— Ejecutar el select como Pepe
Execute (‘select * from Empleados’) as user = ‘Pepe’
go


— Crear un usuario sólo con permiso para ver los datos (Ver Creación de usuarios)
Create user Pepe without login
go
— Asignar el permiso (Ver Permisos)
Grant select on Object::dbo.Empleados to Pepe
go
— Ejecutar el select como Pepe
Execute (‘select * from Empleados’) as user = ‘Pepe’
go

Puede ver el resultado en la siguiente imagen:

Note los campos Paterno, Materno y Email enmascarados.

— Eliminar el DDM del campo Email
Alter table Empleados Alter column EmpleadosEmail Drop Masked
go
— Ejecutar el select como Pepe
Execute (‘select * from Empleados’) as user = ‘Pepe’
go

Ahora se muestra el correo de cada empleado sin enmascarar

Note el Email sin enmascarar

— Agregar una máscara
Alter table Empleados alter column EmpleadosDireccion
add masked with (Function = ‘partial(1,»XXXXXXXXXXXXXXXXXXXXXXXX»,3)’)
go
— Ejecutar el select como Pepe
Execute (‘select * from Empleados’) as user = ‘Pepe’
go

Dirección con DDM

— Agregar un campo EmpleadosSueldo con DDM con tipo Random
Alter table Empleados add EmpleadosSueldo Numeric(9,2)
masked with (Function = ‘Random(1000,4000)’)
go
— Actualizar el sueldo del empleado con código BT6644 a 2500
Update Empleados set EmpleadosSueldo = 2500
where EmpleadosCodigo = ‘BT6644’
go
— Ver los datos
select * from Empleados
go
— Ejecutar el select como Pepe
Execute (‘select * from Empleados’) as user = ‘Pepe’
go

Puede ver el sueldo cambiado con un valor diferente.