sql >> Base de Datos >  >> RDS >> Sqlserver

Enmascaramiento dinámico de datos en SQL Server para principiantes

El artículo presenta los conceptos básicos del enmascaramiento dinámico de datos (DDM) en SQL Server junto con su descripción general respaldada por un ejemplo simple de implementación de enmascaramiento de datos. Además, los lectores se familiarizarán con los beneficios del enmascaramiento dinámico de datos. Este documento también destaca la importancia del enmascaramiento de datos en las tareas diarias de desarrollo de bases de datos cuando algunos campos deben enmascararse debido a su naturaleza confidencial para cumplir con las prácticas estándar.

Acerca del enmascaramiento de datos

Repasemos los conceptos básicos del enmascaramiento de datos y la disponibilidad de esta función en SQL Server.

Definición sencilla

El enmascaramiento de datos es un método para ocultar datos total o parcialmente, lo que dificulta su reconocimiento o comprensión después de aplicar el enmascaramiento.

Definición de Microsoft

Según la documentación de Microsoft, el enmascaramiento dinámico de datos (DDM) limita la exposición de datos confidenciales al enmascararlos para usuarios sin privilegios.

Qué son los datos confidenciales

Por datos confidenciales, nos referimos a cualquier dato que contenga información privada, de identificación personal, financiera o de seguridad que, si se revela, puede usarse indebidamente o dañar la reputación de una organización.

Ejemplo de datos confidenciales

Un buen ejemplo de datos confidenciales es un número de tarjeta de débito almacenado en una base de datos que debe protegerse de cualquier uso no autorizado. Otro buen ejemplo de datos confidenciales es la dirección de correo electrónico personal que puede identificar fácilmente a una persona.

Usuarios sin privilegios

Cualquier usuario de la base de datos que no tenga permiso para ver los datos confidenciales se considera un usuario sin privilegios.

Enmascaramiento dinámico de datos (DDM)

La función de enmascaramiento de datos admitida por SQL Server se conoce como enmascaramiento de datos dinámico y también se denomina DDM en la documentación de Microsoft. En otras palabras, Microsoft se refiere al enmascaramiento de datos como enmascaramiento de datos dinámicos en SQL Server.

Compatibilidad

Según la documentación de Microsoft, la función de enmascaramiento dinámico de datos es compatible con las siguientes versiones de SQL Server:
1. SQL Server 2016 y versiones posteriores
2. Base de datos Azure SQL
3. Azure SQL Data Warehouse
Entonces, si aún no ha comenzado a usar las bases de datos de Azure SQL, necesita SQL Server 2016 como mínimo para usar la función de enmascaramiento de datos dinámicos.

Configurar el enmascaramiento dinámico de datos

El enmascaramiento dinámico de datos se puede configurar simplemente usando comandos T-SQL.
La implementación del enmascaramiento dinámico de datos se realiza a través de secuencias de comandos T-SQL para evitar que usuarios no autorizados vean datos confidenciales.

Beneficios del enmascaramiento dinámico de datos

Finalmente, repasemos algunos beneficios clave del enmascaramiento dinámico de datos, pero antes de eso, me gustaría preguntar a los principiantes de SQL, no a los profesionales de SQL, ¿cuáles son los beneficios de las restricciones de integridad?
Consideremos un ejemplo de un único restricción clave que garantiza que la columna en la que se aplica tenga valores distintos (no duplicados). Si puedo imponer distintos valores de columna en el momento de la entrada de datos en mi aplicación front-end, ¿por qué debería molestarme en hacerlo cumplir a través de una base de datos mediante la aplicación de una restricción de clave única?
La respuesta es garantizar las reglas (restricciones de integridad ) siguen siendo coherentes y se controlan de forma centralizada. Tengo que hacer eso a nivel de base de datos, de lo contrario, es posible que deba escribir el código para imponer valores únicos en todas las aplicaciones presentes y futuras que accedan a la base de datos.
Lo mismo es cierto para el enmascaramiento dinámico de datos, ya que define el máscara en una columna a nivel de base de datos, por lo que no es necesario realizar ningún enmascaramiento adicional (código) por parte de las aplicaciones que acceden a la base de datos.

El enmascaramiento dinámico de datos tiene los siguientes beneficios sobre los enfoques tradicionales:
1. El enmascaramiento dinámico de datos implementa la política centralizada de ocultar o cambiar los datos confidenciales en una base de datos que es heredada por cualquier aplicación que desee acceder a los datos.
2. El enmascaramiento dinámico de datos en SQL Server puede ayudar a administrar usuarios con privilegios para ver los datos confidenciales y aquellos usuarios que no están autorizados para verlos.
3. Tiene una implementación simple en forma de script T-SQL.

Implementación de enmascaramiento dinámico de datos

Antes de implementar el enmascaramiento dinámico de datos, debemos comprender los tipos de enmascaramiento dinámico de datos que se pueden aplicar a una columna en una tabla de una base de datos SQL o Azure SQL.

Tipos de máscaras de datos

Hay cuatro tipos de máscaras de datos que podemos aplicar a una columna:
1. Máscara(s) de datos predeterminada(s)
2. Máscara(s) de datos parcial(es)
3. Máscara(s) de datos aleatorios
4. Máscara(s) de datos personalizada(s)
En este artículo, nos centraremos en el tipo de máscara de datos predeterminado.

Aplicación de máscaras de datos dinámicos

Las máscaras de datos dinámicos se pueden aplicar a una columna de una tabla de las siguientes maneras:
1. Al crear una nueva tabla
2. Alterar una tabla ya creada para aplicar el enmascaramiento de datos a su(s) columna(s)

Configurar base de datos de muestra

Vamos a crear una base de datos de muestra llamada SQLDevBlogV5 ejecutando el siguiente script T-SQL:

-- Create sample database (SQLDevBlogV5)
CREATE DATABASE SQLDevBlogV5;
GO


USE SQLDevBlogV5;

-- (1) Create Article table in the sample database
CREATE TABLE Article (
  ArticleId INT PRIMARY KEY IDENTITY (1, 1)
 ,Category	VARCHAR(50)
 ,Author VARCHAR(50)
 ,Title VARCHAR(150)
 ,Published DATETIME2
 ,Notes VARCHAR(400)  
)

GO

-- (2) Populating Article table
SET IDENTITY_INSERT [dbo].[Article] ON
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (1, N'Development', N'Atif', N'Introduction to T-SQL Programming ', N'2017-01-01 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (2, N'Testing', N'Peter', N'Database Unit Testing Fundamentals', N'2017-01-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (3, N'DLM', N'Sadaf', N'Database Lifecycle Management for beginners', N'2017-01-20 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (4, N'Development', N'Peter', N'Common Table Expressions (CTE)', N'2017-02-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (5, N'Testing', N'Sadaf', N'Manual Testing vs. Automated Testing', N'2017-03-20 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (6, N'Testing', N'Atif', N'Beyond Database Unit Testing', N'2017-11-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (7, N'Testing', N'Sadaf', N'Cross Database Unit Testing', N'2017-12-20 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (8, N'Development', N'Peter', N'SQLCMD - A Handy Utitliy for Developers', N'2018-01-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (9, N'Testing', N'Sadaf', N'Scripting and Testing Database for beginners ', N'2018-02-15 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (10, N'Development', N'Atif', N'Advanced Database Development Methods', N'2018-07-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (11, N'Testing', N'Sadaf', N'How to Write Unit Tests for your Database', N'2018-11-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (12, N'Development', N'Peter', N'Database Development using Modern Tools', N'2018-12-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (13, N'DLM', N'Atif', N'Designing, Developing and Deploying Database ', N'2019-01-01 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (14, N'DLM', N'Peter', N'How to Apply Database Lifecycle Management  ', N'2019-02-10 00:00:00', NULL)
SET IDENTITY_INSERT [dbo].[Article] OFF

Utilice la siguiente consulta para ver los artículos:

-- View articles 
SELECT
  [a].[ArticleId]
 ,[a].[Category]
 ,[a].[Author]
 ,[a].[Title]
 ,[a].[Published]
 ,[a].[Notes]
FROM dbo.Article A

Requisito comercial para enmascarar los nombres de los autores

Ahora suponga que recibe un requisito comercial que establece que los nombres de los autores deben ocultarse debido a la confidencialidad de esta información. La mejor manera de cumplir con este requisito empresarial es enmascarar la columna Nombre mediante DDM.

Enmascaramiento de nombres de autores

Vamos a modificar la tabla para agregar la función de enmascaramiento de datos de la siguiente manera:

-- Masking Author column
ALTER TABLE Article
ALTER COLUMN [Author] varchar(50) MASKED WITH (FUNCTION = 'default()');

Comprobación del estado de enmascaramiento

Puede verificar el estado de enmascaramiento de datos dinámicos en cualquier momento utilizando el siguiente script T-SQL que se proporciona en la documentación de Microsoft:

-- Checking dynamic data masking status
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;

El resultado nos muestra qué columnas se han enmascarado con éxito:

Comprobación de datos

Ahora verifique los datos consultando los 5 primeros registros de la tabla donde hemos aplicado el enmascaramiento:

-- View top 5 artices records
SELECT TOP 5
  [a].[ArticleId]
 ,[a].[Category]
 ,[a].[Author]
 ,[a].[Title]
 ,[a].[Published]
 ,[a].[Notes]
FROM dbo.Article A
ORDER BY a.ArticleId

La salida no parece mostrarnos el resultado esperado:

Como puede ver, a pesar de que hemos enmascarado la columna Autor, todavía muestra sus valores reales. La razón detrás de este comportamiento es que la cuenta que usamos para aplicar el enmascaramiento dinámico de datos tiene privilegios elevados y es por eso que los datos enmascarados son visibles en su forma original cuando consultamos la tabla usando la cuenta actual.
La solución es para crear un nuevo usuario con permiso Seleccionar.

Crear un usuario con permiso Seleccionar en la tabla

Ahora vamos a crear un nuevo usuario de base de datos sin inicio de sesión que solo tenga permiso de selección en la tabla de artículos de la siguiente manera:

-- Create ArticleUser to have Select access to Article table
CREATE USER ArticleUser WITHOUT LOGIN;  
GRANT SELECT ON Article TO ArticleUser;

Ver los 5 artículos principales como ArticleUser

A continuación, ejecute la instrucción Select para obtener los 5 artículos principales utilizando el usuario recién creado ArticleUser solo con permiso de selección:

-- Execute SELECT Article as ArtilceUser
EXECUTE AS USER = 'ArticleUser';  

-- View artices 
SELECT TOP 5
  [a].[ArticleId]
 ,[a].[Category]
 ,[a].[Author]
 ,[a].[Title]
 ,[a].[Published]
 FROM dbo.Article A
ORDER BY a.ArticleId

-- Revert the User back to what user it was before
REVERT;

¡Felicidades! Ha enmascarado con éxito la columna Autor según el requisito.

Descartar columna enmascarada

Puede colocar el enmascaramiento de datos dinámicos en la columna en la que lo aplicó anteriormente simplemente emitiendo el siguiente comando T-SQL:

-- Removing dynamic data masking on Author column
ALTER TABLE Article   
ALTER COLUMN Author DROP MASKED;

Manténgase en contacto, ya que en el próximo artículo se presentará un uso más avanzado del enmascaramiento dinámico de datos.

Cosas que hacer

Ahora que puede enmascarar columnas de una tabla en una base de datos, intente lo siguiente para mejorar aún más sus habilidades:
1. Intente enmascarar la columna Categoría en la base de datos de ejemplo.
2. Intente crear una tabla de autor con las columnas AuthorId, Name y Email y luego pase AuthorId como clave externa en la tabla Article y luego aplique el enmascaramiento dinámico de datos en las columnas Name y Email de la tabla Author creando un usuario de prueba
3. Intente crear y eliminar el enmascaramiento de datos dinámicos para asegurarse de que puede agregar y eliminar con éxito el enmascaramiento de datos dinámicos en una tabla SQL