sql >> Databasteknik >  >> RDS >> Sqlserver

Dynamisk datamaskering i SQL Server för avancerade användare

Den här artikeln ger en förståelse på hög nivå av dynamisk datamaskering i SQL Server tillsammans med dess användningsfall, bästa praxis och säkerhetsimplikationer för avancerade SQL-användare (inklusive utvecklare och testare). Dessutom kommer läsarna av den här artikeln att bli bekanta med att tillämpa olika typer av dynamisk datamaskering. Artikeln belyser också vikten av att använda datamaskering på avancerad nivå i dagliga databasutvecklings- och testuppgifter.

Förutsättningar

Låt oss gå igenom förutsättningarna för den här artikeln först.

T-SQL-bekantskap

Den här artikeln förutsätter att läsarna är väl bekanta med T-SQL-skript och bekvämt kan skriva och köra SQL-frågor för att se och manipulera SQL-databaserna.

Grunderna för dynamisk datamaskering

Den här artikeln förutsätter också att läsarna känner till de grundläggande koncepten för dynamisk datamaskering i SQL Server. Se artikeln Datamaskering i SQL Server för nybörjare för att bekanta dig med grunderna för dynamisk datamaskering om du inte har gjort det ännu.

Azure SQL-databas eller SQL Server 2016-kompatibilitet

Funktionen för dynamisk datamaskering är tillgänglig i SQL Server 2016 till och med SQL Server 2019, så det rekommenderas starkt att ha något av följande:
1. Azure SQL-databas
2. SQL Server 2016 installerad lokalt eller på distans.

Konfigurera exempeldatabas

Kom ihåg att skapa en exempeldatabas med följande T-SQL-skript som är kompatibelt med SQL Server 2016 eller som Azure SQL Database om du vill följa genomgången i den här artikeln:

-- Skapa exempeldatabas ITSalesV2CREATE DATABASE ITSalesV2;GOUSE [ITSalesV2]-- (2) Skapa MonthlySale-tabellCREATE TABLE [dbo].[MonthlySale]( [SaleId] [int] IDENTITY(1,1) INTE NULL, PRIMÄRKEY [SellingDate] [datetime2](7) NULL, [Kund] [varchar](50) NULL, [E-post] [varchar] (200) NULL, [Produkt] [varchar](150) NULL, [TotalPrice] [decimal] (10, 2) NULL,)-- (2) Fyll i månadsförsäljningstabellSET IDENTITY_INSERT [dbo].[Monthly Sale] ONINSERT INTO [dbo].[Monthly Sale] ([SaleId], [SellingDate], [Kund],[E-post] , [Produkt], [TotalPrice]) VÄRDEN (1, N'2019-05-01 00:00:00', N'Asif', N'[email protected]', N'Dell Laptop', CAST(300,00 AS Decimal(10, 2)))INSERT I [dbo].[Månadsrea] ([SaleId], [Säljdatum], [Kund],[E-post], [Produkt], [TotalPrice]) VÄRDEN (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].[ Monthly Sale] ([SaleId], [SellingDate], [Kund],[E-post], [Produkt], [TotalPrice]) VÄRDEN (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].[Monthly Sale] ([SaleId ], [Säljdatum], [Kund],[E-post], [Produkt], [TotalPrice]) VÄRDEN (4, N'2019-05-03 00:00:00', N'Sarah',N'example@sqldat .com', N'HP Laptop', CAST(250,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månadsrea] ([SaleId], [Säljdatum], [Kund],[E-post], [Produkt ], [TotalPrice]) VÄRDEN (5, N'2019-05-05 00:00:00', N'Asif', N'[email protected]', N'Dell Desktop', CAST(200.00 AS Decimal( 10, 2))) INSERT I [dbo].[Månadsrea] ([SaleId], [Säljdatum], [Kund],[E-post], [Produkt], [TotalPrice]) VÄRDEN (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].[Månadsrea] ( [SaleId], [SellingDate], [Kund],[E-post], [Produkt], [TotalPrice]) VÄRDEN (7, N'2019-05-12 00:00:00', N'Mike',N'example @sqldat.com', N'iPad', CAST(250.00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månadsrea] ([SaleId], [SellingDate] , [Kund],[E-post], [Produkt], [TotalPrice]) VÄRDEN (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].[Månadsrea] ([SaleId], [SellingDate], [Kund],[E-post], [Produkt], [TotalPrice]) VÄRDEN (9, N'2019-05-20 00:00:00', N'Peter',N'[email protected]', N'Dell Laptop', CAST(350.00 AS Decimal(10, 2))) INFOGA I [dbo].[Månadsrea] ([SaleId], [Säljdatum], [Kund],[E-post], [Produkt], [TotalPrice]) VÄRDEN (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].[Månadsrea] AV

Kontrollera data

Kontrollera den nyskapade och ifyllda exempeldatabasen ITSalesV2 genom att köra följande skript:

-- Visa månadsförsäljningsdataVÄLJ s.SaleId ,s.SellingDate ,s.Customer ,s.Email ,s.Product ,s.TotalPriceFROM dbo.MonthlySale s

Utgången är som följer:

Skapa en icke-privilegierad användare

Vänligen skapa en icke-privilegierad användare utan inloggning som endast har SELECT-behörighet på MonthlySale-tabellen som kommer att se den maskerade informationen som en förutsättning för denna artikel. Använd följande skript för att göra det:

-- Skapa DataUser att ha Välj åtkomst till MonthlySale-tabellen SKAPA ANVÄNDARE DataUser UTAN LOGGA IN; BETYD VAL PÅ Monthly Sale TILL DataUser;

Skapa en procedur för att kontrollera maskeringsstatus

Den här artikeln förutsätter också att det finns en lagrad procedur i exempeldatabasen som visar oss den dynamiska datamaskeringsstatusen för kolumnerna i databastabellerna:

-- Lagrad procedur för att kontrollera status för dynamisk datamaskering SKAPA PROC ShowMaskingStatusASBEGINSET NOCOUNT ON SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function FRÅN sys.masked_columns AS c JOIN sys.tables AS tbl ON c. [object_id] =tbl.[object_id] WHERE is_masked =1;END

Dynamiska datamaskeringstyper

Det finns fyra vanliga typer av dynamisk datamaskering i SQL Server:
1. Standarddatamask(er)
2. Partiell datamask(er)
3. Slumpmässiga datamask(er)
4. Custom String Data Mask(s)
Vi ska nu implementera alla fyra vanliga typer av dynamisk datamaskering.

Implementera standarddatamaskering

Standarddatamaskering döljer en kolumn helt för en obehörig användare genom att täcka alla kolumnvärden med ett specialtecken vilket gör det mycket svårt att gissa kolumninnehållet.

Företagskrav

Anta nu att du får ett affärskrav som säger att kundernas e-postadresser ska vara helt dolda (maskerade) på grund av denna informations känslighet.
Det bästa sättet att uppfylla detta affärskrav är att maskera kolumnen E-post med dynamisk datamaskering (DDM).

E-postadress Standarddatamaskering

Vi kommer att ändra tabellen för att maskera e-postadresserna enligt följande:

--Standard dynamisk datamaskering av e-postkolumn ALTER TABLE MonthlySaleALTER COLUMN Email varchar(200) MASKERAD MED (FUNCTION ='default()');

Kontrollera maskeringsstatus

Kontrollera statusen för dynamisk datamaskering genom att använda följande lagrade procedur baserad på ett T-SQL-skript som refereras till i Microsofts dokumentation:

-- Kontrollerar dynamisk datamaskeringsstatusEXEC ShowMaskingStatus

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

Visa e-postkolumn som en dataanvändare

Kör sedan Välj uttalande för att se månadsförsäljning (tabell) som en lågprivilegierad användare som heter DataUser som endast har valt behörighet i tabellen enligt följande:

-- Execute SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Visa månadsförsäljning SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s-- Återställ användaren till vilken användare den var innanREVERT;

Utgången är som följer:

Implementering av partiell datamaskering

Partiell datamaskering som namnet antyder döljer delvis en kolumn från att se den av en obehörig användare och täcker en del av kolumnvärdena med specialtecken vilket gör kolumninnehållet något läsbart men fortfarande svårt att gissa.

Företagskrav

Tänk nu på ett affärskrav där du har blivit ombedd att delvis dölja namnet på kunderna på ett sådant sätt att endast det första tecknet i namnet förblir synligt. Det bästa sättet att uppfylla detta affärskrav är att maskera kundkolumnen med partiell dynamisk datamaskering.

Delvis datamaskering av kundnamn

Vi kommer att ändra tabellen för att delvis maskera kundkolumnen enligt följande:

-- Partiell datamaskering av kundnamnALTER TABLE MonthlySaleALTER COLUMN [Kund] LÄGG TILL MASKERAD MED (FUNCTION ='partial(1,"XXXXXXX",0)')

Kontrollera maskeringsstatus

Kontrollera status för dynamisk datamaskering:

-- Kontrollerar dynamisk datamaskeringsstatusEXEC ShowMaskingStatus

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

Visa kundkolumnen som en dataanvändare

Visa tabellen som en testanvändare DataUser som måste se de maskerade data:

-- Execute SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Visa månadsförsäljning som DataUserSELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s-- Återställ användaren till vilken användare den var innanREVERT; 

Utgången är som följer:

Implementera slumpmässig datamaskering

Slumpmässig datamaskering döljer en kolumn slumpmässigt för en obehörig användare genom att täcka en kolumn baserad på en rad värden vilket gör det mycket svårt att gissa kolumninnehållet. Kom ihåg att maskeringstypen för slumpmässig data endast är tillämplig på de kolumner som endast lagrar siffror och den kan specificeras genom att tillhandahålla ett intervall för randomisering.

Företagskrav

Du får ett affärskrav som säger att produktpriset ska maskeras med ett slumpmässigt antal siffror så att användare med låga privilegier inte får veta de exakta priserna på produkten av integritetsskäl. Det bästa sättet att uppfylla denna affärsspecifikation är att maskera kolumnen TotalPrice med slumpmässig dynamisk datamaskering.

Slumpmässig datamaskering av totalpriskolumnen

Ändra tabellen Monthly Sale för att maskera TotalPrice slumpmässigt enligt följande:

--Slumpmässig dynamisk datamaskering av kolumnen TotalPrice ALTER TABLE MonthlySaleALTER COLUMN [TotalPrice] decimal(10,2) MASKERAD MED (FUNCTION ='slumpmässig(1, 12)')

Kontrollera maskeringsstatus

Kontrollera den dynamiska datamaskeringsstatusen genom att köra följande lagrade procedur:

-- Kontrollerar dynamisk datamaskeringsstatusEXEC ShowMaskingStatus

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

Visa TotalPrice-kolumnen som en DataUser

Visa tabellen som en DataUser nu:

-- Execute SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Visa månadsförsäljning VÄLJ s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice from dbo.MonthlySale s-- Återställ användaren till vilken användare den var innanREVERT;

Utgången är som följer:

Kom ihåg att utdata kan skilja sig åt för kolumnen Random Data Masked på grund av genereringen av slumptal.

Implementera anpassad strängdatamaskering

Anpassad strängdatamaskering som namnet antyder lägger till anpassade tecken för att dölja en kolumn genom att göra det mycket svårt att gissa dess innehåll. Kom ihåg att anpassad strängdatamaskering används i samband med partiell datamaskering genom att anpassa tecknet för att maskera de faktiska kolumnvärdena. Med andra ord, anpassad strängdatamaskering är en förbättrad form av partiell datamaskering.

Företagskrav

Överväg ett affärskrav att endast visa det första och sista tecknet i produktkolumnen medan resten av tecknen ska vara dolda eller maskerade med bindestreck (-). Det bästa sättet att uppfylla denna affärsspecifikation är att maskera produktkolumnen med hjälp av partiell dynamisk datamaskering med den nödvändiga anpassade strängen.

Kundsträngsdatamaskering av säljdata

Ändra tabellen Monthly Sale för att maskera produktkolumnen enligt följande:

--Anpassad sträng dynamisk datamaskering av produktkolumn ALTER TABLE MonthlySaleALTER COLUMN [Produkt] ADD MASKED WITH (FUNCTION ='partial(1,"---",1)')

Kontrollera maskeringsstatus

Det är värt att kontrollera status för dynamisk datamaskering vid denna tidpunkt med hjälp av följande skript:

-- Kontrollerar dynamisk datamaskeringsstatusEXEC ShowMaskingStatus

Utdatat visar alla kolumner där dynamisk datamaskering har tillämpats som visas nedan:

Visa produktkolumnen som en dataanvändare

Visa tabellen som en DataUser nu:

-- Execute SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Visa månadsförsäljning VÄLJ s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice from dbo.MonthlySale s-- Återställ användaren till vilken användare den var innanREVERT;

Utgången är som följer:

Grattis! Du har framgångsrikt implementerat alla fyra maskeringsteknikerna.
Se artikeln Datamaskering i SQL Server för nybörjare för att släppa de tillämpade datamaskeringstyperna.

Bästa metoder

Kom ihåg följande saker:
1. Dynamisk datamaskering skyddar eller krypterar inte kolumndata så den bör inte användas för det ändamålet.
2. Den potentiella användaren som ska se den maskerade datan måste ha mycket begränsad tillgång för att se data och bör inte alls ges uppdateringstillstånd att utnyttja datan.
3. Den potentiella användaren, även med SELECT-behörighet, kan köra uttömmande frågor för att gissa rätt värde, så akta dig för det.
4. Du kan också använda ALTER COLUMN Email ADD MASKED WITH (FUNCTION ='email()') för att maskera e-postkolumner istället för att använda dynamisk standardmaskering.
5. Du kan använda anpassad strängdatamaskering för att dölja ett betalkortsnummer i en transaktionsrapport genom att endast visa de två eller fyra sista siffrorna som du kanske har sett i inköpskvitton.

Saker att göra

Nu när du kan implementera alla fyra typer av maskering, försök med följande saker för att förbättra dina färdigheter ytterligare:
1. Skapa en exempeldatabas genom att följa genomgången i artikeln SSRS Reports Development in Simple Terms följt av att utveckla en SSRS-rapport som bara visar det första tecknet i författarens namn genom att dölja resten med hjälp av partiell datamaskering.
2. Försök att skapa en exempeldatabas som hänvisas till i artikeln Skapa och distribuera flera versioner av databas genom Schema Snapshots och skapa sedan en testanvändare som heter Student och använd lämplig dynamisk datamaskering för att dölja alla elevers betyg för denna 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 på en SQL-tabell.


  1. Använda ODBC med Salesforce och Active Directory Federation Services (ADFS) Single Sign On (SSO)

  2. Hur Cosd() fungerar i PostgreSQL

  3. Konverteringen misslyckades vid konvertering av datum och/eller tid från teckensträng när datum och tid infogades

  4. Hur man returnerar antalet sekunder efter midnatt i Oracle Database