sql >> Databasteknik >  >> RDS >> Sqlserver

Dynamisk datamaskering i SQL Server för nybörjare

Artikeln introducerar grunderna för dynamisk datamaskering (DDM) i SQL Server tillsammans med dess översikt som stöds av ett enkelt exempel på implementering av datamaskering. Dessutom kommer läsarna att bli bekanta med fördelarna med dynamisk datamaskering. Detta dokument belyser också vikten av datamaskering i dagliga databasutvecklingsuppgifter när vissa fält måste maskeras på grund av deras känsliga natur för att följa standardpraxis.

Om datamaskering

Låt oss gå igenom de grundläggande koncepten för datamaskering och tillgängligheten av denna funktion i SQL Server.

Enkel definition

Datamaskering är en metod för att dölja data helt eller delvis och därigenom göra det svårt att känna igen eller förstå data efter att maskeringen har tillämpats.

Microsoft Definition

Enligt Microsofts dokumentation begränsar dynamisk datamaskering (DDM) känslig dataexponering genom att maskera den till icke-privilegierade användare.

Vad är känslig data

Med känsliga uppgifter menar vi alla uppgifter som innehåller privat, personligt identifierbar, finansiell eller säkerhetsinformation som om den avslöjas kan missbrukas eller skada en organisations rykte.

Exempel på känsliga data

Ett bra exempel på känsliga uppgifter är ett betalkortsnummer lagrat i en databas som måste skyddas från all obehörig användning. Ett annat bra exempel på känslig information är den personliga e-postadressen som lätt kan identifiera en person.

Icke-privilegierade användare

Alla databasanvändare som inte får se den känsliga informationen anses vara en icke-privilegierad användare.

Dynamic Data Masking (DDM)

Datamaskeringsfunktionen som stöds av SQL Server är känd som dynamisk datamaskering även kallad DDM i Microsofts dokumentation. Med andra ord hänvisar Microsoft till datamaskering som dynamisk datamaskering i SQL Server.

Kompatibilitet

Enligt Microsofts dokumentation stöds den dynamiska datamaskeringsfunktionen av följande versioner av SQL Server:
1. SQL Server 2016 och senare versioner
2. Azure SQL Database
3. Azure SQL Data Warehouse
Så om du inte har börjat använda Azure SQL-databas(er) ännu, behöver du minst SQL Server 2016 för att använda dynamisk datamaskeringsfunktion.

Konfigurera dynamisk datamaskering

Dynamisk datamaskering kan konfigureras genom att helt enkelt använda T-SQL-kommandon.
Den dynamiska datamaskeringsimplementeringen görs genom T-SQL-skript för att förhindra obehöriga användare från att se känslig data.

Fördelar med dynamisk datamaskering

Låt oss slutligen gå igenom några viktiga fördelar med dynamisk datamaskering, men innan dess skulle jag vilja fråga SQL-nybörjare, inte SQL-proffs, vilka är fördelarna med integritetsbegränsningar?
Låt oss överväga ett exempel på en unik nyckelbegränsning som säkerställer att kolumnen som den tillämpas på har distinkta (inga dubbletter) värden. Om jag kan tvinga fram distinkta kolumnvärden vid tidpunkten för inmatning av data i mitt gränssnitt, varför ska jag bry mig om att genomdriva det genom en databas genom att tillämpa en unik nyckelbegränsning?
Svaret är att säkerställa reglerna (integritetsbegränsningar) ) förblir konsekventa och styrs centralt. Jag måste göra det på en databasnivå, annars kan jag behöva skriva koden för att tvinga fram unika värden i alla nuvarande och eventuella kommande applikationer som kommer åt databasen.
Detsamma gäller för dynamisk datamaskering eftersom den definierar maskera på en kolumn på databasnivå så att det inte finns något behov av att utföra ytterligare maskering (kod) av applikationerna som kommer åt databasen.

Dynamisk datamaskering har följande fördelar jämfört med traditionella metoder:
1. Dynamisk datamaskering implementerar den centraliserade policyn att dölja eller ändra känsliga data i en databas som ärvs av alla program som vill komma åt data.
2. Dynamisk datamaskering i SQL Server kan hjälpa till att hantera användare med behörighet att se känslig data och de användare som inte har behörighet att se den.
3. Den har en enkel implementering i form av T-SQL-skript.

Implementera dynamisk datamaskering

Innan vi implementerar dynamisk datamaskering måste vi förstå vilka typer av dynamisk datamaskering som kan tillämpas på en kolumn i en tabell i en SQL- eller Azure SQL-databas.

Typer av datamasker

Det finns fyra typer av datamasker som vi kan tillämpa på en kolumn:
1. Standarddatamask(er)
2. Partiell datamask(er)
3. Slumpmässiga datamask(er)
4. Anpassade datamask(er)
I den här artikeln kommer vi att fokusera på standarddatamaskeringstypen.

Tillämpa dynamiska datamasker

Dynamiska datamasker kan appliceras på en kolumn i en tabell på följande sätt:
1. När du skapar en ny tabell
2. Ändra en redan skapad tabell för att tillämpa datamaskering på dess kolumn(er)

Konfigurera exempeldatabas

Låt oss skapa en exempeldatabas med namnet SQLDevBlogV5 genom att köra följande T-SQL-skript:

-- 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

Använd följande fråga för att se artiklarna:

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

Företagskrav för att maskera författarnamn

Anta nu att du får ett affärskrav som säger att författarnamn ska maskeras på grund av känsligheten hos denna information. Det bästa sättet att uppfylla detta affärskrav är att maskera kolumnen Namn med DDM.

Maskning av författarnamn

Vi kommer att ändra tabellen för att lägga till datamaskeringsfunktion enligt följande:

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

Kontrollera maskeringsstatus

Du kan kontrollera dynamisk datamaskeringsstatus när som helst genom att använda följande T-SQL-skript i Microsofts dokumentation:

-- 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;

Utdata visar oss vilka kolumner som har maskerats framgångsrikt:

Datakontroll

Kontrollera nu data genom att fråga de 5 bästa posterna i tabellen där vi har tillämpat maskeringen:

-- 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

Resultatet verkar inte visa oss det förväntade resultatet:

Som du kan se, trots att vi har maskerat kolumnen Författare, visar den fortfarande sina faktiska värden. Anledningen till detta beteende är att kontot som vi har använt för att tillämpa dynamisk datamaskering har fått förhöjda privilegier och det är därför den maskerade datan är synlig i sin ursprungliga form när vi frågar tabellen med det aktuella kontot.
Lösningen är för att skapa en ny användare med Select-behörighet.

Skapa en användare med Select-behörighet på bordet

Låt oss nu skapa en ny databasanvändare utan inloggning som endast har Välj behörighet i artikeltabellen enligt följande:

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

Visa topp 5 artiklar som ArticleUser

Kör sedan Select-satsen för att få topp 5 artiklar med den nyskapade användaren ArticleUser med endast vald behörighet:

-- 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;

Grattis! Du har lyckats maskera kolumnen Författare enligt kravet.

Släpp maskerad kolumn

Du kan släppa den dynamiska datamaskeringen på kolumnen du har använt den tidigare genom att helt enkelt utfärda följande T-SQL-kommando:

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

Vänligen håll kontakten eftersom en mer avancerad användning av dynamisk datamaskering är på väg i nästa artikel.

Saker att göra

Nu när du kan maskera kolumner i en tabell i en databas, försök med följande saker för att förbättra dina färdigheter ytterligare:
1. Försök att maskera kategorikolumnen i exempeldatabasen.
2. Försök att skapa författaretabellen med kolumnerna AuthorId, Name och Email och skicka sedan AuthorId som en främmande nyckel i artikeltabellen och använd sedan dynamisk datamaskering på Name- och Email-kolumnerna i författaretabellen genom att skapa en testanvändare
3. Försök att skapa och släppa dynamisk datamaskering för att säkerställa att du framgångsrikt kan lägga till och ta bort dynamisk datamaskering i en SQL-tabell


  1. Hur Typeof() fungerar i SQLite

  2. Oändlig loop CTE med OPTION (maxrekursion 0)

  3. Lös problem med SQL Server-databas som fastnat i misstänkt läge effektivt

  4. Ta bort med Join in Oracle sql Query