Planen und Implementieren der dynamischen Datenmaskierung

Abgeschlossen

Azure SQL-Datenbank, Azure SQL Managed Instance und Azure Synapse Analytics unterstützen die dynamische Datenmaskierung. Dynamische Datenmaskierung schränkt die Offenlegung sensibler Daten ein, indem diese für nicht berechtigte Benutzer maskiert werden.

Dynamische Datenmaskierung hilft beim Verhindern des unbefugten Zugriffs auf sensible Daten, indem Kunden festlegen dürfen, welcher Anteil der sensiblen Daten mit minimalen Auswirkungen auf die Anwendungsschicht offengelegt wird. Es handelt sich um eine richtlinienbasierte Sicherheitsfunktion, die die sensiblen Daten im Resultset einer Abfrage in festgelegten Datenbankfeldern ausblendet, während die Daten in der Datenbank nicht geändert werden.

Beispielsweise könnte ein Servicemitarbeiter in einem Callcenter einen Anrufer identifizieren, indem er mehrere Zeichen seiner E-Mail-Adresse bestätigt. Die ganze E-Mail-Adresse sollte ihm aber nicht offengelegt werden. Es kann eine Maskierungsregel definiert werden, die alle E-Mail-Adressen im Resultset einer beliebigen Abfrage maskiert. In einem weiteren Beispiel kann eine entsprechende Datenmaske zum Schutz personenbezogener Daten definiert werden, damit ein Entwickler Produktionsumgebungen zu Problembehandlungszwecken abfragen kann, ohne gegen Vorschriften zu verstoßen.

Grundlegendes zur dynamischen Datenmaskierung

Sie richten eine Richtlinie für die dynamische Datenmaskierung im Azure-Portal ein, indem Sie im Konfigurationsbereich Ihrer SQL-Datenbank-Instanz unter „Sicherheit“ das Blatt Dynamische Datenmaskierung auswählen.

Richtlinie für die dynamische Datenmaskierung

  • Von der Maskierung ausgeschlossene SQL-Benutzer*innen: Eine Gruppe von SQL-Benutzer*innen oder Microsoft Entra ID-Identitäten, deren Daten in den SQL-Abfrageergebnissen nicht maskiert werden Benutzer mit Administratorrechten sind immer von der Maskierung ausgeschlossen und bekommen Originaldaten ohne Maskierung angezeigt.
  • Maskierungsregeln: Eine Gruppe von Regeln, die die zu maskierenden Felder und verwendete Maskierungsfunktion definieren. Mithilfe eines Datenbankschemanamens, Tabellennamens und Spaltennamens können die vorgesehenen Felder bestimmt werden.
  • Maskierungsfunktionen: Eine Reihe von Methoden, die die Anzeige von Daten in verschiedenen Szenarios steuern.
Function Beschreibung Beispiele
Standard Die vollständige Maskierung gemäß der Datentypen der festgelegten Felder.

Verwenden Sie XXXX (oder weniger Platzhalter) für Zeichenfolgendatentypen, wenn die Größe des Felds weniger als 4 Zeichen umfasst (char, nchar, varchar, nvarchar, text, ntext).

Verwenden Sie für numerische Datentypen den Wert 0 (null) (bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real).

Verwenden Sie für die Datums- und Uhrzeitdatentypen 1900-01-01 00:00:00.0000000 (date, datetime2, datetime, datetimeoffset, smalldatetime, time).

Verwenden Sie für binäre Datentypen ein Einzelbyte des ASCII-Werts 0 (binary, varbinary, image).
Beispielsyntax einer Spaltendefinition: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL

Beispiel für die alter-Syntax: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')
E‑Mail Eine Maskierungsmethode, die den ersten Buchstaben einer E-Mail-Adresse und das konstante Suffix „.com“ in Form einer E-Mail-Adresse verfügbar macht. aXXX@XXXX.com. Beispieldefinitionssyntax: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

Beispiel für die alter-Syntax: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
Zufällig Eine zufällige Maskierungsfunktion, die für alle numerischen Typen verwendet werden kann, um den ursprünglichen Wert mit einem zufälligen Wert innerhalb eines bestimmten Bereichs zu maskieren. Beispieldefinitionssyntax: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])')

Beispiel für die alter-Syntax: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')
Benutzerdefinierte Zeichenfolge Eine Maskierungsmethode, die den ersten und letzten Buchstaben verfügbar macht und in der Mitte eine benutzerdefinierte Zeichenfolge zur Auffüllung hinzufügt. Präfix,[Abstand], Suffix

Wenn der ursprüngliche Wert zu kurz ist, um die gesamte Maske zu vervollständigen, wird ein Teil des Präfixes oder Suffixes nicht angezeigt.
Beispieldefinitionssyntax: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL

Beispiel für die alter-Syntax: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')

Dadurch wird eine Telefonnummer wie 555.123.1234 in 5XXXXXXX umgewandelt.

Weiteres Beispiel:

ALTER COLUMN [Telefonnummer] ADD MASKED WITH (FUNCTION = 'partial(5;"XXXXXXX",0)')

Dadurch wird eine Telefonnummer wie 555.123.1234 in 555.1XXXXXXX umgewandelt.
Datetime Gilt für: SQL Server 2022 (16.x)

Maskierungsmethode für Spalten, die mit dem Datentyp datetime, datetime2, datetime, datetime oder smalldatetime definiert sind. Sie hilft beim Maskieren des Jahres => datetime("Y"), month=> datetime("M"), day=>datetime("D"), hour=>datetime("h"), minute=>datetime("m") oder seconds=>datetime("s") portion of the day.
Beispiel für das Maskieren des Jahres im datetime-Wert:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("Y")')

Beispiel zum Maskieren des Monats im datetime-Wert:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("M")')

Beispiel zum Maskieren der Minute im datetime-Wert:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("m")')
Maskierungsfunktion Maskierungslogik
Standard Vollständige Maskierung anhand der Datentypen der festgelegten Felder

* Verwenden Sie XXXX (oder weniger X-Zeichen), wenn die Größe des Felds weniger als 4 Zeichen für Zeichenfolgendatentypen (nchar, ntext, nvarchar) beträgt.
* Für numerische Datentypen (bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real) einen Nullwert verwenden.
* Verwenden Sie 1900-01-01 für Datums-/Uhrzeitdatentypen (date, datetime2, datetime, datetimeoffset, smalldatetime, time).
* Für sql-variant wird der Standardwert des aktuellen Typs verwendet.
* Für XML wird das Dokument <masked />verwendet.
* Für spezielle Datentypen (timestamp, table, HierarchyID, uniqueidentifier, binary, image, varbinary und räumliche Typen) einen leeren Wert verwenden.
Kreditkarte Maskierungsmethode, die die letzten vier Ziffern der festgelegten Felder anzeigt und eine Konstantenzeichenfolge als Präfix in Form einer Kreditkarte hinzufügt.

XXXX-XXXX-XXXX-1234
E‑Mail Maskierungsmethode, die den ersten Buchstaben und die Domäne durch „XXX.com“ ersetzt und dafür eine Konstantenzeichenfolge als Präfix in Form einer E-Mail-Adresse verwendet.

aXX@XXXX.com
Zufallszahl Maskierungsmethode, die eine Zufallszahl entsprechend den ausgewählten Grenzen und den tatsächlichen Datentypen generiert. Wenn die festgelegten Grenzen gleich sind, ist die Maskierungsfunktion eine konstante Zahl.

Screenshot der Maskierungsmethode zum Generieren einer Zufallszahl.
Benutzerdefinierter Text Maskierungsmethode, die die ersten und letzten Zeichen anzeigt und in der Mitte eine benutzerdefinierte Auffüllzeichenfolge hinzufügt. Wenn die ursprüngliche Zeichenfolge kürzer als das verfügbar gemachte Präfix und Suffix ist, wird nur die Auffüllzeichenfolge verwendet.

prefix[padding]suffix

Screenshot: Navigationsbereich.

Das DDM-Empfehlungsmodul kennzeichnet bestimmte Felder aus Ihrer Datenbank als potenziell sensible Felder, was für die Maskierung geeignet sein kann. Im Bereich Dynamische Datenmaskierung im Portal werden die empfohlenen Spalten für Ihre Datenbank angezeigt. Wählen Sie Maske hinzufügen für mindestens eine Spalte aus, und wählen Sie dann die entsprechende Maskierungsfunktion und Speichern aus, um die Maske für diese Felder anzuwenden.

Verwalten der dynamischen Datenmaskierung mit T-SQL

Einrichten der dynamischen Datenmaskierung für Ihre Datenbank mithilfe von PowerShell-Cmdlets

Datenmaskierungsrichtlinien

Datenmaskierungsregeln

Einrichten der dynamischen Datenmaskierung für Ihre Datenbank mithilfe der REST-API

Sie können die REST-API verwenden, um Datenmaskierungsrichtlinien und -regeln programmgesteuert zu verwalten. Die veröffentlichte REST-API unterstützt die folgenden Vorgänge:

Datenmaskierungsrichtlinien

  • Erstellen oder aktualisieren: Erstellt oder aktualisiert eine Datenbank-Datenmaskierungsrichtlinie.
  • Get (Abrufen): Ruft eine Datenbank-Datenmaskierungsrichtlinie ab.

Datenmaskierungsregeln

Berechtigungen

Dies sind die eingebauten Rollen, mit denen die dynamische Datenmaskierung konfiguriert wird:

Dies sind die erforderlichen Maßnahmen zur Verwendung der dynamischen Datenmaskierung:

Read/Write:

  • Microsoft.Sql/servers/databases/dataMaskingPolicies/*

Lesen:

  • Microsoft.Sql/servers/databases/dataMaskingPolicies/read

Schreiben:

  • Microsoft.Sql/servers/databases/dataMaskingPolicies/write

Um mehr über Berechtigungen bei der Verwendung von dynamischer Datenmaskierung mit dem T-SQL-Befehl zu erfahren, siehe Berechtigungen

Beispiel für präzise Berechtigung

Verhindern Sie nicht autorisierten Zugriff auf vertrauliche Daten und gewinnen Sie die Kontrolle, indem Sie sie für nicht autorisierte Benutzer auf verschiedenen Ebenen der Datenbank maskieren. Sie können Datenbankbenutzern oder -rollen die UNMASK-Berechtigungen auf Datenbank-, Schema-, Tabellen- oder Spaltenebene erteilen oder entziehen. In Kombination mit der Microsoft Entra-Authentifizierung können UNMASK-Berechtigungen für Benutzer, Gruppen und Anwendungen verwaltet werden, die in der Azure-Umgebung enthalten sind. Die UNMASK-Berechtigung bietet eine präzise Möglichkeit, nicht autorisierten Zugriff auf die in der Datenbank gespeicherten Daten zu steuern und einzuschränken und die Datensicherheitsverwaltung zu verbessern.

  1. Erstellen eines Schemas für Benutzertabellen:

    CREATE SCHEMA Data;
    GO
    
    
    
  2. Erstellen einer Tabelle mit maskierten Spalten:

    CREATE TABLE Data.Membership (
        MemberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED,
        FirstName VARCHAR(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
        LastName VARCHAR(100) NOT NULL,
        Phone VARCHAR(12) MASKED WITH (FUNCTION = 'default()') NULL,
        Email VARCHAR(100) MASKED WITH (FUNCTION = 'email()') NOT NULL,
        DiscountCode SMALLINT MASKED WITH (FUNCTION = 'random(1, 100)') NULL,
        BirthDay DATETIME MASKED WITH (FUNCTION = 'default()') NULL
    );
    
    
  3. Einfügen von Beispieldaten:

    INSERT INTO Data.Membership (FirstName, LastName, Phone, Email, DiscountCode, BirthDay)
    VALUES
    ('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com', 10, '1985-01-25 03:25:05'),
    ('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 5, '1990-05-14 11:30:00'),
    ('Shakti', 'Menon', '555.123.4570', 'SMenon@contoso.net', 50, '2004-02-29 14:20:10'),
    ('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 40, '1990-03-01 06:00:00');
    
    
    
  4. Erstellen eines Schemas für Diensttabellen:

    CREATE SCHEMA Service;
    GO
    
    
  5. Erstellen einer Diensttabelle mit maskierten Spalten:

    CREATE TABLE Service.Feedback (
        MemberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED,
        Feedback VARCHAR(100) MASKED WITH (FUNCTION = 'default()') NULL,
        Rating INT MASKED WITH (FUNCTION = 'default()'),
        Received_On DATETIME
    );
    
    
  6. Einfügen von Beispieldaten:

    INSERT INTO Service.Feedback (Feedback, Rating, Received_On)
    VALUES
    ('Good', 4, '2022-01-25 11:25:05'),
    ('Excellent', 5, '2021-12-22 08:10:07'),
    ('Average', 3, '2021-09-15 09:00:00');
    
    
    
  7. Erstellen verschiedener Benutzer in der Datenbank:

    CREATE USER ServiceAttendant WITHOUT LOGIN;
    GO
    CREATE USER ServiceLead WITHOUT LOGIN;
    GO
    CREATE USER ServiceManager WITHOUT LOGIN;
    GO
    CREATE USER ServiceHead WITHOUT LOGIN;
    GO
    
    
    
  8. Erteilen von Leseberechtigungen für die Benutzer in der Datenbank:

    ALTER ROLE db_datareader ADD MEMBER ServiceAttendant;
    ALTER ROLE db_datareader ADD MEMBER ServiceLead;
    ALTER ROLE db_datareader ADD MEMBER ServiceManager;
    ALTER ROLE db_datareader ADD MEMBER ServiceHead;
    
    
    
  9. Erteilen verschiedener UNMASK-Berechtigungen für Benutzer:

    --Grant column level UNMASK permission to ServiceAttendant
    GRANT UNMASK ON Data.Membership(FirstName) TO ServiceAttendant;
    
    
    
    -- Grant table level UNMASK permission to ServiceLead
    GRANT UNMASK ON Data.Membership TO ServiceLead;
    
    
    
    -- Grant schema level UNMASK permission to ServiceManager
    GRANT UNMASK ON SCHEMA::Data TO ServiceManager;
    GRANT UNMASK ON SCHEMA::Service TO ServiceManager;
    
    
    
    --Grant database level UNMASK permission to ServiceHead;
    GRANT UNMASK TO ServiceHead;
    
    
    
  10. Abfragen der Daten im Kontext des ServiceAttendant-Benutzers:

    EXECUTE AS USER = 'ServiceAttendant';
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    REVERT;
    
    
    
  11. Abfragen der Daten im Kontext des ServiceLead-Benutzers:

    EXECUTE AS USER = 'ServiceLead';
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    REVERT;
    
    
    
  12. Abfragen der Daten im Kontext des ServiceManager-Benutzers:

    EXECUTE AS USER = 'ServiceManager';
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    REVERT;
    
    
    
  13. Abfragen der Daten im Kontext des ServiceHead-Benutzers:

    EXECUTE AS USER = 'ServiceHead';
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    REVERT;
    
    
    
  14. Verwenden Sie zum Widerrufen von UNMASK-Berechtigungen die folgenden T-SQL-Anweisungen:

    REVOKE UNMASK ON Data.Membership(FirstName) FROM ServiceAttendant;
    REVOKE UNMASK ON Data.Membership FROM ServiceLead;
    REVOKE UNMASK ON SCHEMA::Data FROM ServiceManager;
    REVOKE UNMASK ON SCHEMA::Service FROM ServiceManager;
    REVOKE UNMASK FROM ServiceHead;