Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Mascheramento dinamico dei dati in SQL Server per utenti avanzati

Questo articolo offre una comprensione di alto livello del data masking dinamico in SQL Server insieme ai casi d'uso, alle procedure consigliate e alle implicazioni sulla sicurezza per gli utenti SQL avanzati (inclusi sviluppatori e tester). Inoltre, i lettori di questo articolo acquisiranno familiarità con l'applicazione di diversi tipi di mascheramento dinamico dei dati. L'articolo sottolinea inoltre l'importanza dell'uso di livello avanzato del mascheramento dei dati nelle attività quotidiane di sviluppo e test del database.

Prerequisiti

Esaminiamo prima i prerequisiti per questo articolo.

Famiglianza con T-SQL

Questo articolo presuppone che i lettori conoscano bene gli script T-SQL e possano scrivere ed eseguire comodamente query SQL per visualizzare e manipolare i database SQL.

Nozioni di base sul mascheramento dinamico dei dati

Questo articolo presuppone inoltre che i lettori conoscano i concetti di base del mascheramento dinamico dei dati in SQL Server. Fare riferimento all'articolo Mascheramento dei dati in SQL Server per i principianti per acquisire familiarità con le basi del mascheramento dinamico dei dati se non l'hai ancora fatto.

Database SQL di Azure o compatibilità con SQL Server 2016

La funzionalità di mascheramento dei dati dinamici è disponibile in SQL Server 2016 tramite SQL Server 2019, pertanto si consiglia vivamente di disporre di una delle seguenti opzioni:
1. Database SQL di Azure
2. SQL Server 2016 installato in locale o in remoto.

Configurazione del database di esempio

Ricordarsi di creare un database di esempio utilizzando il seguente script T-SQL compatibile con SQL Server 2016 o come database SQL di Azure se si desidera seguire la procedura dettagliata in questo articolo:

-- Create sample database ITSalesV2
CREATE DATABASE ITSalesV2;
GO

USE [ITSalesV2]

-- (2) Create MonthlySale table
CREATE TABLE [dbo].[MonthlySale](
	[SaleId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
	[SellingDate] [datetime2](7) NULL,
	[Customer] [varchar](50) NULL,
	[Email] [varchar] (200) NULL,
	[Product] [varchar](150) NULL,
	[TotalPrice] [decimal](10, 2) NULL,
)


-- (2) Populate monthly sale table
SET IDENTITY_INSERT [dbo].[MonthlySale] ON
INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (1, N'2019-05-01 00:00:00', N'Asif', N'[email protected]', N'Dell Laptop', CAST(300.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (2, N'2019-05-02 00:00:00', N'Mike',N'[email protected]', N'Dell Laptop', CAST(300.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (3, N'2019-05-02 00:00:00', N'Adil',N'[email protected]',N'Lenovo Laptop', CAST(350.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (4, N'2019-05-03 00:00:00', N'Sarah',N'[email protected]', N'HP Laptop', CAST(250.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (5, N'2019-05-05 00:00:00', N'Asif', N'[email protected]', N'Dell Desktop', CAST(200.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (6, N'2019-05-10 00:00:00', N'Sam',N'[email protected]', N'HP Desktop', CAST(300.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (7, N'2019-05-12 00:00:00', N'Mike',N'[email protected]', N'iPad', CAST(250.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (8, N'2019-05-13 00:00:00', N'Mike',N'[email protected]', N'iPad', CAST(250.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (9, N'2019-05-20 00:00:00', N'Peter',N'[email protected]', N'Dell Laptop', CAST(350.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (10, N'2019-05-25 00:00:00', N'Peter',N'[email protected]', N'Asus Laptop', CAST(400.00 AS Decimal(10, 2)))
SET IDENTITY_INSERT [dbo].[MonthlySale] OFF

Controllo dei dati

Controllare il database di esempio appena creato e popolato ITSalesV2 eseguendo il seguente script:

-- View monthly sales data
SELECT
  s.SaleId
 ,s.SellingDate
 ,s.Customer
 ,s.Email
 ,s.Product
 ,s.TotalPrice
FROM dbo.MonthlySale s

L'output è il seguente:

Creazione di un utente senza privilegi

Crea un utente senza privilegi senza login che disponga solo dell'autorizzazione SELECT nella tabella MonthlySale che vedrà i dati mascherati come prerequisito per questo articolo. Usa il seguente script per farlo:

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

Creazione di una procedura per verificare lo stato di mascheramento

Questo articolo presuppone inoltre che nel database di esempio sia presente una procedura memorizzata che mostra lo stato di mascheramento dinamico dei dati delle colonne nelle tabelle del database:

-- Stored procedure to check dynamic data masking status
CREATE PROC ShowMaskingStatus
AS
BEGIN
SET NOCOUNT ON 
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;
END

Tipi di mascheramento dati dinamico

Esistono quattro tipi comuni di mascheramento dati dinamico in SQL Server:
1. Maschere dati predefinite
2. Maschere dati parziali
3. Maschere dati casuali
4. Maschera/e di dati di stringhe personalizzate
Implementeremo ora tutti e quattro i tipi comuni di mascheramento di dati dinamici.

Implementazione del mascheramento dati predefinito

Il data masking predefinito nasconde completamente una colonna da un utente non autorizzato coprendo tutti i valori della colonna con un carattere speciale, rendendo molto difficile indovinare il contenuto della colonna.

Requisiti aziendali

Supponiamo ora di ricevere un requisito aziendale in cui si afferma che gli indirizzi e-mail dei clienti devono essere completamente nascosti (mascherati) a causa della sensibilità di queste informazioni.
Il modo migliore per soddisfare questo requisito aziendale è mascherare la colonna Email utilizzando il Dynamic Data Masking (DDM).

Mascheramento dati predefinito indirizzo e-mail

Modificheremo la tabella per mascherare gli indirizzi e-mail come segue:

--Default dynamic data masking of Email column 
ALTER TABLE MonthlySale
ALTER COLUMN Email varchar(200) MASKED WITH (FUNCTION = 'default()');

Controllo dello stato di mascheramento

Verificare lo stato di mascheramento dati dinamico utilizzando la procedura memorizzata seguente basata su uno script T-SQL a cui si fa riferimento nella documentazione Microsoft:

-- Checking dynamic data masking status
EXEC ShowMaskingStatus

L'output ci mostra quali colonne sono state mascherate correttamente:

Visualizzazione della colonna e-mail come utente dati

Quindi, esegui l'istruzione Seleziona per visualizzare le vendite mensili (tabella) come utente con privilegi bassi chiamato DataUser che ha solo l'autorizzazione selezionata sulla tabella come segue:

-- Execute SELECT as DataUser
EXECUTE AS USER = 'DataUser';  

-- View monthly sales 
SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s

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

L'output è il seguente:

Implementazione del mascheramento parziale dei dati

Il mascheramento parziale dei dati, come suggerisce il nome, nasconde parzialmente una colonna dalla visualizzazione da parte di un utente non autorizzato coprendo parte dei valori della colonna con caratteri speciali rendendo il contenuto della colonna alquanto leggibile ma comunque difficile da indovinare.

Requisiti aziendali

Pensa ora a un requisito aziendale in cui ti è stato chiesto di nascondere parzialmente il nome dei clienti in modo tale che rimanga visibile solo il primo carattere del nome. Il modo migliore per soddisfare questo requisito aziendale è mascherare la colonna Cliente utilizzando il mascheramento dinamico parziale dei dati.

Mascheramento parziale dei dati dei nomi dei clienti

Modificheremo la tabella per mascherare parzialmente la colonna Cliente come segue:

-- Partial data masking of Customer names
ALTER TABLE MonthlySale
ALTER COLUMN [Customer] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')

Controllo dello stato di mascheramento

Verifica lo stato di mascheramento dinamico dei dati:

-- Checking dynamic data masking status
EXEC ShowMaskingStatus

L'output ci mostra quali colonne sono state mascherate correttamente:

Visualizzazione della Colonna Cliente come Utente Dati

Visualizza la tabella come utente di prova DataUser che deve vedere i dati mascherati:

-- Execute SELECT as DataUser
EXECUTE AS USER = 'DataUser';  

-- View monthly sales as DataUser
SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s

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

L'output è il seguente:

Implementazione del mascheramento casuale dei dati

Il mascheramento dei dati casuali nasconde una colonna in modo casuale da un utente non autorizzato coprendo una colonna in base a un intervallo di valori, rendendo molto difficile indovinare il contenuto della colonna. Ricorda che il tipo di mascheramento dei dati casuali è applicabile solo alle colonne che memorizzano solo numeri e può essere specificato fornendo un intervallo per la randomizzazione.

Requisiti aziendali

Si riceve un requisito aziendale in cui si afferma che il prezzo del prodotto deve essere mascherato con un intervallo casuale di numeri in modo che gli utenti con privilegi bassi non debbano conoscere i prezzi esatti del prodotto per motivi di privacy. Il modo migliore per soddisfare questa specifica aziendale è mascherare la colonna TotalPrice utilizzando il mascheramento dei dati dinamici casuali.

Random Data Masking della colonna TotalPrice

Modifica la tabella MonthlySale per mascherare TotalPrice in modo casuale come segue:

--Random dynamic data masking of TotalPrice column 
ALTER TABLE MonthlySale
ALTER COLUMN [TotalPrice] decimal(10,2) MASKED WITH (FUNCTION = 'random(1, 12)')

Controllo dello stato di mascheramento

Verificare lo stato di mascheramento dinamico dei dati eseguendo la seguente procedura memorizzata:

-- Checking dynamic data masking status
EXEC ShowMaskingStatus

L'output mostra quali colonne sono state mascherate correttamente:

Visualizzazione della colonna TotalPrice come DataUser

Visualizza la tabella come DataUser ora:

-- Execute SELECT as DataUser
EXECUTE AS USER = 'DataUser';  

-- View monthly sales 
SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice from dbo.MonthlySale s

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

L'output è il seguente:

Ricorda che l'output potrebbe differire per la colonna con mascheramento dati casuali a causa della generazione di numeri casuali.

Implementazione del mascheramento dei dati di stringhe personalizzate

Il mascheramento dei dati delle stringhe personalizzate, come suggerisce il nome, aggiunge un carattere personalizzato per nascondere una colonna rendendo molto difficile indovinarne il contenuto. Ricorda che il mascheramento dei dati della stringa personalizzata viene utilizzato insieme al mascheramento dei dati parziale personalizzando il carattere per mascherare i valori effettivi della colonna. In altre parole, il mascheramento dei dati delle stringhe personalizzate è una forma avanzata di mascheramento dei dati parziale.

Requisiti aziendali

Considera un requisito aziendale per mostrare solo il primo e l'ultimo carattere della colonna Prodotto mentre il resto dei caratteri deve essere nascosto o mascherato con trattini (-). Il modo migliore per soddisfare questa specifica aziendale è mascherare la colonna Prodotto utilizzando il mascheramento dati dinamico parziale con la stringa personalizzata richiesta.

Mascheramento dei dati della stringa del cliente dei dati di vendita

Modifica la tabella Vendita mensile per mascherare la colonna Prodotto come segue:

--Custom string dynamic data masking of Product column 
ALTER TABLE MonthlySale
ALTER COLUMN [Product] ADD MASKED WITH (FUNCTION = 'partial(1,"---",1)')

Controllo dello stato di mascheramento

Vale la pena controllare lo stato di mascheramento dei dati dinamici a questo punto utilizzando il seguente script:

-- Checking dynamic data masking status
EXEC ShowMaskingStatus

L'output mostra tutte le colonne su cui è stato applicato correttamente il mascheramento dati dinamico come mostrato di seguito:

Visualizzazione della colonna del prodotto come DataUser

Visualizza la tabella come DataUser ora:

-- Execute SELECT as DataUser
EXECUTE AS USER = 'DataUser';  

-- View monthly sales 
SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice from dbo.MonthlySale s

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

L'output è il seguente:

Congratulazioni! Hai implementato con successo tutte e quattro le tecniche di mascheramento.
Fai riferimento all'articolo Mascheramento dei dati in SQL Server per i principianti per eliminare i tipi di mascheramento dei dati applicati.

Migliori pratiche

Ricorda le seguenti cose:
1. Il mascheramento dinamico dei dati non protegge né crittografa i dati della colonna, pertanto non dovrebbe essere utilizzato a tale scopo.
2. Il potenziale utente che dovrebbe vedere i dati mascherati deve avere un accesso molto limitato per visualizzare i dati e non dovrebbe affatto ricevere l'autorizzazione di aggiornamento per sfruttare i dati.
3. Il potenziale utente, anche con il solo permesso SELECT, può eseguire query esaustive per indovinare il valore corretto, quindi fai attenzione a questo.
4. Puoi anche utilizzare ALTER COLUMN Email ADD MASKED WITH (FUNCTION ='email()') per mascherare le colonne di posta elettronica anziché utilizzare il mascheramento dinamico predefinito.
5. Puoi utilizzare il mascheramento dei dati delle stringhe personalizzate per nascondere un numero di carta di debito in un rapporto di transazione mostrando solo le ultime due o quattro cifre come potresti aver visto nelle ricevute di acquisto.

Cose da fare

Ora che puoi implementare tutti e quattro i tipi di mascheramento, prova le seguenti cose per migliorare ulteriormente le tue abilità:
1. Crea un database di esempio seguendo la procedura dettagliata nell'articolo Sviluppo di rapporti SSRS in termini semplici, seguito dallo sviluppo di un rapporto SSRS che mostra solo il primo carattere dei nomi degli autori nascondendo il resto utilizzando il mascheramento parziale dei dati.
2. Prova a creare un database di esempio a cui si fa riferimento nell'articolo Creazione e distribuzione di più versioni di database tramite snapshot di schema, quindi crea un utente di prova chiamato Student e applica un mascheramento dinamico dei dati adatto per nascondere i voti di tutti gli studenti per questo 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.