L'articolo introduce le nozioni di base sul Dynamic Data Masking (DDM) in SQL Server insieme alla sua panoramica supportata da un semplice esempio di implementazione del Data Masking. Inoltre, i lettori acquisiranno familiarità con i vantaggi del mascheramento dinamico dei dati. Questo documento sottolinea anche l'importanza del mascheramento dei dati nelle attività quotidiane di sviluppo del database quando alcuni campi devono essere mascherati a causa della loro natura sensibile per conformarsi alle pratiche standard.
Informazioni sul mascheramento dei dati
Esaminiamo i concetti di base del mascheramento dei dati e la disponibilità di questa funzionalità in SQL Server.
Definizione semplice
Il mascheramento dei dati è un metodo per nascondere i dati completamente o parzialmente, rendendo così difficile il riconoscimento o la comprensione dei dati dopo l'applicazione del mascheramento.
Definizione Microsoft
Secondo la documentazione Microsoft, il Dynamic Data Masking (DDM) limita l'esposizione dei dati sensibili mascherandoli agli utenti non privilegiati.
Che cosa sono i dati sensibili
Per dati sensibili si intende qualsiasi dato che contenga informazioni private, di identificazione personale, finanziarie o di sicurezza che, se rivelate, possono essere utilizzate in modo improprio o danneggiare la reputazione di un'organizzazione.
Esempio di dati sensibili
Un buon esempio di dati sensibili è un numero di carta di debito memorizzato in un database che deve essere protetto da qualsiasi uso non autorizzato. Un altro buon esempio di dati sensibili è l'indirizzo email personale che può facilmente identificare una persona.
Utenti non privilegiati
Qualsiasi utente del database a cui non è consentito visualizzare i dati sensibili è considerato un utente non privilegiato.
Dynamic Data Masking (DDM)
La funzionalità di mascheramento dei dati supportata da SQL Server è nota come mascheramento dinamico dei dati, indicato anche come DDM nella documentazione Microsoft. In altre parole, Microsoft fa riferimento al data masking come al data masking dinamico in SQL Server.
Compatibilità
Secondo la documentazione Microsoft, la funzionalità di mascheramento dinamico dei dati è supportata dalle seguenti versioni di SQL Server:
1. SQL Server 2016 e versioni successive
2. Database SQL di Azure
3. Azure SQL Data Warehouse
Quindi, se non hai ancora iniziato a usare i database SQL di Azure, devi avere almeno SQL Server 2016 per usare la funzionalità di mascheramento dinamico dei dati.
Configurazione di Dynamic Data Masking
Il mascheramento dinamico dei dati può essere configurato semplicemente utilizzando i comandi T-SQL.
L'implementazione del mascheramento dinamico dei dati viene eseguita tramite script T-SQL per impedire agli utenti non autorizzati di visualizzare dati sensibili.
Vantaggi del Dynamic Data Masking
Infine, esaminiamo alcuni vantaggi chiave del mascheramento dinamico dei dati, ma prima vorrei chiedere ai principianti di SQL, non ai professionisti di SQL, quali sono i vantaggi dei vincoli di integrità?
Consideriamo un esempio di univoco vincolo chiave che garantisce che la colonna su cui è applicato abbia valori distinti (nessun duplicato). Se posso imporre valori di colonna distinti al momento dell'immissione dei dati nella mia applicazione front-end, perché dovrei preoccuparmi di applicarlo tramite un database applicando un vincolo di chiave univoco?
La risposta è garantire le regole (vincoli di integrità ) rimangono coerenti e sono controllati centralmente. Devo farlo a livello di database, altrimenti potrei dover scrivere il codice per imporre valori univoci in tutte le applicazioni presenti e future che accedono al database.
Lo stesso vale per il mascheramento dinamico dei dati poiché definisce il mask su una colonna a livello di database, quindi non è necessario eseguire alcun mascheramento aggiuntivo (codice) da parte delle applicazioni che accedono al database.
Il mascheramento dinamico dei dati presenta i seguenti vantaggi rispetto agli approcci tradizionali:
1. Il mascheramento dinamico dei dati implementa la politica centralizzata di nascondere o modificare i dati sensibili in un database ereditato da qualsiasi applicazione desideri accedere ai dati.
2. Il mascheramento dinamico dei dati in SQL Server consente di gestire gli utenti con privilegi per visualizzare i dati sensibili e gli utenti che non sono autorizzati a visualizzarli.
3. Ha una semplice implementazione sotto forma di script T-SQL.
Implementazione del mascheramento dinamico dei dati
Prima di implementare il mascheramento dinamico dei dati, è necessario comprendere i tipi di mascheramento dinamico dei dati che possono essere applicati a una colonna in una tabella di un database SQL o SQL di Azure.
Tipi di maschere dati
Esistono quattro tipi di data mask che possiamo applicare a una colonna:
1. Maschere dati predefinite
2. Maschere dati parziali
3. Maschere dati casuali
4. Maschere dati personalizzate
In questo articolo, ci concentreremo sul tipo di mascheramento dati predefinito.
Applicazione di maschere dati dinamiche
Le maschere dati dinamiche possono essere applicate a una colonna di una tabella nei seguenti modi:
1. Quando si crea una nuova tabella
2. Modifica di una tabella già creata per applicare il data masking alle sue colonne
Imposta database di esempio
Creiamo un database di esempio denominato SQLDevBlogV5 eseguendo il seguente 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
Utilizza la seguente query per visualizzare gli articoli:
-- View articles SELECT [a].[ArticleId] ,[a].[Category] ,[a].[Author] ,[a].[Title] ,[a].[Published] ,[a].[Notes] FROM dbo.Article A
Requisito aziendale per mascherare i nomi degli autori
Supponiamo ora di ricevere un requisito aziendale in cui si afferma che i nomi degli autori devono essere mascherati a causa della sensibilità di queste informazioni. Il modo migliore per soddisfare questo requisito aziendale è mascherare la colonna Nome utilizzando DDM.
Mascherare i nomi degli autori
Modificheremo la tabella per aggiungere la funzione di mascheramento dei dati come segue:
-- Masking Author column ALTER TABLE Article ALTER COLUMN [Author] varchar(50) MASKED WITH (FUNCTION = 'default()');
Controllo dello stato di mascheramento
Puoi controllare lo stato di mascheramento dei dati dinamici in qualsiasi momento utilizzando il seguente script T-SQL fornito nella documentazione 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;
L'output ci mostra quali colonne sono state mascherate correttamente:
Controllo dati
Ora controlla i dati interrogando i primi 5 record della tabella in cui abbiamo applicato il mascheramento:
-- 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
L'output non sembra mostrarci il risultato atteso:
Come puoi vedere, nonostante il fatto che abbiamo mascherato la colonna Autore, mostra ancora i suoi valori effettivi. Il motivo alla base di questo comportamento è che l'account che abbiamo utilizzato per applicare il mascheramento dinamico dei dati ha privilegi elevati ed è per questo che i dati mascherati sono visibili nella loro forma originale quando interroghiamo la tabella utilizzando l'account corrente.
La soluzione è per creare un nuovo utente con autorizzazione Seleziona.
Creazione di un utente con autorizzazione Seleziona sulla tabella
Creiamo ora un nuovo utente del database senza un login che abbia solo l'autorizzazione Seleziona sulla tabella Articolo come segue:
-- Create ArticleUser to have Select access to Article table CREATE USER ArticleUser WITHOUT LOGIN; GRANT SELECT ON Article TO ArticleUser;
Visualizzazione dei primi 5 articoli come ArticleUser
Quindi, esegui l'istruzione Select per ottenere i primi 5 articoli utilizzando l'utente ArticleUser appena creato con solo autorizzazione select:
-- 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;
Congratulazioni! Hai mascherato con successo la colonna Autore come richiesto.
Eliminazione della colonna mascherata
Puoi eliminare il mascheramento dinamico dei dati sulla colonna che hai applicato in precedenza semplicemente emettendo il seguente comando T-SQL:
-- Removing dynamic data masking on Author column ALTER TABLE Article ALTER COLUMN Author DROP MASKED;
Rimani in contatto poiché un uso più avanzato del mascheramento dinamico dei dati è in arrivo nel prossimo articolo.
Cose da fare
Ora che puoi mascherare le colonne di una tabella in un database, prova le seguenti cose per migliorare ulteriormente le tue abilità:
1. Prova a mascherare la colonna Categoria nel database di esempio.
2. Prova a creare una tabella Autore con le colonne AuthorId, Name ed Email, quindi passa AuthorId come chiave esterna nella tabella Article e quindi applica il mascheramento dinamico dei dati alle colonne Name ed Email della tabella Author creando un utente di prova
3. Prova a creare e rilasciare il mascheramento dei dati dinamici per assicurarti di poter aggiungere e rimuovere correttamente il mascheramento dei dati dinamici su una tabella SQL