Una excelente alternativa para el cumplimiento de las normas GDPR sin modificar aplicaciones

El enmascaramiento dinámico de datos (DDM) limita la exposición de información confidencial al ocultarla a los usuarios sin privilegios. Se puede usar para simplificar considerablemente el diseño y la codificación de la seguridad en la aplicación.

El enmascaramiento dinámico de datos evita el acceso no autorizado a información confidencial permitiendo que los clientes especifiquen la cantidad de información confidencial que se debe revelar, con un impacto mínimo en la capa de aplicación. DDM se puede configurar en los campos de la base de datos designada para ocultar información confidencial en los conjuntos de resultados de consultas. Con DDM no se modifican los datos en la base de datos. El enmascaramiento dinámico de datos resulta fácil de usar con las aplicaciones existentes, ya que las reglas de enmascaramiento se aplican en los resultados de la consulta. Muchas aplicaciones pueden enmascarar información confidencial sin modificar las consultas existentes.

  • Una directiva de enmascaramiento de datos central actúa directamente en los campos confidenciales de la base de datos.
  • Designe roles o usuarios con privilegios que tienen acceso a la información confidencial.
  • DDM cuenta con funciones de enmascaramiento total y parcial, además de una máscara aleatoria para datos numéricos.
  • Comandos Transact-SQL simples definen y administran las máscaras.

Por ejemplo, un técnico de soporte técnico de un centro de llamadas puede identificar al autor de la llamada mediante varios dígitos de su número del seguro social o de una tarjeta de crédito. Los números del seguro social o los números de una tarjeta de crédito no deben mostrarse por completo al técnico de soporte técnico. Puede definir una regla de enmascaramiento enmascare todos los dígitos, excepto los cuatro últimos, de cualquier número del seguro social o de una tarjeta de crédito en el conjunto de resultados de cualquier consulta. Por poner otro ejemplo, si utiliza la máscara de datos adecuada para proteger la información de identificación personal, un desarrollador puede realizar consultas en los entornos de producción para resolver problemas sin que ello suponga una infracción de las normativas de cumplimiento.

La finalidad del enmascaramiento dinámico de datos consiste en limitar la exposición de la información confidencial, con lo que se impide que los usuarios vean datos a los que no deberían poder acceder. El enmascaramiento dinámico de datos no pretende evitar que los usuarios de la base de datos se conecten directamente a ella y ejecuten consultas exhaustivas que expongan información confidencial. El enmascaramiento dinámico de datos se complementa con otras características de seguridad de SQL Server (auditoría, cifrado, seguridad de nivel de fila…), y resulta muy recomendable usarlo con esas características para proteger mejor la información confidencial en la base de datos.

El enmascaramiento dinámico de datos está disponible en SQL Server 2016 (13.x) y en Base de datos SQL de Azure, y se configura con comandos Transact-SQL .

Definición de una máscara dinámica de datos

Es posible definir una regla de enmascaramiento en una columna de una tabla, con el objetivo de ofuscar los datos de esa columna. Existen cuatro tipos de máscaras.

Función Descripción
Valor predeterminado Enmascaramiento completo de acuerdo con los tipos de datos de los campos designados.

Para los tipos de datos String, use XXXX o un número menor de X si el tamaño del campo es inferior a 4 caracteres (charnchar,varcharnvarchartextntext).

Para los tipos de datos numéricos, use un valor cero (bigintbitdecimalintmoneynumericsmallintsmallmoneytinyintfloatreal).

En el caso de los tipos de datos de fecha y hora, use 01.01.1900 00:00:00.0000000 (datedatetime2datetimedatetimeoffsetsmalldatetimetime).

En lo que respecta a los tipos de datos binarios, use un solo byte de valor 0 de ASCII (binaryvarbinaryimage).

Email Método de enmascaramiento que expone la primera letra de una dirección de correo electrónico y el sufijo constante “.com”, en el formato de una dirección de correo electrónico. Columnas en la tabla de origen capturadasaXXX@XXXX.com
Aleatorio Una función de enmascaramiento aleatorio que se puede usar con cualquier tipo numérico a fin de enmascarar el valor original con uno aleatorio dentro de un intervalo especificado.
Cadena personalizada Método de enmascaramiento que expone la primera y última letra y agrega una cadena de relleno personalizada en el medio.prefix,[padding],suffix

Nota: Si el valor original es demasiado corto como para que se complete toda la máscara, no se expondrá parte del prefijo o sufijo.

Procedimientos recomendados y casos de uso habituales

  • La creación de una máscara en una columna no impide que se efectúen actualizaciones en ella. De modo que, aunque los usuarios recibirán datos enmascarados cuando realicen una consulta en una columna enmascarada, ellos mismos podrán actualizar los datos si cuentan con permisos de escritura. Aun así, se debe usar una directiva de control de acceso adecuada para limitar los permisos de actualización.
  • Si se utiliza SELECT INTOo INSERT INTO para copiar datos de una columna enmascarada en otra tabla, se generarán datos enmascarados en la tabla de destino.
  • Se aplica el enmascaramiento dinámico de datos al ejecutar la importación y exportación de SQL Server. Una base de datos que contenga columnas enmascaradas dará como resultado un archivo de datos exportado con los datos enmascarados y la base de datos importada contendrá datos enmascarados de forma estática.

Realización de consultas en columnas enmascaradas

La vista sys.masked_columns permite realizar consultas de las columnas y tablas que tengan aplicada la función de enmascaramiento. Esta vista se hereda de la vista sys.columns . Devuelve todas las columnas de la vista sys.columns , junto con las columnas is_masked y masking_function . Además, indica si estas están enmascaradas y, en caso afirmativo, qué función de enmascaramiento se ha definido. Esta vista solo muestra las columnas en las que se ha aplicado la función de enmascaramiento.

SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function 

FROM sys.masked_columns AS c 

JOIN sys.tables AS tbl  

    ON c.[object_id] = tbl.[object_id] 

WHERE is_masked = 1;

Limitaciones y restricciones

No se puede definir una regla de enmascaramiento para los siguientes tipos de columnas:

  • Columnas cifradas (siempre cifradas)
  • FILESTREAM
  • COLUMN_SET o una columna dispersa que forme parte de un conjunto de columnas.
  • No se puede configurar una máscara en una columna calculada, pero si esta última depende de otra con una máscara, entonces la columna calculada devolverá datos enmascarados.
  • Una columna con enmascaramiento de datos no puede ser una clave para un índice FULLTEXT.

Para los usuarios sin el permiso UNMASK , las instrucciones en desuso READTEXTUPDATETEXTWRITETEXT no funcionan adecuadamente en una columna configurada para el enmascaramiento dinámico de datos.

Ejemplos

CREATE TABLE Ejemplo 

  (CodeID int IDENTITY PRIMARY KEY, 

   FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)') NULL, 

   LastName varchar(100) NOT NULL, 

   Phone varchar(12) MASKED WITH (FUNCTION = 'default()') NULL, 

   Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL); 




INSERT Ejemplo (FirstName, LastName, Phone, Email) VALUES  

('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com'), 

('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co'), 

('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net'); 




SELECT * FROM Ejemplo;

El resultado demuestra que las máscaras funcionan, ya que cambia los datos de esto:

1 Roberto Tamburello 555.123.4567 RTamburello@contoso.com

A esto

1 RXXXXXXX Tamburello xxxx RXXX@XXXX.com

Adición o edición de una máscara en una columna existente

Utilice la instrucción ALTER TABLE para agregar una máscara a una columna existente de la tabla o a fin de editarla en dicha columna.
En el siguiente ejemplo se agrega la función de enmascaramiento a la columna LastName :

ALTER TABLE Ejemplo  
ALTER COLUMN LastName ADD MASKED WITH (FUNCTION = 'partial(2,"XXX",0)');

 

Anulación de una máscara dinámica de datos

La siguiente instrucción anula la máscara de la columna LastName creada en el ejemplo anterior:

ALTER TABLE Membership  

ALTER COLUMN LastName DROP MASKED;