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