A l’hora de definir una política de seguretat per a una aplicació, un dels reptes més freqüents és limitar l’accés no autoritzat a la informació confidencial.
Per exemple, potser vols que el teu personal de Màrqueting tingui accés complet a tota la informació sobre els clients, ja siguin fixos o potencials, però que el teu departament de finances només pugui accedir a la informació pertinent als cobraments o als teus directius només puguin buscar els seus dades de contacte.
Si mai has treballat amb SQL Server a Microsoft, segurament has hagut de definir la informació a què tenen accés els teus diferents departaments o la capacitat que tinguin per editar-los.
Avui dia, aquestes tècniques es coneixen com a Data Masking. Una tècnica especialment útil i accessible a tota mena d’empreses gràcies a Dynamic Data Masking.
El Dynamic Data Masking (d’aquí les sigles DDM) és una tècnica per protegir la informació sensible d’ulls no desitjats. Et permet especificar l’extensió de les dades a què pot accedir un usuari sense els permisos necessaris.
L’avantatge del DDM és que es pot aplicar en qualsevol moment, fins i tot amb una aplicació que ja estigui en funcionament, sense necessitat de canviar cap configuració o ordre d’acció existent.
Els quatre tipus de dades més comunes que t’interessa mantenir en secret solen ser:
Les dades que es poden emprar per identificar determinats perfils. Inclou noms complets o números de documents personals (DNI, carnet de conduir i Seguretat Social, entre d’altres).
Les dades recollides pels proveïdors de serveis de salut, privats o públics, per identificar els tractaments necessaris. Inclou informació de seguretat, demogràfica, resultats de test i historials mèdics.
La informació que donem a les botigues online en fer una compra des de la web. Recau dins de la Payment Card Industry Data Security Standard (PCIDSS) per garantir la seguretat de les dades del titular de la targeta.
La informació relacionada amb invents, plans de negoci, dissenys i plans de construcció. Tenen moltíssim valor per a una empresa i s’han de protegir contra robatoris i accés no autoritzat.
En realitat, hi ha tres tipus molt habituals per emmascarar dades dins de les biblioteques de dades:
Una de les solucions que recomanaríem en el cas que el motor de la base de dades utilitzat per l’aplicació sigui SQL Server (molt habitual en tot tipus de sectors) seria l’ús de l’Emmascarament Dinàmic de Dades disponible a SQL Server a les seves versions SQL Server 2016 (13.x) i posteriors com Azure SQL Database, Azure SQL Managed Instance i Azure Synapse Analytics.
Per habilitar aquesta característica només cal definir una màscara en funció del tipus de dada de la columna.
Aquesta màscara es crea a la pròpia definició de la columna a T-SQL aplicant una funció que torna un valor emmascarat en lloc del valor real de la columna:
Funció | Tipus de Dada | Descripció | T-SQL definició Columna |
Default() | Tots | Aplica un valor per defecte a totes les columnes, segons el tipus de dada: Cadena à xxx Numèrics à 0 Data i Hora: 01.01.1900 00:00:00 | Telèfon varchar(20) MASKED WITH (FUNCTION = ‘default()’) |
Email() | Cadena | Mostra la primera lletra del valor afegint el patró següent: {P}xxxx@XXX.com | Email varchar(100) MASKED WITH (FUNCTION = ’email()’) |
Partial | Cadena | Mostra els N primers caràcters i els N últims aplicant un farciment: Rxxxxxxxo | Cognoms varchar(100) MASKED WITH (FUNCTION = ‘partial(1, “xxxxxx”, 1)’) |
Random | Numeric | Mostra un valor aleatori dins d’un interval | SalariBrut decimal (18,2) MASKED WITH (FUNCTION = ‘random(1,999999)’) |
Datetime (1) | Data i Hora | Emmascara la part del dia que es requereixi: Any à datetime (“Y”) Mes à datetime (“M”) Dia à datetime (“D”) Hora à datetime (“h”) Minut à datetime (“m”) Segon à datetime (“s”) (1) Només disponible a SQL Server 2022 | DataNaixement ADD MASKED WITH (FUNCTION = ‘datetime(“M”)’) |
DDM disposa de l’opció d’atorgar diferents nivells de permisos de visualització dels valors no emmascarats amb diferents granularitats: Base de Dades, Schema, Taula i fins i tot de columna:
Nivell | T-SQL |
Base de Dades | GRANT UNMASK TO {Usuario}; |
Schema | GRANT UNMASK ON SCHEMA::{Schema} TO {Usuario} |
Taula | GRANT UNMASK ON {Schema.Tabla} TO {Usuario}; |
Columna | GRANT UNMASK ON {Schema.Tabla}(Columna) TO {Usuario} |
Al portal d’Azure, dins del menú d’opcions de l’administració d’una base de dades SQL Server, disposem de l’opció emmascarament dinàmic de dades. Ens permet realitzar de forma molt simple l’administració de les màscares per a qualsevol columna existent, sense haver de conèixer la sintàxi T-SQL que hem vist anteriorment:
En prémer l’acció (2) ‘Agregar màscara’, Azure ens presentarà una pantalla on podrem crear la màscara seleccionant prèviament el Schema, Taula i Columna. L’acció (3) presentarà la mateixa pantalla preseleccionant els valors anteriors a partir de la columna suggerida.
A la pantalla finalment ens presentaran la llista de formats disponibles en funció del tipus de dada de la columna:
Tipus de Format | Tipus de Dada | Pantalla |
Valor Predeterminat | Tots | ![]() |
Targeta de Crèdit | Cadena | ![]() |
Correu electrònic | Cadena | ![]() |
Rang aleatori | Numèric | ![]() |
Cadena personalitzada | Cadena | ![]() |
Observem un exemple de DDM amb tots els exemples que hem descrit a la taula anterior.
En primer lloc, creem la taula d’Empleats; emmascarant les diferents columnes que hem vist:
Un usuari amb permís de SELECT i UNMASK sobre aquesta taula obtindria els següents valors:
En canvi, un usuari amb permís de SELECT, però sense permís d’UNMASK obtindria les mateixes files, però amb els valors emmascarats a cadascuna de les columnes definides amb màscara dinàmica, aplicant a cada columna la funció d’emmascarament establerta:
Aquí us deixem el mateix exemple descrit en text amb les parts més importants destacades
CREATE TABLE Empleats (
EmpleatID int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
Nom varchar(50) MASKED WITH (FUNCTION = 'partial(1, "xx", 1)') NULL,
Cognoms varchar(50) MASKED WITH (FUNCTION = 'partial(1, "xxxxxx", 1)') NULL,
Telefon varchar(12) MASKED WITH (FUNCTION = 'default()') NULL,
Email varchar(50) MASKED WITH (FUNCTION = 'email()') NOT NULL,
SalariBrut decimal(18,2) MASKED WITH (FUNCTION = 'random(1, 999999)') NULL
);
INSERT INTO Empleats (Nom, Cognoms, Telefon, Email, SalariBrut)
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 Empleats
(
UsuariID int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
Nom varchar(50) NULL,
Cognoms varchar(50) NULL,
Telefon varchar(12) NULL,
Email varchar(50) NOT NULL,
DataNaixement datetime NULL,
IBAN varchar(50) NULL,
SalariBrut decimal(18,2) NULL
);
INSERT INTO Empleats (Nom, Cognoms, Telefon, Email, DataNaixement, IBAN, SalariBrut)
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)
Per acabar, podem comentar alguns avantatges del DDM que hem vist al llarg de l’article:
També és important aclarir que l’emmascarament dinàmic utilitzat de manera aïllada no garanteix totalment la protecció de la informació confidencial. És recomanable emprar eines per administrar adequadament els permisos a la base de dades aplicant sempre el principi d’atorgar els mínims permisos requerits, habilitant altres mecanismes de seguretat com l’Auditoria i el Xifratge.
Si vols conèixer més sobre com aprofitar les teves tècniques de DDM dins de les suites de Microsoft, contacta amb nosaltres.