Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dynamische Datenmaskierung in SQL Server für fortgeschrittene Benutzer

Dieser Artikel gibt fortgeschrittenen SQL-Benutzern (einschließlich Entwicklern und Testern) ein allgemeines Verständnis der dynamischen Datenmaskierung in SQL Server zusammen mit ihren Anwendungsfällen, Best Practices und Sicherheitsimplikationen. Darüber hinaus werden sich die Leser dieses Artikels mit der Anwendung verschiedener Arten der dynamischen Datenmaskierung vertraut machen. Der Artikel hebt auch die Bedeutung der erweiterten Verwendung von Datenmaskierung bei täglichen Datenbankentwicklungs- und Testaufgaben hervor.

Voraussetzungen

Lassen Sie uns zuerst die Voraussetzungen für diesen Artikel durchgehen.

T-SQL-Vertrautheit

Dieser Artikel geht davon aus, dass die Leser mit T-SQL-Skripten gut vertraut sind und bequem SQL-Abfragen schreiben und ausführen können, um die SQL-Datenbanken anzuzeigen und zu manipulieren.

Grundlagen der dynamischen Datenmaskierung

In diesem Artikel wird außerdem davon ausgegangen, dass die Leser die grundlegenden Konzepte der dynamischen Datenmaskierung in SQL Server kennen. Bitte lesen Sie den Artikel Datenmaskierung in SQL Server für Anfänger, um sich mit den Grundlagen der dynamischen Datenmaskierung vertraut zu machen, falls Sie dies noch nicht getan haben.

Azure SQL-Datenbank oder SQL Server 2016-Kompatibilität

Die dynamische Datenmaskierungsfunktion ist in SQL Server 2016 bis SQL Server 2019 verfügbar, daher wird dringend empfohlen, eines der folgenden zu haben:
1. Azure SQL-Datenbank
2. Lokal oder remote installierter SQL Server 2016.

Beispieldatenbank einrichten

Bitte denken Sie daran, eine Beispieldatenbank mit dem folgenden T-SQL-Skript zu erstellen, das mit SQL Server 2016 oder als Azure SQL-Datenbank kompatibel ist, wenn Sie der exemplarischen Vorgehensweise in diesem Artikel folgen möchten:

-- Beispieldatenbank ITSalesV2 erstellenCREATE DATABASE ITSalesV2;GOUSE [ITSalesV2]-- (2) MonthlySale-Tabelle erstellenCREATE 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) Monatliche Verkaufstabelle auffüllenSET IDENTITY_INSERT [dbo].[MonthlySale] ONINSERT 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'example@sqldat .com', 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'example @sqldat.com', N'iPad', CAST(250.00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate] , [Kunde],[E-Mail], [Produkt], [Gesamtpreis]) 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]) WERTE (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

Daten prüfen

Überprüfen Sie die neu erstellte und gefüllte Beispieldatenbank ITSalesV2, indem Sie das folgende Skript ausführen:

-- Monatliche Verkaufsdaten anzeigenSELECT s.SaleId ,s.SellingDate ,s.Customer ,s.Email ,s.Product ,s.TotalPriceFROM dbo.MonthlySale s

Die Ausgabe sieht wie folgt aus:

Erstellen eines nicht privilegierten Benutzers

Bitte erstellen Sie einen nicht privilegierten Benutzer ohne Anmeldung mit nur SELECT-Berechtigung für die MonthlySale-Tabelle, der die maskierten Daten als Voraussetzung für diesen Artikel sehen wird. Verwenden Sie dazu das folgende Skript:

-- DataUser erstellen, um Select-Zugriff auf die MonthlySale-Tabelle zu habenCREATE USER DataUser WITHOUT LOGIN; GRANT SELECT ON MonthlySale TO DataUser;

Erstellen eines Verfahrens zum Überprüfen des Maskierungsstatus

Dieser Artikel geht außerdem davon aus, dass es eine gespeicherte Prozedur in der Beispieldatenbank gibt, die uns den dynamischen Datenmaskierungsstatus der Spalten in den Datenbanktabellen anzeigt:

 – Gespeicherte Prozedur zum Überprüfen des dynamischen DatenmaskierungsstatusCREATE PROC ShowMaskingStatusASBEGINSET NOCOUNT ON SELECT c.name, tbl.name als Tabellenname, 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

Dynamische Datenmaskierungstypen

Es gibt vier gängige Arten der dynamischen Datenmaskierung in SQL Server:
1. Standarddatenmaske(n)
2. Partielle Datenmaske(n)
3. Zufallsdatenmaske(n)
4. Benutzerdefinierte String-Datenmaske(n)
Wir werden jetzt alle vier gängigen Typen dynamischer Datenmaskierung implementieren.

Standarddatenmaskierung implementieren

Die standardmäßige Datenmaskierung verbirgt eine Spalte vollständig vor einem nicht autorisierten Benutzer, indem alle Spaltenwerte mit einem Sonderzeichen abgedeckt werden, wodurch es sehr schwierig wird, den Spalteninhalt zu erraten.

Geschäftsanforderung

Angenommen, Sie erhalten eine Geschäftsanforderung, die besagt, dass E-Mail-Adressen der Kunden aufgrund der Sensibilität dieser Informationen vollständig ausgeblendet (maskiert) werden sollen.
Die beste Möglichkeit, diese Geschäftsanforderung zu erfüllen, besteht darin, die E-Mail-Spalte zu maskieren mit dynamischer Datenmaskierung (DDM).

Standarddatenmaskierung für E-Mail-Adressen

Wir werden die Tabelle ändern, um die E-Mail-Adressen wie folgt zu maskieren:

 – Standardmäßige dynamische Datenmaskierung der E-Mail-Spalte ALTER TABLE MonthlySaleALTER COLUMN E-Mail varchar(200) MASKED WITH (FUNCTION ='default()');

Überprüfen des Maskierungsstatus

Überprüfen Sie den Status der dynamischen Datenmaskierung mithilfe der folgenden gespeicherten Prozedur basierend auf einem T-SQL-Skript, auf das in der Microsoft-Dokumentation verwiesen wird:

-- Überprüfen des dynamischen DatenmaskierungsstatusEXEC ShowMaskingStatus

Die Ausgabe zeigt uns, welche Spalten erfolgreich maskiert wurden:

E-Mail-Spalte als Datenbenutzer anzeigen

Führen Sie als Nächstes die Select-Anweisung aus, um die monatlichen Umsätze (Tabelle) als Benutzer mit geringen Rechten namens DataUser anzuzeigen, der nur die Select-Berechtigung für die Tabelle wie folgt hat:

-- Ausführen von SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Monatsverkäufe anzeigen SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s-- Setzt den Benutzer auf den vorherigen Benutzer zurückREVERT;

Die Ausgabe sieht wie folgt aus:

Implementierung einer partiellen Datenmaskierung

Teilweise Datenmaskierung, wie der Name schon sagt, verbirgt eine Spalte teilweise vor der Anzeige durch einen nicht autorisierten Benutzer, der einen Teil der Spaltenwerte mit Sonderzeichen abdeckt, wodurch der Spalteninhalt einigermaßen lesbar, aber immer noch schwer zu erraten ist.

Geschäftsanforderung

Denken Sie nun an eine Geschäftsanforderung, in der Sie gebeten wurden, den Namen des Kunden teilweise so zu verbergen, dass nur der erste Buchstabe des Namens sichtbar bleibt. Die beste Möglichkeit, diese Geschäftsanforderung zu erfüllen, besteht darin, die Kundenspalte mithilfe der teilweisen dynamischen Datenmaskierung zu maskieren.

Teilweise Datenmaskierung von Kundennamen

Wir werden die Tabelle ändern, um die Kundenspalte wie folgt teilweise zu maskieren:

-- Teilweise Datenmaskierung von KundennamenALTER TABLE MonthlySaleALTER COLUMN [Kunde] ADD MASKED WITH (FUNCTION ='partial(1,"XXXXXXX",0)')

Überprüfen des Maskierungsstatus

Überprüfen Sie den Status der dynamischen Datenmaskierung:

-- Überprüfen des dynamischen DatenmaskierungsstatusEXEC ShowMaskingStatus

Die Ausgabe zeigt uns, welche Spalten erfolgreich maskiert wurden:

Anzeigen der Kundenspalte als DataUser

Zeigen Sie die Tabelle als Testbenutzer DataUser an, der die maskierten Daten sehen muss:

-- Ausführen von SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Anzeigen der monatlichen Verkäufe als DataUserSELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s-- Zurücksetzen des Benutzers auf den vorherigen BenutzerREVERT; 

Die Ausgabe sieht wie folgt aus:

Implementierung zufälliger Datenmaskierung

Zufällige Datenmaskierung verbirgt eine Spalte zufällig vor einem nicht autorisierten Benutzer, indem eine Spalte basierend auf einem Bereich von Werten abgedeckt wird, was es sehr schwierig macht, den Spalteninhalt zu erraten. Bitte denken Sie daran, dass der zufällige Datenmaskierungstyp nur auf die Spalten anwendbar ist, die nur Zahlen speichern, und er kann durch die Bereitstellung eines Bereichs für die Randomisierung angegeben werden.

Geschäftsanforderung

Sie erhalten eine Geschäftsanforderung, die besagt, dass der Produktpreis mit einem zufälligen Zahlenbereich maskiert werden soll, damit Benutzer mit geringen Berechtigungen aus Datenschutzgründen nicht die genauen Preise des Produkts kennen dürfen. Die beste Möglichkeit, diese Geschäftsspezifikation zu erfüllen, besteht darin, die TotalPrice-Spalte mit zufälliger dynamischer Datenmaskierung zu maskieren.

Zufällige Datenmaskierung der TotalPrice-Spalte

Ändern Sie die Tabelle MonthlySale, um TotalPrice wie folgt zufällig zu maskieren:

--Zufällige dynamische Datenmaskierung der TotalPrice-Spalte ALTER TABLE MonthlySaleALTER COLUMN [TotalPrice] decimal(10,2) MASKED WITH (FUNCTION ='random(1, 12)')

Überprüfen des Maskierungsstatus

Bitte überprüfen Sie den Status der dynamischen Datenmaskierung, indem Sie die folgende gespeicherte Prozedur ausführen:

-- Überprüfen des dynamischen DatenmaskierungsstatusEXEC ShowMaskingStatus

Die Ausgabe zeigt uns, welche Spalten erfolgreich maskiert wurden:

Anzeigen der TotalPrice-Spalte als DataUser

Sehen Sie sich die Tabelle jetzt als DataUser an:

-- Ausführen von SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Anzeigen der monatlichen Verkäufe SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice from dbo.MonthlySale s-- Zurücksetzen des Benutzers auf den vorherigen BenutzerREVERT;

Die Ausgabe sieht wie folgt aus:

Bitte denken Sie daran, dass die Ausgabe für die Spalte Random Data Masked aufgrund der Zufallszahlengenerierung abweichen kann.

Implementieren von benutzerdefinierter String-Datenmaskierung

Die benutzerdefinierte Zeichenfolgendatenmaskierung fügt, wie der Name schon sagt, benutzerdefinierte Zeichen hinzu, um eine Spalte zu verbergen, indem es sehr schwierig wird, ihren Inhalt zu erraten. Bitte denken Sie daran, dass die benutzerdefinierte Zeichenfolgendatenmaskierung in Verbindung mit der partiellen Datenmaskierung verwendet wird, indem das Zeichen angepasst wird, um die tatsächlichen Spaltenwerte zu maskieren. Mit anderen Worten, die benutzerdefinierte String-Datenmaskierung ist eine verbesserte Form der partiellen Datenmaskierung.

Geschäftsanforderung

Betrachten Sie eine Geschäftsanforderung, um nur das erste und letzte Zeichen der Produktspalte anzuzeigen, während die restlichen Zeichen ausgeblendet oder mit Bindestrichen (-) maskiert werden sollten. Die beste Möglichkeit, diese Geschäftsspezifikation zu erfüllen, besteht darin, die Produktspalte mithilfe der partiellen dynamischen Datenmaskierung mit der erforderlichen benutzerdefinierten Zeichenfolge zu maskieren.

Kundendatenmaskierung von Verkaufsdaten

Ändern Sie die Tabelle MonthlySale, um die Produktspalte wie folgt zu maskieren:

--Benutzerdefinierte dynamische Datenmaskierung der Zeichenfolge der Produktspalte ALTER TABLE MonthlySaleALTER COLUMN [Produkt] ADD MASKED WITH (FUNCTION ='partial(1,"---",1)')

Überprüfen des Maskierungsstatus

Es lohnt sich, den Status der dynamischen Datenmaskierung an dieser Stelle mit dem folgenden Skript zu überprüfen:

-- Überprüfen des dynamischen DatenmaskierungsstatusEXEC ShowMaskingStatus

Die Ausgabe zeigt alle Spalten, auf die die dynamische Datenmaskierung erfolgreich angewendet wurde, wie unten gezeigt:

Anzeigen der Produktspalte als DataUser

Sehen Sie sich die Tabelle jetzt als DataUser an:

-- Ausführen von SELECT as DataUserEXECUTE AS USER ='DataUser'; -- Anzeigen der monatlichen Verkäufe SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice from dbo.MonthlySale s-- Zurücksetzen des Benutzers auf den vorherigen BenutzerREVERT;

Die Ausgabe sieht wie folgt aus:

Herzliche Glückwünsche! Sie haben alle vier Maskierungstechniken erfolgreich implementiert.
Bitte lesen Sie den Artikel Datenmaskierung in SQL Server für Anfänger, um die angewendeten Datenmaskierungstypen zu löschen.

Best Practices

Bitte denken Sie an Folgendes:
1. Die dynamische Datenmaskierung schützt oder verschlüsselt die Spaltendaten nicht und sollte daher nicht für diesen Zweck verwendet werden.
2. Der potenzielle Benutzer, der die maskierten Daten sehen soll, muss sehr eingeschränkten Zugriff haben, um die Daten anzuzeigen, und sollte überhaupt keine Update-Berechtigung erhalten, um die Daten auszunutzen.
3. Der potenzielle Benutzer kann selbst mit der Berechtigung SELECT nur erschöpfende Abfragen ausführen, um den richtigen Wert zu erraten, also hüten Sie sich bitte davor.
4. Sie können auch ALTER COLUMN Email ADD MASKED WITH (FUNCTION =’email()’) verwenden, um E-Mail-Spalten zu maskieren, anstatt die standardmäßige dynamische Maskierung zu verwenden.
5. Sie können die Datenmaskierung mit benutzerdefinierten Zeichenfolgen verwenden, um eine Debitkartennummer in einem Transaktionsbericht zu verbergen, indem Sie nur die letzten zwei oder vier Ziffern anzeigen, wie Sie sie möglicherweise in Einkaufsbelegen gesehen haben.

Dinge zu tun

Jetzt, da Sie alle vier Maskierungsarten anwenden können, versuchen Sie bitte Folgendes, um Ihre Fähigkeiten weiter zu verbessern:
1. Bitte erstellen Sie eine Beispieldatenbank, indem Sie der exemplarischen Vorgehensweise im Artikel Entwicklung von SSRS-Berichten in einfachen Begriffen folgen, gefolgt von der Entwicklung eines SSRS-Berichts, der nur das erste Zeichen der Autorennamen anzeigt, indem der Rest mit teilweiser Datenmaskierung ausgeblendet wird.
2. Bitte versuchen Sie, eine Beispieldatenbank zu erstellen, auf die im Artikel Erstellen und Bereitstellen mehrerer Datenbankversionen durch Schema-Snapshots verwiesen wird, und erstellen Sie dann einen Testbenutzer namens Student und wenden Sie eine geeignete dynamische Datenmaskierung an, um die Noten aller Studenten für diesen Testbenutzer zu verbergen.
3. Bitte versuchen Sie, dynamische Datenmaskierung zu erstellen und zu löschen, um sicherzustellen, dass Sie dynamische Datenmaskierung erfolgreich zu einer SQL-Tabelle hinzufügen und entfernen können.