Daten dynamisch maskieren in SQL Server 2016
In diesem Beitrag stelle ich euch das neue Feature Dynamic Data Masking (DDM) des SQL Server 2016 vor. Dieses Feature werden vor allem Business Intelligence-Entwickler ziemlich interessant finden, da es hier um das Anonymisieren von Daten geht. Das kann zum Beispiel in Reports genutzt werden.
Das DDM gibt euch die Möglichkeit sensible Daten wie Telefonnummern, Kreditkarteninformationen oder Emails in der SQL-Tabelle zu maskieren.
Eine solche Maskierung wendet man direkt auf eine oder mehrere Spalten einer Tabelle mit einer ADD MASKED-Anweisung an.
Der SQL Server 2016 bietet zurzeit drei vordefinierte Funktionen und eine benutzerdefinierte Funktion zum Maskieren an:
- DEFAULT: Diese Funktion ersetzt Zeichenfolgen durch „XXXX“ und Zahlen durch „0“.
- EMAIL: Diese Funktion ersetzt einen Teil vor dem @-Zeichen und setzt dafür „@XXXX.com“ ans Ende an.
- RANDOM: Diese Funktion ersetzt Zahlen durch zufällige Werte.
- Benutzerdefinierter String: In dieser Funktion lässt sich eine eigene Padding-Zeichenfolge zum Ersetzen erstellen.
Benutzer mit den Rechten data_reader oder einfachen Select-Berechtigungen sehen diese Daten in den Spalten maskiert.
Andere Benutzer mit Owner-Berechtigungen oder Change-Berechtigungen auf die Tabelle oder Datenbank sehen diese Daten unmaskiert!
Soweit zur Theorie. Sehen wir uns nun ein Beispiel an:
Zunächst erstellen wir eine Tabelle mit sensiblen Daten und fügen dort einige Datensätze hinzu:
CREATE TABLE [dbo].[Zahlungsdaten](
[Personalnr] [int] NOT NULL,
[Vorname] [varchar](50) NOT NULL,
[Nachname] [varchar](50) NOT NULL,
[Kreditkartennr] [int] NOT NULL,
[Gueltig_bis] [date] NOT NULL,
[Email] [varchar](50) NOT NULL
) ON [PRIMARY]
INSERT [dbo].[Zahlungsdaten] ([Personalnr], [Vorname], [Nachname], [Kreditkartennr], [Gueltig_bis], [Email])
VALUES (123, N’Arthur‘, N’Leinweber‘, 123456789, CAST(N’2019-01-01′ AS Date), N’leinweber@sqlxpert-gmbh.de‘)
GO
INSERT [dbo].[Zahlungsdaten] ([Personalnr], [Vorname], [Nachname], [Kreditkartennr], [Gueltig_bis], [Email])
VALUES (456, N’Daniel‘, N’Caesar‘, 321654987, CAST(N’2020-02-02′ AS Date), N’caesar@sqlxpert-gmbh.de‘)
GO
INSERT [dbo].[Zahlungsdaten] ([Personalnr], [Vorname], [Nachname], [Kreditkartennr], [Gueltig_bis], [Email])
VALUES (789, N’Tino‘, N’Krüger‘, 987654321, CAST(N’2022-03-03′ AS Date), N’krueger@sqlxpert-gmbh.de‘)
GO
Das vorläufige Resultat sieht so aus:
Nun möchten wir gerne die Spalten „Personalnr“, “Vorname“, „Kreditkartennr“ und „Email“ maskieren. Dazu führen wir folgende ALTER TABLE-Anweisungen aus:
ALTER TABLE [xpertBlog].[dbo].[Zahlungsdaten]
ALTER COLUMN [Personalnr] ADD MASKED WITH (FUNCTION=’default()‘)
ALTER TABLE [xpertBlog].[dbo].[Zahlungsdaten]
ALTER COLUMN [Vorname] ADD MASKED WITH (FUNCTION=’partial(1,“ZZ“,0)‘)
ALTER TABLE [xpertBlog].[dbo].[Zahlungsdaten]
ALTER COLUMN [Kreditkartennr] ADD MASKED WITH (FUNCTION=’random(1,9999)‘)
ALTER TABLE [xpertBlog].[dbo].[Zahlungsdaten]
ALTER COLUMN [Email] ADD MASKED WITH (FUNCTION=’email()‘)
Jetzt sind unsere sensiblen Spalten maskiert und sehen beispielsweise für Benutzer mit Leseberechtigungen nun so aus:
Ich finde dieses Feature echt gut geeignet, um sensible Daten in Berichten zu maskieren. Dies lässt sich nun mit nur wenigen ALTER TABLE-Anweisungen relativ schnell umsetzen!
Seid gespannt auf unsere weiteren Beiträge zum neuen SQL Server 2016 und auch anderen interessanten Themen rund um Daten!
Geschrieben von Arthur Leinweber