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

Dynamisk datamaskering i SQL Server til avancerede brugere

Denne artikel giver en forståelse på højt niveau af dynamisk datamaskering i SQL Server sammen med dens use cases, bedste praksis og sikkerhedsimplikationer for avancerede SQL-brugere (inklusive udviklere og testere). Derudover vil læserne af denne artikel blive fortrolige med at anvende forskellige typer dynamisk datamaskering. Artiklen fremhæver også vigtigheden af ​​avanceret brug af datamaskering i daglige databaseudviklings- og testopgaver.

Forudsætninger

Lad os først gennemgå forudsætningerne for denne artikel.

T-SQL-kendskab

Denne artikel antager, at læserne er godt fortrolige med T-SQL-scripts og nemt kan skrive og køre SQL-forespørgsler for at se og manipulere SQL-databaserne.

Grundlæggende om dynamisk datamaskering

Denne artikel forudsætter også, at læserne kender de grundlæggende begreber for dynamisk datamaskering i SQL Server. Se venligst artiklen Datamaskering i SQL Server for begyndere for at blive fortrolig med det grundlæggende i dynamisk datamaskering, hvis du ikke har gjort det endnu.

Azure SQL-database eller SQL Server 2016-kompatibilitet

Funktionen til dynamisk datamaskering er tilgængelig i SQL Server 2016 til og med SQL Server 2019, så det anbefales stærkt at have en af ​​følgende:
1. Azure SQL-database
2. SQL Server 2016 installeret lokalt eller eksternt.

Opsætning af prøvedatabase

Husk at oprette en eksempeldatabase ved hjælp af følgende T-SQL-script, der er kompatibelt med SQL Server 2016 eller som Azure SQL Database, hvis du gerne vil følge gennemgangen i denne artikel:

-- Opret eksempeldatabase ITSalesV2CREATE DATABASE ITSalesV2;GOUSE [ITSalesV2]-- (2) Create MonthlySale-tabelCREATE TABLE [dbo].[MånedligtSal]( [SaleId] [int] IDENTITY(1,1) NOT NULL, PRIMARY KEY [Sælgesdato] [datetime2](7) NULL, [Kunde] [varchar](50) NULL, [E-mail] [varchar] (200) NULL, [Produkt] [varchar](150) NULL, [TotalPrice] [decimal] (10, 2) NULL,)-- (2) Udfyld månedlig salgstabel SET IDENTITY_INSERT [dbo].[Monthly Sale] ONINSERT INTO [dbo].[MonthlySale] ([SaleId], [Salgsdato], [Kunde],[E-mail] , [Produkt], [TotalPrice]) VALUES (1, N'2019-05-01 00:00:00', N'Asif', N'[email protected]', N'Dell Laptop', CAST(300,00 SOM Decimal(10, 2)))INDSÆT I [dbo].[Månedligt udsalg] ([SaleId], [Sælgesdato], [Kunde],[E-mail], [Produkt], [TotalPrice]) VÆRDIER (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], [Kunde],[E-mail], [Produkt], [TotalPrice]) VÆRDIER (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 ], [Sælgesdato], [Kunde],[E-mail], [Produkt], [TotalPrice]) VÆRDIER (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ånedligt udsalg] ([SaleId], [Sælgesdato], [Kunde],[E-mail], [Produkt ], [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)))INDSÆT I [dbo].[Månedligt udsalg] ([SaleId], [Sælgesdato], [Kunde],[E-mail], [Produkt], [TotalPrice]) VÆRDIER (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].[Monthly Sale] ( [SaleId], [Salgdato], [Kunde],[E-mail], [Produkt], [TotalPrice]) VÆRDIER (7, N'2019-05-12 00:00:00', N'Mike',N'eksempel @sqldat.com', N'iPad', CAST(250,00 AS Decimal(10, 2)))INSERT INTO [dbo].[Månedligt udsalg] ([SaleId], [Sælgesdato] , [Kunde],[E-mail], [Produkt], [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].[Månedligt udsalg] ([SaleId], [Sælgsdato], [Kunde],[E-mail], [Produkt], [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))) INDSÆT I [dbo].[Månedligt udsalg] ([SaleId], [Sælgsdato], [Kunde],[E-mail], [Produkt], [TotalPrice]) VÆRDI (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ånedligt udsalg] FRA

Kontrol af data

Tjek den nyoprettede og udfyldte eksempeldatabase ITSalesV2 ved at køre følgende script:

-- Se månedlige salgsdataVÆLG s.SaleId ,s.SellingDate ,s.Customer ,s.Email ,s.Product ,s.TotalPriceFROM dbo.MonthlySale s

Outputtet er som følger:

Oprettelse af en ikke-privilegeret bruger

Opret en ikke-privilegeret bruger uden login med kun SELECT-tilladelse på MonthlySale-tabellen, som vil se de maskerede data som en forudsætning for denne artikel. Brug følgende script til at gøre det:

-- Opret DataUser for at have Vælg adgang til MonthlySale tabellen OPRET BRUGER DataUser UDEN LOGIN; TILDEL VALG PÅ Månedligt salg TIL DataUser;

Oprettelse af en procedure for at kontrollere maskeringsstatus

Denne artikel antager også, at der er en lagret procedure i eksempeldatabasen, som viser os den dynamiske datamaskeringsstatus for kolonnerne i databasetabellerne:

-- Lagret procedure til at kontrollere status for dynamisk datamaskering OPRET PROC ShowMaskingStatusASBEGINSÆT INGEN ANTAL PÅ SELECT c.name, tbl.name som table_name, c.is_masked, c.masking_function FRA sys.masked_columns AS c JOIN sys.tables AS tbl ON c. [object_id] =tbl.[object_id] WHERE is_masked =1;END

Dynamiske datamaskeringstyper

Der er fire almindelige typer af dynamisk datamaskering i SQL Server:
1. Standarddatamasker
2. Delvis datamaske
3. Tilfældige datamasker
4. Custom String Data Mask(s)
Vi skal nu implementere alle de fire almindelige typer af dynamisk datamaskering.

Implementering af standarddatamaskering

Standarddatamaskering skjuler en kolonne fuldstændigt for en uautoriseret bruger ved at dække alle kolonneværdier med et specialtegn, hvilket gør det meget vanskeligt at gætte kolonneindholdet.

Forretningskrav

Antag nu, at du modtager et forretningskrav, som siger, at kundernes e-mail-adresser skal være fuldstændig skjulte (maskerede) på grund af følsomheden af ​​disse oplysninger.
Den bedste måde at opfylde dette forretningskrav på er at maskere kolonnen E-mail ved hjælp af dynamisk datamaskering (DDM).

E-mail-adresse standard datamaskering

Vi vil ændre tabellen for at maskere e-mail-adresserne som følger:

--Standard dynamisk datamaskering af E-mail-kolonnen ÆNDRINGSTABEL MonthlySaleALTER COLUMN Email varchar(200) MASKED WITH (FUNCTION ='default()');

Tjekker maskeringsstatus

Kontroller status for dynamisk datamaskering ved at bruge følgende lagrede procedure baseret på et T-SQL-script, der henvises til i Microsoft-dokumentationen:

-- Kontrol af dynamisk datamaskeringsstatusEXEC ShowMaskingStatus

Outputtet viser os, hvilke kolonner der er blevet maskeret med succes:

Visning af e-mail-kolonne som en databruger

Udfør derefter Vælg erklæring for at se det månedlige salg (tabel) som en lavprivilegeret bruger kaldet DataUser, der kun har valgt tilladelse i tabellen som følger:

-- Udfør SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Se månedligt salg VÆLG s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s-- Returner brugeren tilbage til den bruger den var førREVERT;

Outputtet er som følger:

Implementering af delvis datamaskering

Delvis datamaskering, som navnet antyder, skjuler delvist en kolonne fra at se den af ​​en uautoriseret bruger, der dækker en del af kolonneværdierne med specialtegn, hvilket gør kolonneindholdet noget læsbart, men stadig svært at gætte.

Forretningskrav

Tænk nu på et forretningskrav, hvor du er blevet bedt om delvist at skjule navnet på kunderne på en sådan måde, at kun det første tegn i navnet forbliver synligt. Den bedste måde at opfylde dette forretningskrav på er at maskere kundekolonnen ved hjælp af delvis dynamisk datamaskering.

Delvis datamaskering af kundenavne

Vi vil ændre tabellen til delvist at maskere kundekolonnen som følger:

-- Delvis datamaskering af kundenavneALTER TABLE MonthlySaleALTER COLUMN [Kunde] TILFØJ MASKET MED (FUNKTION ='partial(1,"XXXXXXX",0)')

Tjekker maskeringsstatus

Tjek den dynamiske datamaskeringsstatus:

-- Kontrol af dynamisk datamaskeringsstatusEXEC ShowMaskingStatus

Outputtet viser os, hvilke kolonner der er blevet maskeret med succes:

Visning af kundekolonnen som en databruger

Se tabellen som en testbruger DataUser, der skal se de maskerede data:

-- Udfør SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Se det månedlige salg som DataUserSELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s-- Returner brugeren tilbage til den bruger den var førREVERT; 

Outputtet er som følger:

Implementering af tilfældig datamaskering

Tilfældig datamaskering skjuler en kolonne tilfældigt for en uautoriseret bruger ved at dække en kolonne baseret på en række værdier, hvilket gør det meget vanskeligt at gætte kolonneindholdet. Husk, at tilfældig datamaskeringstype kun gælder for de kolonner, der kun gemmer tal, og den kan specificeres ved at angive et område til randomisering.

Forretningskrav

Du modtager et forretningskrav, som siger, at produktprisen skal være maskeret med et tilfældigt udvalg af tal, så brugere med lave privilegier ikke må kende de nøjagtige priser på produktet af hensyn til privatlivets fred. Den bedste måde at opfylde denne virksomhedsspecifikation på er at maskere kolonnen TotalPrice ved hjælp af tilfældig dynamisk datamaskering.

Tilfældig datamaskering af TotalPrice-kolonnen

Ændr tabellen MonthlySale for at maskere TotalPrice tilfældigt som følger:

--Tilfældig dynamisk datamaskering af TotalPrice-kolonnen ALTER TABLE MonthlySaleALTER COLUMN [TotalPrice] decimal(10,2) MASKET MED (FUNCTION ='random(1, 12)')

Tjekker maskeringsstatus

Kontroller venligst den dynamiske datamaskeringsstatus ved at køre følgende lagrede procedure:

-- Kontrol af dynamisk datamaskeringsstatusEXEC ShowMaskingStatus

Outputtet viser os, hvilke kolonner der er blevet maskeret med succes:

Visning af TotalPrice-kolonnen som en databruger

Se tabellen som en DataUser nu:

-- Udfør SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Se månedligt salg VÆLG s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice from dbo.MonthlySale s-- Returner brugeren tilbage til den bruger den var førREVERT;

Outputtet er som følger:

Husk venligst, at outputtet kan afvige for kolonnen Tilfældig datamaskeret på grund af generering af tilfældige tal.

Implementering af tilpasset strengdatamaskering

Tilpasset strengdatamaskering, som navnet antyder, tilføjer brugerdefineret karakter for at skjule en kolonne ved at gøre det meget vanskeligt at gætte dens indhold. Husk, at tilpasset strengdatamaskering bruges i forbindelse med delvis datamaskering ved at tilpasse tegnet til at maskere de faktiske kolonneværdier. Med andre ord er tilpasset strengdatamaskering en forbedret form for delvis datamaskering.

Forretningskrav

Overvej et forretningskrav om kun at vise det første og sidste tegn i produktkolonnen, mens resten af ​​tegnene skal være skjult eller maskeret med bindestreger (-). Den bedste måde at opfylde denne virksomhedsspecifikation på er at maskere produktkolonnen ved hjælp af delvis dynamisk datamaskering med den påkrævede tilpassede streng.

Kundestrengdatamaskering af salgsdata

Ændr tabellen Månedligt udsalg for at maskere produktkolonnen som følger:

--Tilpasset streng dynamisk datamaskering af produktkolonne ALTER TABLE MonthlySaleALTER COLUMN [Produkt] TILFØJ MASKET MED (FUNCTION ='partial(1,"---",1)')

Tjekker maskeringsstatus

Det er værd at kontrollere status for dynamisk datamaskering på dette tidspunkt ved hjælp af følgende script:

-- Kontrol af dynamisk datamaskeringsstatusEXEC ShowMaskingStatus

Outputtet viser alle de kolonner, hvorpå dynamisk datamaskering er blevet anvendt som vist nedenfor:

Visning af produktkolonnen som en databruger

Se tabellen som en DataUser nu:

-- Udfør SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Se månedligt salg VÆLG s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice from dbo.MonthlySale s-- Returner brugeren tilbage til den bruger den var førREVERT;

Outputtet er som følger:

Tillykke! Du har implementeret alle fire maskeringsteknikker.
Se artiklen Datamaskering i SQL Server for begyndere at droppe de anvendte datamaskeringstyper.

Bedste praksis

Husk følgende ting:
1. Dynamisk datamaskering beskytter eller krypterer ikke kolonnedataene, så de bør ikke bruges til det formål.
2. Den potentielle bruger, som formodes at se de maskerede data, skal have meget begrænset adgang til at se dataene og bør slet ikke have opdateringstilladelse til at udnytte dataene.
3. Den potentielle bruger, selv med kun SELECT-tilladelse, kan køre udtømmende forespørgsler for at gætte den korrekte værdi, så vær venligst opmærksom på det.
4. Du kan også bruge ALTER COLUMN Email ADD MASKED WITH (FUNCTION ='email()') til at maskere e-mail-kolonner i stedet for at bruge standard dynamisk maskering.
5. Du kan bruge tilpasset strengdatamaskering til at skjule et betalingskortnummer i en transaktionsrapport ved kun at vise de sidste to eller fire cifre, som du måske har set i indkøbskvitteringer.

Ting at gøre

Nu hvor du kan implementere alle de fire typer maskering, prøv venligst følgende ting for at forbedre dine færdigheder yderligere:
1. Opret venligst en prøvedatabase ved at følge gennemgangen i artiklen SSRS-rapporter, udvikling i simple termer, efterfulgt af at udvikle en SSRS-rapport, som kun viser det første tegn i forfatternavnene ved at skjule resten ved hjælp af delvis datamaskering.
2. Prøv at oprette en prøvedatabase, der refereres til i artiklen Creating and Deploying Multiple Versions of Database via Schema Snapshots, og opret derefter en testbruger kaldet Student og anvend passende dynamisk datamaskering for at skjule karaktererne for alle eleverne for denne testbruger.
3. Prøv at oprette og slippe dynamisk datamaskering for at sikre, at du med succes kan tilføje og fjerne dynamisk datamaskering på en SQL-tabel.


  1. Hvornår skal jeg bruge CROSS APPLY over INNER JOIN?

  2. Kald en lagret procedure med en anden i Oracle

  3. Kode til at validere SQL-scripts

  4. Datokonvertering og kultur:Forskellen mellem DATE og DATETIME