sql >> Database >  >> RDS >> Sqlserver

Dynamische gegevensmaskering in SQL Server voor geavanceerde gebruikers

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.


  1. Introductie van nieuwe functie - Spotlight Cloud-rapporten

  2. slechte Hibernate select-prestaties vergeleken met direct uitvoeren - hoe debuggen?

  3. Neo4j - Een relatie verwijderen met Cypher

  4. Hoe voer ik een bulk in in mySQL met node.js