info@madafa.de

Sensible Daten in SQL Server schützen

Der Schutz von sensiblen und sensitiven Daten ist heut zu Tage wichtiger denn je. Mit dem Dynamic Data Masking hat SQL Server 2016 ein Sicherheitsfeature integriert, dass den Zugriff auf sensible Daten von nicht autorisierten Benutzern auf Datenbankebene verhindert.

In der Anwendung könnte es beispielsweise so aussehen, dass dem Entwickler der Zugriff auf Produktionsdaten zur Fehlerbehebung gewährt wird, jedoch sensible Daten geschützt und nicht zugänglich gemacht werden. Damit kann der Prozess der Fehlerbehebung weiter durchgeführt werden, ohne sensible Daten offen zu legen. Ein weiteres Beispiel ist ein Callcenter Mitarbeiter, der einem Kunden bei einer Anfrage weiterhilft und somit Zugriff auf personenbezogene Daten erhält, jedoch kritische Finanzdaten, wie Bankkontonummer oder Kreditkartennummer, maskiert werden.

Der Vorteil am DDM (Abkürzung Dynamic Data Masking) ist die simple und flexible Implementierung durch einfache T-SQL Befehle in SQL Server. Durch einfache Methoden, kann das DDM individuell auf eigene Bedürfnisse konfiguriert und gestaltet werden. Sie legen beispielsweise fest, welche sensiblen Daten in den Bereich der gewünschten Datenmaskierung fallen, sodass Sie bei bestimmten Abfragen ausgeblendet werden. Somit müssen keine komplexen Verschlüsselungsanwendungen auf Anwenderseite vorgenommen werden.

Maskierungsfunktionen

Es gibt 4 Varianten von Maskierungsfunktionen, die im DDM konfiguriert werden können.

→ Standardfunktion / Default
Die Standardfunktion maskiert Daten entsprechend dem Felddatentyp. Ist der Felddatentyp binär, varbinär oder ein Image, wird ein einziges Byte mit dem binären Wert 0 verwendet, um das entsprechende Feld zu maskieren. Bei einem numerischen Datentyp wird das Feld mit einem Nullwert maskiert. Ist der Datentyp eine Zeichenfolge, wird das “X” zum Maskieren verwendet.

→ Email-Funktion
Die nächste Maskierungsmethode nennt sich “Email-Funktion”. In diesen Feldern ist in der Regel eine Emailadresse gespeichert, die ebenfalls als sensibel gilt und entsprechend maskiert werden soll. Die Maskierung sieht letztlich beispielsweise so aus: bXXX@XXX.de

→ Zufallsmaskierung
Die Zufallsmaskierung wird verwendet, um alle numerischen Datentypen zu maskieren. Hier wird der ursprüngliche Wert mit einem zufälligen Wert innerhalb eines spezifizierten Bereichs verwendet.

→ Custom Funktion
Die letzte Maskierungsfunktion nennt sich Custom Funktion. Wie sich dem Namen nach vermuten lässt, können Sie hier selbst die Maskierungsform pro individuellem Feld festlegen. Sie legen hier beispielsweise den ersten und letzten Buchstaben fest, der durch ein Präfix und Suffix definiert ist. Die Mitte wird dann in Form eines Präfix dargestellt.

Berücksichtigen Sie, dass das DDM oft durch vorher konfigurierte Abhängigkeiten fehlschlagen kann. Beispielsweise betrifft dies Spalten, die mit FILE STREAM, COLUMN_SET, SPARSE COLUMN oder mit einem FULLTEXT-Index konfiguriert sind. Wenn die zu maskierenden Daten Teil einer Spalte sind, die einem Index angehören oder mit einer Art von Abhängigkeit belastet sind, wird die Maskierung nicht wie gewünscht vorgenommen. Auch können in diesem Fall Anwender die Maskierungen deaktivieren.

Vorgehen

Wir beginnen nun mit einfachen Schritten die Konfiguration der dynamischen Datenmaskierung (DDM). Hierfür erstellen wir eine Datenbank mit dem Namen TestDB und erstellen eine Tabelle, die wir in diesem Fall User_Credentials nennen und in der kritische Daten gespeichert werden.

USE TestDB
GO
CREATE TABLE User_Credentials (
Usr_ID INT IDENTITY(1, 1) PRIMARY KEY
,Usr_First_Name NVARCHAR(10) NOT NULL
,Usr_Last_Name NVARCHAR(10) NOT NULL
,Usr_Date_Of_Birth DATETIME NULL
,Usr_Salary INT NULL
,Usr_Email NVARCHAR(50) NULL
,Usr_Employment_Date DATETIME NULL
)

Ist die Tabelle erstellt worden, befüllen wir diese mit entsprechenden Datensätzen aus einem SQL Testdatengenerator. Wir fügen in unserem Fall beispielsweise Gehaltsdaten und Kontonummer ein und erstellen danach einen Testbenutzer, der über einen Lesezugriff verfügt.

CREATE USER DDMUser WITHOUT LOGIN;  
GRANT SELECT ON User_Credentials TO DDMUser;    

Versucht dieser Benutzer mit einer simplen Abfrage nun vertrauliche Daten der Mitarbeiter aus der angelegten Tabelle User_Credentials abzurufen, werden – wie Sie nachfolgend sehen werden – alle sensiblen Daten offen ausgespielt.

USE TestDB
GO
EXECUTE AS USER = 'DDMUser';  
SELECT * FROM User_Credentials;  
REVERT;

Dieser Vorgang kann eine betriebliche Katastrophe bedeuten, denn man weiß nie genau, welche Intention derjenige mit den Mitarbeiterdaten hat. Um diese Katastrophe zu vermeiden, verwenden wir das dynamische Datenmaskierungssystem und maskieren sensible Daten, um diese vor Datenklau oder Misshandlung zu schützen.
Zunächst maskieren wir den Nachnamen der Mitarbeiter mit der Standardmaskierungsfunktion. Dafür verwenden wir die ALTER TABLE..ALTER COLUMN T-SQL Anweisung:

ALTER TABLE User_Credentials  
ALTER COLUMN Usr_Last_Name varchar(10) MASKED WITH (FUNCTION = 'default()');   

Nun fordern wir den vermeidlichen Übeltäter erneut auf, eine Abfrage zu starten:

EXECUTE AS USER = 'DDMUser';  
SELECT * FROM User_Credentials;  
REVERT; 

Wie Sie nachfolgend sehen können, wurden nun die Nachnamen der Mitarbeiter durch xxxx ersetzt und erfolgreich maskiert.

Wichtig zu Wissen ist, dass sich intern in der Datenbank nichts ändert. Führen Sie die gleiche Abfrage als Datenbankadministrator durch werden Sie sehen, dass die Werte – wie eingegeben – dargestellt werden.

Da uns jedoch die Maskierung des Nachnamens nicht ausreicht, führen wir weitere Maskierungen der sensiblen Daten durch. Um die Emailadresse maskieren zu lassen, verwenden wir nachfolgend die Email-Funktion:

ALTER TABLE User_Credentials 
ALTER COLUMN EMP_Email nvarchar(50) MASKED WITH (FUNCTION = 'Email()');   

Ruft der User nun unsere Tabelle wieder auf, wird er feststellen, dass die Emailadressen der Mitarbeiter vollständig maskiert wurden.

Mit der Zufallsmaskierungsfunktion können wir zum Beispiel Gehaltsinformationen durch zufällige Werte zwischen 1 und 9 ersetzen lassen.

ALTER TABLE User_Credentials 
ALTER COLUMN Usr_Salary int MASKED WITH (FUNCTION='random(1,9)');

Wird eine erneute Abfrage gestartet, bekommen wir folgendes Ergebnis:

Möchten wir jedoch mehr als eine Spalte maskieren lassen, können wir die Konfiguration mittels der Custom Funktion individuell vornehmen. Wir entscheiden uns nun nicht nur den Nachnamen zu maskieren – wir maskieren zusätzlich den Vornamen. Dafür sollen nur die ersten 3 und die letzten 3 Buchstaben angezeigt werden. Ist der Vorname kürzer als der angegebene Wert, wird der Wert durch den Wert XXXX ersetzt.

ALTER TABLE User_Credentials
ALTER COLUMN Usr_First_name nvarchar(10) MASKED WITH (FUNCTION= 'partial(3,"XXXX",3)');

Wir haben bereits erwähnt, dass die Daten nicht physisch verändert wurden. Mit den entsprechenden Berechtigungen in einem Administratorkonto, haben Sie weiterhin Zugriff auf die ursprüngliche Darstellung der Tabelle inklusive aller sensiblen Daten. So simpel auch die Datenmaskierung vorgenommen werden kann, so leicht kann sie auch wieder deaktiviert werden. Das bedeutet, dass User theoretisch die Maskierung mittels dem UNMASK Befehls alle Konfigurationen rückgängig machen könnten. Um das zu verhindern, legen wir fest, dass diese Konfiguration nicht widerrufen werden kann.

GRANT UNMASK TO DDMUser
GO
EXECUTE AS USER = 'DDMUser';  
SELECT * FROM User_Credentials;  
REVERT; 
GO
REVOKE UNMASK TO DDMUser
EXECUTE AS USER = 'DDMUser';  
SELECT * FROM User_Credentials;  
REVERT; 1GRANT UNMASK TO DDMUser 2GO 3EXECUTE AS USER = 'DDMUser'; 4SELECT * FROM User_Credentials; 5REVERT; 6GO 7REVOKE UNMASK TO DDMUser 8EXECUTE AS USER = 'DDMUser'; 9SELECT * FROM User_Credentials; 10REVERT;

Folgend zeigen wir Ihnen die unterschiedlichen Ergebnisse je nach Berechtigung:

Die Systemkatalogansicht sys.masked_columns kann verwendet werden, um Informationen zur Konfiguration der dynamischen Datenmaskierung abzurufen. Der Wert 1 der Spalte IsMasked gibt an, dass die Spalte mit einer Maskierungsfunktion ausgestattet wurde. Die Spalte MaskingFunction gibt an, mit welcher Funktion die Spalte konfiguriert und maskiert wurde. Mit folgender T-SQL Abfrage können Sie die DDM Informationen abrufen, in dem Sie sys.masked_columns mit der sys.tables Ansicht verknüpfen.

SELECT TBLS.name as TableName,MC.NAME ColumnName, MC.is_masked IsMasked, MC.masking_function MaskFunction  
FROM sys.masked_columns AS MC 
JOIN sys.tables AS TBLS   
ON MC.object_id = TBLS.object_id  
WHERE is_masked = 1;   

Die Maskierung kann mit folgendem T-SQL Befehl rückgängig gemacht werden, die ihm/ihr dann erlaubt, den Vornamen des Mitarbeiters einsehen zu können.

ALTER TABLE User_Credentials
ALTER COLUMN Usr_First_name DROP MASKED;
EXECUTE AS USER = 'DDMUser';  
SELECT * FROM User_Credentials;  
REVERT;

Ein Vorteil der Datenmaskierung ist vor allem der Überraschungseffekt. Denn plant ein Übeltäter beispielsweise einen Datenklau und hofft sensible Daten missbrauchen zu können, wird er erstaunt sein, dass diese Daten ihm verwehrt bleiben. Die Befehle wie SELECT INTO, INSERT INTO schlagen dann fehl bzw. kopieren nur maskierte Daten in den Export Wizard.

Wird beispielsweise versucht, Daten aus der Tabelle User_Credentials in einer andere Tabelle namens Test mit folgendem Befehl zu kopieren, erhalten wir nachstehendes Ergebnis:

EXECUTE AS USER = 'DDMUser'; 
INSERT INTO [dbo].[Test]
           ([Usr_First_Name]
           ,[Usr_Last_Name]
           ,[Usr_Date_Of_Birth]
           ,[Usr_Salary]
           ,[Usr_Email]
           ,[Usr_Employment_Date])
SELECT [Usr_First_Name]
           ,[Usr_Last_Name]
           ,[Usr_Date_Of_Birth]
           ,[Usr_Salary]
           ,[Usr_Email]
           ,[Usr_Employment_Date] 
		   FROM User_Credentials
     
SELECT * FROM Test

Die Datenmaskierung wurde erfolgreich durchgeführt und der nicht autorisierte Benutzer kann somit nicht auf sensible Daten zugreifen.

Fazit

Mit diesem Sicherheitsfeature macht SQL Server einen enormen Fortschritt in der Absicherung von Daten und gleichzeitigem Schutz vor unautorisierten Nutzern. Durch einfache Maskierungsbefehle werden sensible Daten maskiert und unkenntlich gemacht. Mit simplen T-SQL Befehlen können Sie die Konfiguration der dynamischen Datenmaskierung vornehmen. Als Spezialisten auf dem Gebiet von SQL Server stehen wir Ihnen gerne Rede und Antwort zu individuellen Fragen zu Themen wie zum Beispiel “Datenmaskierung”. Kontaktieren Sie uns gerne über unser Kontaktformular und lassen sich von uns professionell beraten.