Dit artikel geeft inzicht op hoog niveau van dynamische gegevensmaskering in SQL Server, samen met de gebruiksscenario's, best practices en beveiligingsimplicaties voor geavanceerde SQL-gebruikers (inclusief ontwikkelaars en testers). Bovendien zullen de lezers van dit artikel vertrouwd raken met het toepassen van verschillende soorten dynamische gegevensmaskering. Het artikel benadrukt ook het belang van geavanceerd gebruik van gegevensmaskering bij dagelijkse databaseontwikkeling en testtaken.
Vereisten
Laten we eerst de vereisten voor dit artikel doornemen.
T-SQL-bekendheid
Dit artikel gaat ervan uit dat de lezers goed bekend zijn met T-SQL-scripts en gemakkelijk SQL-query's kunnen schrijven en uitvoeren om de SQL-databases te bekijken en te manipuleren.
Basisprincipes van dynamische gegevensmaskering
Dit artikel gaat er ook van uit dat de lezers de basisconcepten van dynamische gegevensmaskering in SQL Server kennen. Raadpleeg het artikel Gegevensmaskering in SQL Server voor beginners om vertrouwd te raken met de basisprincipes van dynamische gegevensmaskering als u dit nog niet hebt gedaan.
Azure SQL-database of SQL Server 2016-compatibiliteit
Dynamische gegevensmaskering is beschikbaar in SQL Server 2016 tot en met SQL Server 2019, dus het wordt ten zeerste aanbevolen om een van de volgende te hebben:
1. Azure SQL-database
2. SQL Server 2016 lokaal of op afstand geïnstalleerd.
Voorbeelddatabase instellen
Vergeet niet om een voorbeelddatabase te maken met behulp van het volgende T-SQL-script dat compatibel is met SQL Server 2016 of als Azure SQL Database als u de uitleg in dit artikel wilt volgen:
-- 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
Gegevens controleren
Controleer de nieuw gemaakte en gevulde voorbeelddatabase ITSalesV2 door het volgende script uit te voeren:
-- View monthly sales data SELECT s.SaleId ,s.SellingDate ,s.Customer ,s.Email ,s.Product ,s.TotalPrice FROM dbo.MonthlySale s
De uitvoer is als volgt:
Een niet-bevoegde gebruiker maken
Maak een niet-bevoorrechte gebruiker aan zonder in te loggen met alleen SELECT-machtiging voor de MonthlySale-tabel die de gemaskeerde gegevens zal zien als een vereiste voor dit artikel. Gebruik het volgende script om dat te doen:
-- Create DataUser to have Select access to MonthlySale table CREATE USER DataUser WITHOUT LOGIN; GRANT SELECT ON MonthlySale TO DataUser;
Een procedure maken om de maskeringsstatus te controleren
Dit artikel gaat er ook van uit dat er een opgeslagen procedure is in de voorbeelddatabase die ons de dynamische gegevensmaskeringsstatus van de kolommen in de databasetabellen laat zien:
-- 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
Typen dynamische gegevensmaskering
Er zijn vier veelvoorkomende typen dynamische gegevensmaskering in SQL Server:
1. Standaard gegevensmasker(s)
2. Gedeeltelijke gegevensmasker(s)
3. Willekeurige gegevensmasker(s)
4. Aangepaste string-gegevensmasker(s)
We gaan nu alle vier veelvoorkomende typen dynamische gegevensmaskering implementeren.
Standaard gegevensmaskering implementeren
Standaard gegevensmaskering verbergt een kolom volledig voor een onbevoegde gebruiker door alle kolomwaarden te bedekken met een speciaal teken, waardoor het erg moeilijk wordt om de kolominhoud te raden.
Zakelijke vereiste
Stel nu dat u een zakelijke eis ontvangt waarin staat dat e-mailadressen van de klanten volledig verborgen (gemaskeerd) moeten worden vanwege de gevoeligheid van deze informatie.
De beste manier om aan deze zakelijke eis te voldoen, is door de kolom E-mail te maskeren met behulp van dynamische gegevensmaskering (DDM).
E-mailadres Standaard gegevensmaskering
We gaan de tabel wijzigen om de e-mailadressen als volgt te maskeren:
--Default dynamic data masking of Email column ALTER TABLE MonthlySale ALTER COLUMN Email varchar(200) MASKED WITH (FUNCTION = 'default()');
Makerstatus controleren
Controleer de status van dynamische gegevensmaskering met behulp van de volgende opgeslagen procedure op basis van een T-SQL-script waarnaar wordt verwezen in de Microsoft-documentatie:
-- Checking dynamic data masking status EXEC ShowMaskingStatus
De uitvoer laat ons zien welke kolommen met succes zijn gemaskeerd:
E-mailkolom bekijken als gegevensgebruiker
Voer vervolgens de Select-instructie uit om de maandelijkse verkopen (tabel) te bekijken als een gebruiker met lage rechten, DataUser genaamd, die alleen als volgt de machtiging Select voor de tabel heeft:
-- 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;
De uitvoer is als volgt:
Gedeeltelijke gegevensmaskering implementeren
Gedeeltelijke gegevensmaskering, zoals de naam al aangeeft, verbergt een kolom gedeeltelijk zodat deze niet kan worden bekeken door een onbevoegde gebruiker en bedekt een deel van de kolomwaarden met speciale tekens, waardoor de kolominhoud enigszins leesbaar is, maar nog steeds moeilijk te raden.
Zakelijke vereiste
Denk nu aan een zakelijke eis waarbij u is gevraagd om de naam van de klanten gedeeltelijk te verbergen, zodat alleen het eerste teken van de naam zichtbaar blijft. De beste manier om aan deze zakelijke eis te voldoen, is door de kolom Klant te maskeren met Gedeeltelijke dynamische gegevensmaskering.
Gedeeltelijke gegevensmaskering van klantnamen
We gaan de tabel als volgt wijzigen om de kolom Klant gedeeltelijk te maskeren:
-- Partial data masking of Customer names ALTER TABLE MonthlySale ALTER COLUMN [Customer] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')
Makerstatus controleren
Controleer de status van dynamische gegevensmaskering:
-- Checking dynamic data masking status EXEC ShowMaskingStatus
De uitvoer laat ons zien welke kolommen met succes zijn gemaskeerd:
De klantkolom bekijken als een gegevensgebruiker
Bekijk de tabel als een testgebruiker DataUser die de gemaskeerde gegevens moet zien:
-- 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;
De uitvoer is als volgt:
Willekeurige gegevensmaskering implementeren
Willekeurige gegevensmaskering verbergt willekeurig een kolom voor een onbevoegde gebruiker door een kolom te bedekken op basis van een reeks waarden, waardoor het erg moeilijk is om de kolominhoud te raden. Houd er rekening mee dat het willekeurige gegevensmaskeringstype alleen van toepassing is op de kolommen waarin alleen getallen zijn opgeslagen en dat het kan worden gespecificeerd door een bereik voor willekeurigheid op te geven.
Zakelijke vereiste
U ontvangt een zakelijke vereiste waarin staat dat de productprijs moet worden gemaskeerd met een willekeurig aantal getallen, zodat gebruikers met lage privileges om privacyredenen de exacte prijzen van het product niet mogen weten. De beste manier om aan deze bedrijfsspecificatie te voldoen, is door de TotalPrice-kolom te maskeren met willekeurige dynamische gegevensmaskering.
Willekeurige gegevensmaskering van de TotalPrice-kolom
Wijzig de tabel MonthlySale om de TotalPrice als volgt willekeurig te maskeren:
--Random dynamic data masking of TotalPrice column ALTER TABLE MonthlySale ALTER COLUMN [TotalPrice] decimal(10,2) MASKED WITH (FUNCTION = 'random(1, 12)')
Makerstatus controleren
Controleer de status van de dynamische gegevensmaskering door de volgende opgeslagen procedure uit te voeren:
-- Checking dynamic data masking status EXEC ShowMaskingStatus
De uitvoer laat ons zien welke kolommen met succes zijn gemaskeerd:
De TotalPrice-kolom bekijken als een gegevensgebruiker
Bekijk de tabel nu als DataUser:
-- 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;
De uitvoer is als volgt:
Houd er rekening mee dat de uitvoer voor de kolom Random Data Masked kan verschillen vanwege het genereren van willekeurige getallen.
Aangepaste tekenreeksgegevensmaskering implementeren
Aangepaste tekenreeksgegevensmaskering, zoals de naam al aangeeft, voegt een aangepast teken toe om een kolom te verbergen door het erg moeilijk te maken om de inhoud ervan te raden. Houd er rekening mee dat gegevensmaskering van aangepaste tekenreeksen wordt gebruikt in combinatie met gedeeltelijke gegevensmaskering door het teken aan te passen om de werkelijke kolomwaarden te maskeren. Met andere woorden, maskering van aangepaste stringgegevens is een verbeterde vorm van gedeeltelijke gegevensmaskering.
Zakelijke vereiste
Overweeg een zakelijke vereiste om alleen het eerste en laatste teken van de kolom Product weer te geven, terwijl de rest van de tekens moet worden verborgen of gemaskeerd met koppeltekens (-). De beste manier om aan deze bedrijfsspecificatie te voldoen, is door de kolom Product te maskeren met Gedeeltelijke dynamische gegevensmaskering met de vereiste aangepaste tekenreeks.
Klantreeksgegevensmaskering van verkoopgegevens
Wijzig de tabel MonthlySale om de kolom Product als volgt te maskeren:
--Custom string dynamic data masking of Product column ALTER TABLE MonthlySale ALTER COLUMN [Product] ADD MASKED WITH (FUNCTION = 'partial(1,"---",1)')
Makerstatus controleren
Het is de moeite waard om op dit moment de status van dynamische gegevensmaskering te controleren met behulp van het volgende script:
-- Checking dynamic data masking status EXEC ShowMaskingStatus
De uitvoer toont alle kolommen waarop dynamische gegevensmaskering met succes is toegepast, zoals hieronder weergegeven:
De productkolom bekijken als een gegevensgebruiker
Bekijk de tabel nu als DataUser:
-- 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;
De uitvoer is als volgt:
Gefeliciteerd! U hebt alle vier de maskeringstechnieken met succes geïmplementeerd.
Raadpleeg het artikel Gegevensmaskering in SQL Server voor beginners om de toegepaste gegevensmaskeringstypen te verwijderen.
Beste praktijken
Onthoud de volgende dingen:
1. Dynamische gegevensmaskering beschermt of versleutelt de kolomgegevens niet en mag daarom niet voor dat doel worden gebruikt.
2. De potentiële gebruiker die de gemaskeerde gegevens zou moeten zien, moet zeer beperkte toegang hebben om de gegevens te bekijken en mag helemaal geen Update-toestemming krijgen om de gegevens te exploiteren.
3. De potentiële gebruiker, zelfs met alleen SELECT-machtiging, kan uitputtende zoekopdrachten uitvoeren om de juiste waarde te raden, dus pas daar op.
4. U kunt ook ALTER COLUMN Email ADD MASKED WITH (FUNCTION =’email()’) gebruiken om e-mailkolommen te maskeren in plaats van Standaard dynamische maskering te gebruiken.
5. U kunt aangepaste tekenreeksgegevensmaskering gebruiken om een debetkaartnummer in een transactierapport te verbergen door alleen de laatste twee of vier cijfers weer te geven, zoals u mogelijk hebt gezien in winkelbonnen.
Dingen om te doen
Nu u alle vier soorten maskering kunt implementeren, kunt u de volgende dingen proberen om uw vaardigheden verder te verbeteren:
1. Maak een voorbeelddatabase aan door de uitleg te volgen in het artikel SSRS-rapportenontwikkeling in eenvoudige termen, gevolgd door het ontwikkelen van een SSRS-rapport dat alleen het eerste teken van de auteursnamen laat zien door de rest te verbergen met behulp van gedeeltelijke gegevensmaskering.
2. Probeer een voorbeelddatabase te maken waarnaar wordt verwezen in het artikel Meerdere versies van databases maken en implementeren via Schema Snapshots en maak vervolgens een testgebruiker met de naam Student en pas geschikte dynamische gegevensmaskering toe om de cijfers van alle studenten voor deze testgebruiker te verbergen.
3. Probeer dynamische gegevensmaskering te maken en te verwijderen om ervoor te zorgen dat u dynamische gegevensmaskering aan een SQL-tabel kunt toevoegen en verwijderen.