Estos últimos días hemos estado viendo cómo cifrar y enmascarar datos confidenciales en SQL Server y cómo clasificar los datos en función de su tipología y confidencialidad. Hemos tenido mucha teoría sobre el tema así que hoy vamos con unas aplicaciones prácticas algo distintas que no se suelen ver pero que me parecen muy interesantes. En concreto vamos a tratar de combinar los conceptos de DDM con el resultado de nuestra clasificación de datos.
Clasificación de los datos.
Data Classification es una herramienta que nos permite etiquetar los datos sensibles o confidenciales de nuestras tablas y columnas, asignándoles un nivel de sensibilidad y un tipo de información. De esta forma, podemos identificar fácilmente qué datos requieren una mayor protección y cómo gestionarlos adecuadamente.
Como ejemplo vamos a usar la base de datos AdventureWorks2022, El asistente de clasificación de datos nos ha revelado que la base de datos tiene 32 columnas confidenciales según el RGPD así que las clasificamos como tal.

Enmascarando datos confidenciales
Ya tenemos los datos clasificados, pero eso no es suficiente. También tenemos que asegurarnos de que solo las personas autorizadas puedan acceder a ello. Para ello, podemos usar dos funcionalidades muy potentes de SQL Server: Always Encrypted y el enmascaramiento dinámico de datos (DDM). DDM es una función de SQL Server que te permite ocultar o enmascarar los datos sensibles cuando los consultas, sin modificar los datos reales en la base de datos. De esta forma, puedes limitar la exposición de tus datos a usuarios no autorizados o aplicaciones externas. Vamos a usar esta para el ejemplo.
Localizando las columnas afectadas
Nuestra idea es construir una consulta SQL que genere el enmascaramiento DDM para las consultas confidenciales. Lo primero que necesitaremos será localizar las columnas que tenemos que enmascarar con una consulta SQL. Por suerte para nosotros esta consulta está directamente disponible en la documentación
SELECT
schema_name(O.schema_id) AS schema_name,
O.NAME AS table_name,
C.NAME AS column_name,
information_type,
label,
rank,
rank_desc
FROM sys.sensitivity_classifications sc
JOIN sys.objects O
ON sc.major_id = O.object_id
JOIN sys.columns C
ON sc.major_id = C.object_id AND sc.minor_id = C.column_id

Enmascarando las consultas con DDM
Con la consulta anterior, ya podremos crear una consulta dinámica para aplicar reglas de enmascaramiento a todas las columnas en función de su tipo:
WITH ConfidentialData AS (
SELECT
schema_name(O.schema_id) AS schema_name,
O.NAME AS table_name,
C.NAME AS column_name,
information_type,
label,
rank,
rank_desc
FROM sys.sensitivity_classifications sc
JOIN sys.objects O ON sc.major_id = O.object_id
JOIN sys.columns C ON sc.major_id = C.object_id AND sc.minor_id = C.column_id)
SELECT
'ALTER TABLE ' + QUOTENAME(schema_name) + '.' + QUOTENAME(table_name) + ' ALTER COLUMN ' + QUOTENAME(column_name) + ' ADD MASKED WITH (FUNCTION = '
+ CASE
WHEN information_type = 'Name' THEN '''partial(1,"xxxx",0)'''
WHEN information_type = 'Contact Info' THEN '''default()'''
WHEN information_type = 'Credentials' THEN '''default()'''
WHEN information_type = 'Credit Card' THEN '''default()'''
WHEN information_type = 'Date Of Birth' THEN '''default()'''
WHEN information_type = 'Financial' THEN '''default()'''
WHEN information_type = 'National ID' THEN '''default()'''
END + ');' AS DDL,*
FROM ConfidentialData

Resultado
Ahora toda persona que carezca del permiso unmask no podrá ver los datos confidenciales y verá las máscaras que hemos asignado. Os dejo un ejemplo:

Auditar lecturas de datos confidenciales
Es probable que, por temas regulatorios, se nos pida llevar un control sobre los accesos a datos confidenciales. Para ello podemos combinar la auditoría de SQL Server con las columnas que hemos clasificado con el asistente de clasificación de datos.
La auditoría nos permite crear un registro detallado de todas las operaciones que se realizan sobre los datos clasificados, incluyendo el usuario, la aplicación, la fecha, la hora, el tipo de acción y los datos afectados. Así, podemos monitorizar el uso de los datos sensibles y detectar posibles amenazas o fugas de información.
Para crear una auditoría de lecturas sobre los datos clasificados, tenemos que seguir estos pasos:
- Crear un grupo de auditoría en el nivel del servidor, especificando el destino donde se almacenarán los registros (un archivo, una tabla o el registro de eventos de Windows).
- Crear una especificación de auditoría en el nivel de la base de datos, asociándola al grupo de auditoría creado y seleccionando las tablas o columnas que queremos auditar (por ejemplo, las que tienen datos clasificados).
- Habilitar el grupo de auditoría y las especificaciones de auditoría creadas.
Como habrás podido notar los pasos son los mismos que para una auditoría normal, no tienes que hacer nada más. SQL Server reconocerá las columnas clasificadas como confidenciales y mostrará en la auditoría el tipo de información a la que se ha accedido de esta manera:

Conclusión
Hemos visto un par de formas de ir más allá en la protección de nuestros datos confidenciales pero no son las únicas. Podemos combinar el uso de las vistas del catálogo de datos clasificados con nuestras propias consultas para hacer todo lo que nos podamos imaginar. Podríamos crear una consulta que cree automáticamente Always Encrypted para una mayor seguridad por ejemplo. A partir de aquí el límite lo ponéis vosotros. Como siempre os digo para cualquier duda os dejo a vuestra disposición los comentarios, mi Twitter o mi mail.

