A la hora de definir una política de seguridad para una aplicación, uno de los retos más frecuentes es limitar el acceso no autorizado a la información confidencial.
Por ejemplo, quizá quieras que tu personal de Marketing tenga acceso completo a toda la información sobre los clientes, ya sean fijos o potenciales, pero que tu departamento de finanzas solo pueda acceder a la información pertinente a los cobros o tus directivos únicamente puedan buscar sus datos de contacto.
Si alguna vez has trabajado con SQL Server en Microsoft, seguramente hayas tenido que definir la información a la que tienen acceso tus diferentes departamentos o la capacidad que tengan para editarlos.
Hoy en día, estas técnicas se conocen como Data Masking. Una técnica especialmente útil y accesible a todo tipo de empresas gracias a Dynamic Data Masking.
El Dynamic Data Masking (de ahí sus siglas DDM) es una técnica para proteger la información sensible de ojos no deseados. Te permite especificar la extensión de los datos a los que puede acceder un usuario sin los permisos necesarios.
La ventaja del DDM es que se puede aplicar en cualquier momento, incluso con una aplicación que ya esté en funcionamiento, sin necesidad de cambiar ninguna configuración u orden de acción existente.
Los cuatro tipos de datos más comunes que te interesa mantener en secreto suelen ser:
Los datos que se pueden emplear para identificar a determinados perfiles. Incluye nombres completos o números de documentos personales (DNI, carné de conducir y Seguridad Social, entre otros).
Los datos recogidos por los proveedores de servicios de salud, privados o públicos, para identificar los tratamientos necesarios. Incluye información de seguro, demográfica, resultados de test e historiales médicos.
La información que damos a las tiendas online al realizar una compra desde la web. Recae dentro de la Payment Card Industry Data Security Standard (PCIDSS) para garantizar la seguridad de los datos del titular de la tarjeta.
La información relacionada con inventos, planes de negocio, diseños y planes de construcción. Tienen muchísimo valor para una empresa y se deben proteger contra robos y acceso no autorizado.
En realidad, existen tres tipos muy habituales para enmascarar datos dentro de las bibliotecas de datos:
Una de las soluciones que recomendaríamos en el caso de que el motor de la base de datos utilizado por la aplicación sea SQL Server (muy habitual en todo tipo de sectores) sería el uso del Enmascaramiento Dinámico de Datos disponible en SQL Server en sus versiones SQL Server 2016 (13.x) y posteriores como Azure SQL Database, Azure SQL Managed Instance y Azure Synapse Analytics.
Para habilitar esta característica tan sólo tenemos que definir una máscara en función del tipo de dato de la columna.
Esta máscara se crea en la propia definición de la columna en T-SQL aplicando una función que devuelve un valor enmascarado en lugar del valor real de la columna:
Función | Tipo de Dato | Descripción | T-SQL definición Columna |
Default() | Todos | Aplica un valor por defecto a todas las columnas, en función del tipo de dato: Cadena à xxx Numéricos à 0 Fecha y Hora: 01.01.1900 00:00:00 | Teléfono varchar(20) MASKED WITH (FUNCTION = ‘default()’) |
Email() | Cadena | Muestra la primera letra del valor añadiendo el siguiente patrón: {P}xxxx@XXX.com | Email varchar(100) MASKED WITH (FUNCTION = ’email()’) |
Partial | Cadena | Muestra los N primeros caracteres y los N últimos aplicando un relleno: Rxxxxxxxo | Apellidos varchar(100) MASKED WITH (FUNCTION = ‘partial(1, “xxxxxx”, 1)’) |
Random | Numérico | Muestra un valor aleatorio dentro de un intervalo | SalarioBruto decimal (18,2) MASKED WITH (FUNCTION = ‘random(1,999999)’) |
Datetime (1) | Fecha y Hora | Enmascara la parte del día que se requiera: Año à datetime (“Y”) Mes à datetime (“M”) Dia à datetime (“D”) Hora à datetime (“h”) Minuto à datetime (“m”) Segundo à datetime (“s”) (1) Sólo disponible en Sql Server 2022 | FechaNacimiento ADD MASKED WITH (FUNCTION = ‘datetime(“M”)’) |
DDM dispone de la opción de otorgar diferentes niveles de permisos de visualización de los valores no enmascarados con diferentes granularidades: Base de Datos, Schema, Tabla e incluso de columna:
Nivel | T-SQL |
Base de Datos | GRANT UNMASK TO {Usuario}; |
Schema | GRANT UNMASK ON SCHEMA::{Schema} TO {Usuario} |
Tabla | GRANT UNMASK ON {Schema.Tabla} TO {Usuario}; |
Columna | GRANT UNMASK ON {Schema.Tabla}(Columna) TO {Usuario} |
En el portal de Azure, dentro del menú de opciones de la administración de una base de datos SQL Server, disponemos de la opción de ‘Enmascaramiento dinámico de datos’. Nos permite realizar de forma muy simple la administración de las máscaras para cualquier columna existente, sin tener que conocer la sintáxis T-SQL que hemos visto anteriormente:
Al pulsar en la acción (2) ‘Agregar máscara’, Azure nos presentará una pantalla dónde podremos crear la máscara seleccionando previamente el Schema, Tabla y Columna. La acción (3) presentará la misma pantalla preseleccionando los valores anteriores, a partir de la columna sugerida.
En la pantalla finalmente nos presentarán la lista de formatos disponibles en función del tipo de dato de la columna:
Tipo de Formato | Tipo de Dato | Pantalla |
Valor Predeterminado | Todos | ![]() |
Tarjeta Crédito | Cadena | ![]() |
Correo electrónico | Cadena | ![]() |
Rango aleatorio | Numérico | ![]() |
Cadena personalizada | Cadena | ![]() |
Vamos a observar un ejemplo de DDM con todos los ejemplos que hemos descrito en la tabla anterior
En primer lugar, creamos la tabla de Empleados; enmascarando las diferentes columnas que hemos visto:
Un usuario con permiso de SELECT y UNMASK sobre esa tabla, obtendría los siguientes valores:
En cambio, un usuario con permiso de SELECT, pero sin permiso de UNMASK obtendría las mismas filas, pero con los valores enmascarados en cada una de las columnas definidas con máscara dinámica, aplicando a cada columna la función de enmascaramiento establecida:
Aquí te dejamos el mismo ejemplo descrito en texto con las partes más importantes destacadas
CREATE TABLE Empleados (
EmpleadoID int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
Nombre varchar(50) MASKED WITH (FUNCTION = 'partial(1, "xx", 1)') NULL,
Apellidos varchar(50) MASKED WITH (FUNCTION = 'partial(1, "xxxxxx", 1)') NULL,
Telefono varchar(12) MASKED WITH (FUNCTION = 'default()') NULL,
Email varchar(50) MASKED WITH (FUNCTION = 'email()') NOT NULL,
SalarioBruto decimal(18,2) MASKED WITH (FUNCTION = 'random(1, 999999)') NULL
);
INSERT INTO Empleados (Nombre, Apellidos, Telefono, Email, SalarioBruto)
VALUES
('Antonio', 'González López', '612999888', 'antonio.gonzalez@contoso.es', 2000),
('Juan', 'Valdés Rovira', '612444555', 'juan.valdes@contoso.com', 2500),
('Luis', 'Torres Sánchez', '612333222', 'luis.torres@contoso.net', 3000)
CREATE USER MaskingTestUser WITHOUT LOGIN;
GRANT SELECT ON SCHEMA::dbo TO MaskingTestUser;
EXECUTE AS USER = 'MaskingTestUser';
SELECT * FROM dbo.Empleados
CREATE TABLE Empleados
(
UsuarioID int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
Nombre varchar(50) NULL,
Apellidos varchar(50) NULL,
Telefono varchar(12) NULL,
Email varchar(50) NOT NULL,
FechaNacimiento datetime NULL,
IBAN varchar(50) NULL,
SalarioBruto decimal(18,2) NULL
);
INSERT INTO Empleados (Nombre, Apellidos, Telefono, Email, FechaNacimiento, IBAN, SalarioBruto)
VALUES
('Antonio', 'González López', '612999888', 'antonio.gonzalez@contoso.es', '1990-07-11', 'ES0220958524201618721727', 2000),
('Juan', 'Valdés Rovira', '612444555', 'juan.valdes@contoso.com', '1980-01-29', 'ES6320804148384145618563', 2500),
('Luis', 'Torres Sánchez', '612333222', 'luis.torres@contoso.net', '1985-06-15', 'ES9201826168304876446786', 3000)
Para terminar, podemos comentar algunas ventajas del DDM que hemos visto a lo largo del artículo:
También es importante aclarar que el enmascaramiento dinámico utilizado de forma aislada no garantiza totalmente la protección de la información confidencial. Es recomendable emplear herramientas para administrar adecuadamente los permisos en la base de datos aplicando siempre el principio de otorgar los mínimos permisos requeridos, habilitando otros mecanismos de seguridad como la Auditoria y el Cifrado.
Si quieres conocer más sobre como aprovechar tus técnicas de DDM dentro de las suites de Microsoft, contacta con nosotros.