Verwenden von Zuordnungstabellen für die dynamische Zugriffssteuerung

In diesem Lernprogramm wird gezeigt, wie Sie eine Zuordnungstabelle verwenden, um den Zugriff auf Zeilenebene und den Zugriff auf Spaltenebene zu steuern, ohne eine große Anzahl von Gruppen zu verwalten. Eine einzelne Nachschlagetabelle steuert sowohl die Zeilenfilterung als auch die Spaltenmaske. Änderungen des Zugriffs erfordern nur eine Zeilenaktualisierung. Sie müssen keine neuen Gruppen erstellen oder Richtlinien neu schreiben.

In diesem Lernprogramm wird auch die bedingte Maskierung veranschaulicht: PII-Spalten werden je nach Wert einer anderen Spalte in derselben Zeile unterschiedlich maskiert. Die Bestellungen, die als confidential markiert sind, haben ihre personenbezogenen Daten unabhängig von der Sicherheitsstufe des Benutzers vollständig geschwärzt.

Allgemeine Anleitungen zum Zuordnungstabellenentwurf finden Sie unter Verwenden von Zuordnungstabellen zum Erstellen einer Zugriffssteuerungsliste.

Voraussetzungen

  • Databricks Runtime 16.4 oder höher oder serverloses Computing.
  • Kontoadministrator- oder Arbeitsbereichsadministratorberechtigungen (zum Erstellen von geregelten Tags).
  • MANAGE Berechtigung für den Zielkatalog oder das Zielschema.
  • EXECUTE auf den UDFs.
  • Ein SQL-Notizbuch oder Abfrage-Editor.

Szenario

Ihre Organisation verfügt über Mitarbeiter in vier Regionen (USA Ost, USA West, EU, APAC) und vier Abteilungen. Jeder Benutzer sollte nur die Zeilen sehen, die mit seiner Region und Abteilung übereinstimmen, und PII-Spalten sollten basierend auf zwei Faktoren maskiert werden: der Freigabestufe (full, masked oder none), die in einer Zuordnungstabelle gespeichert ist, und dem order_priority der Bestellung.

Bei einem gruppenbasierten Ansatz benötigen Sie eine Gruppe für jede Regionsabteilungskombination. Sie benötigen beispielsweise 16 Gruppen für vier Regionen und vier Abteilungen. Durch das Hinzufügen von PII-Freigabeebenen verdreifacht sich die Anzahl. Jede neue Region oder Abteilung erfordert neue Gruppen und Richtlinienupdates.

Der Ansatz der Zuordnungstabelle ersetzt dies durch eine einzelne Nachschlagetabelle: eine Zeile pro Benutzer, eine Spalte pro Zugriffsdimension. Um den Zugriff eines Benutzers zu ändern, aktualisieren Sie eine Zeile.

Schritt 1: Erstellen von gesteuerten Tags

Erstellen Sie vor dem Ausführen von SQL die folgenden geregelten Tags in der Benutzeroberfläche des Katalog-Explorers (Katalog>>Governed Tags>Create governed tag):

Tag-Schlüssel Zulässige Werte
region (Schlüssel-Tag nur)
department (Schlüssel-Tag nur)
pii name, email
priority (Schlüssel-Tag nur)

Die Tags region und department teilen der Zeilenfilterrichtlinie mit, welche Spalten an die Filter-UDF übergeben werden sollen. Das pii-Tag teilt den Spaltenmaskierungsrichtlinien mit, welche Spalten zu maskieren sind und welchen PII-Typen sie enthalten. Der priority-Tag ermöglicht es den Spaltenmaskenrichtlinien, den order_priority-Wert an die Masken-UDF zur bedingten Maskierung zu übergeben.

Warnung

Tagdaten werden als Nur-Text gespeichert und können global repliziert werden. Verwenden Sie keine Tagnamen, Werte oder Deskriptoren, die die Sicherheit Ihrer Ressourcen gefährden könnten. Verwenden Sie beispielsweise keine Tagnamen, Werte oder Deskriptoren, die persönliche oder vertrauliche Informationen enthalten.

Schritt 2: Erstellen von Beispieldaten

Erstellen Sie eine Katalog-, Schema- und Auftragstabelle. Die order_priority Spalte steuert die bedingte Maskierung: Bestellungen, die als confidential gekennzeichnet sind, haben ihre personenbezogenen Daten vollständig geschwärzt, auch für Benutzer mit hoher Sicherheitsfreigabe.

CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;

CREATE SCHEMA IF NOT EXISTS mapping_demo;
USE SCHEMA mapping_demo;
CREATE OR REPLACE TABLE orders (
  order_id INT,
  customer_name STRING,
  customer_email STRING,
  sales_region STRING,
  dept STRING,
  amount DOUBLE,
  order_date DATE,
  order_priority STRING
);

INSERT INTO orders VALUES
  (1,  'Acme Corp',     'orders@acme.com',    'us_east', 'engineering', 50000,  '2025-01-15', 'standard'),
  (2,  'Beta Inc',      'sales@beta.com',     'us_east', 'sales',       75000,  '2025-02-01', 'confidential'),
  (3,  'Gamma LLC',     'info@gamma.com',     'us_west', 'engineering', 30000,  '2025-01-20', 'standard'),
  (4,  'Delta Co',      'deals@delta.com',    'us_west', 'sales',       95000,  '2025-03-01', 'confidential'),
  (5,  'Epsilon GmbH',  'kontakt@epsilon.de', 'eu',      'engineering', 45000,  '2025-02-15', 'standard'),
  (6,  'Zeta SA',       'contact@zeta.fr',    'eu',      'sales',       62000,  '2025-01-30', 'standard'),
  (7,  'Eta Ltd',       'hello@eta.sg',       'apac',    'marketing',   28000,  '2025-03-10', 'confidential'),
  (8,  'Theta Corp',    'biz@theta.com',      'us_east', 'marketing',   55000,  '2025-02-20', 'standard'),
  (9,  'Iota KK',       'info@iota.jp',       'apac',    'engineering', 41000,  '2025-01-25', 'standard'),
  (10, 'Kappa Inc',     'sales@kappa.com',    'us_west', 'marketing',   33000,  '2025-03-05', 'standard');

Schritt 3: Anwenden geregelter Tags

Markieren Sie die Spalten, damit ABAC-Richtlinien sie automatisch ermitteln können. Die order_priority Spalte wird mit dem Nur-Schlüssel-Tag priority markiert, sodass die Spaltenformatrichtlinien sie über MATCH COLUMNS die Maske abgleichen und ihren Wert an die UDF-Maske übergeben können.

ALTER TABLE abac_tutorial.mapping_demo.orders
  ALTER COLUMN sales_region SET TAGS ('region' = '');
ALTER TABLE abac_tutorial.mapping_demo.orders
  ALTER COLUMN dept SET TAGS ('department' = '');
ALTER TABLE abac_tutorial.mapping_demo.orders
  ALTER COLUMN customer_name SET TAGS ('pii' = 'name');
ALTER TABLE abac_tutorial.mapping_demo.orders
  ALTER COLUMN customer_email SET TAGS ('pii' = 'email');
ALTER TABLE abac_tutorial.mapping_demo.orders
  ALTER COLUMN order_priority SET TAGS ('priority' = '');

Schritt 4: Die Zuordnungstabelle erstellen

Anstatt Gruppen für jede Region, Abteilung und Freigabekombination zu erstellen, verwalten Sie eine Tabelle mit einer Zeile pro Benutzer. Die pii_access Spalte steuert, wie PII-Spalten angezeigt werden:

  • full — siehe den tatsächlichen Wert (für Aufträge mit Standardpriorität)
  • masked — einen Teilwert wie A*** oder z. B. o***@acme.com
  • none — siehe ***REDACTED***

Die expires_on Spalte legt ein Ablaufdatum für jeden Zugriffseintrag fest. Nach diesem Datum beendet der Zeilenfilter UDF die Übereinstimmung mit dem Eintrag, und der Benutzer verliert im Hintergrund den Zugriff ohne manuelle Sperrung. Dies ist nützlich für Auftragnehmer, temporäre Vereinbarungen zur Datenfreigabe oder zeitlich begrenzte Projekte.

Wenn ein Benutzer Zugriff auf mehrere Regions- und Abteilungskombinationen benötigt, fügen Sie zusätzliche Zeilen hinzu.

Note

Erstellen Sie kleine und einfache Zuordnungstabellen. Jede Abfrage für eine geschützte Tabelle führt den Zeilenfilter und die Spaltenmaske UDFs aus, die wiederum die Zuordnungstabelle abfragen. Große Zuordnungstabellen und komplexe UDF-Logik können sich auf die Abfrageleistung auswirken. Verwenden Sie schmale Schemas und beschränken Sie die UDF-Logik auf einen einzelnen Nachschlagevorgang, soweit möglich.

CREATE OR REPLACE TABLE abac_tutorial.mapping_demo.user_access (
  user_email STRING,
  region STRING,
  department STRING,
  pii_access STRING,
  expires_on DATE
);

INSERT INTO abac_tutorial.mapping_demo.user_access VALUES
  (current_user(),      'us_east', 'engineering', 'masked', '2099-12-31'),
  ('bob@example.com',   'us_west', 'sales',       'full',   '2099-12-31'),
  ('carol@example.com', 'eu',      'engineering', 'none',   '2099-12-31'),
  ('david@example.com', 'apac',    'marketing',   'masked', '2099-12-31');

Schritt 5: Erstellen des Zeilenfilters UDF

Diese UDF empfängt die sales_region- und dept-Werte einer Zeile (übergeben durch die Richtlinie über den Tagabgleich), sucht den aktuellen Benutzer in der Zuordnungstabelle und gibt TRUE nur dann zurück, wenn ein übereinstimmender Eintrag vorhanden ist und nicht abgelaufen ist. Benutzer, die sich nicht in der Zuordnungstabelle befinden oder deren Zugriff abgelaufen ist, sehen keine Zeilen (nicht geschlossener Entwurf).

CREATE OR REPLACE FUNCTION abac_tutorial.mapping_demo.access_filter(
  region_val STRING,
  dept_val STRING
)
RETURNS BOOLEAN
RETURN EXISTS (
  SELECT 1 FROM abac_tutorial.mapping_demo.user_access
  WHERE user_email = current_user()
    AND region = region_val
    AND department = dept_val
    AND expires_on >= current_date()
);

Schritt 6: Spaltenmaske-UDF erstellen

Diese UDF steuert, wie PII-Spalten angezeigt werden. Es sind drei Argumente erforderlich: der Spaltenwert, der PII-Typ ('name' oder 'email') und die Zeile order_priority. Die Maskierungslogik weist zwei Ebenen auf:

  • Ebene 1 (bedingte Maskierung): Wenn order_priorityconfidential ist, wird die PII unabhängig von der Freigabestufe des Benutzers immer vollständig geschwärzt.
  • Layer 2 (Benutzerfreigabe): Bei Standardzeilen überprüft die UDF die Zuordnungstabelle auf die Ebene des pii_access Benutzers und wendet die entsprechende Maske an. Wenn ein Benutzer über mehrere Zuordnungstabelleneinträge verfügt (Zugriff auf mehrere Regionen), gilt die höchste Freigabe für alle Zeilen.
CREATE OR REPLACE FUNCTION abac_tutorial.mapping_demo.pii_mask(
  val STRING,
  pii_type STRING,
  order_pri STRING
)
RETURNS STRING
RETURN CASE
  WHEN order_pri = 'confidential' THEN '***REDACTED***'
  WHEN EXISTS (
    SELECT 1 FROM abac_tutorial.mapping_demo.user_access
    WHERE user_email = current_user() AND pii_access = 'full'
  ) THEN val
  WHEN EXISTS (
    SELECT 1 FROM abac_tutorial.mapping_demo.user_access
    WHERE user_email = current_user() AND pii_access = 'masked'
  ) THEN
    CASE pii_type
      WHEN 'email' THEN CONCAT(LEFT(val, 1), '***@', SUBSTRING_INDEX(val, '@', -1))
      WHEN 'name'  THEN CONCAT(LEFT(val, 1), '***')
      ELSE CONCAT(LEFT(val, 1), '***')
    END
  ELSE '***REDACTED***'
END;

Schritt 7: Erstellen der Richtlinien

Erstellen Sie drei Richtlinien, die alle von derselben Zuordnungstabelle gesteuert werden. Beide Spaltenmaskenrichtlinien verwenden dieselbe pii_mask Funktion. Das pii_type Argument teilt der Funktion mit, welcher Maskierungsstil angewendet werden soll, sodass Sie keine separate UDF pro Spaltentyp benötigen.

Das geregelte Tag priority wird verwendet, um MATCH COLUMNS mit der order_priority Spalte abzugleichen und ihren Wert als order_pri an die Maske UDF zu übergeben. So wird die bedingte Maskierung implementiert: Die Richtlinie übergibt den Prioritätswert der Zeile zur Abfragezeit an die UDF.

CREATE POLICY user_access_filter
ON SCHEMA abac_tutorial.mapping_demo
ROW FILTER abac_tutorial.mapping_demo.access_filter
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag('region') AS r, has_tag('department') AS d
USING COLUMNS (r, d);
CREATE POLICY pii_mask_name
ON SCHEMA abac_tutorial.mapping_demo
COLUMN MASK abac_tutorial.mapping_demo.pii_mask
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'name') AS m,
  has_tag('priority') AS pri
ON COLUMN m
USING COLUMNS ('name', pri);

CREATE POLICY pii_mask_email
ON SCHEMA abac_tutorial.mapping_demo
COLUMN MASK abac_tutorial.mapping_demo.pii_mask
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'email') AS m,
  has_tag('priority') AS pri
ON COLUMN m
USING COLUMNS ('email', pri);

Schritt 8: Überprüfen der Ergebnisse

Ihr Eintrag in der Zuordnungstabelle gibt Ihnen Zugriff auf us_east / engineering mit Freigabe masked. Führen Sie die folgende Abfrage aus, um sicherzustellen, dass nur die Reihenfolge Nr. 1 angezeigt wird, wobei PII teilweise maskiert ist.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Bestellung Nr. 1 hat order_priority = 'standard', sodass Ihre masked Freigabe gilt.

Erwartetes Ergebnis für Ihren Benutzer:

Bestellungs-ID customer_name Kunden-E-Mail Vertriebsregion Abteilung Betrag Bestelldatum Bestellpriorität
1 A*** o***@acme.com us_east Ingenieurwesen 50.000 2025-01-15 Standard

Was andere Benutzer sehen:

Benutzer Sichtbare Bestellungen Bestellpriorität Verhalten von personenbezogenen Daten (PII)
bob@example.com (full Freigabe) Nr. 4 (us_west, Umsatz) Vertraulich ***REDACTED*** — vertrauliche Außerkraftsetzungen full der Freigabe
carol@example.com (none Freigabe) Nr. 5 (EU, Engineering) Standard ***REDACTED***none Freigabe bedeutet vollständige Redaction
david@example.com (masked Freigabe) #7 (APAC, Marketing) Vertraulich ***REDACTED*** — vertrauliche Außerkraftsetzungen masked der Freigabe
(Katalogbesitzer) Alle 10 Alle unmaskiert (der Besitzer ist von Richtlinien ausgenommen)
(nicht aufgelisteter Benutzer) Nichts Zeilenfilter gibt keine Zeilen zurück.

Beachten Sie, dass Bob die Freigabefull hat, aber immer noch ***REDACTED*** sieht, weil die Bestellung #4 confidential ist. Dies ist bedingte Maskierung: Der Prioritätswert der Zeile setzt die Benutzerfreigabe außer Kraft.

Schritt 9: Dynamisches Aktualisieren des Zugriffs

Der Hauptvorteil des Zuordnungstabellenansatzes besteht darin, dass Sie den Zugriff ändern können, indem Sie Zeilen in der Tabelle aktualisieren. Sie müssen keine Richtlinien, benutzerdefinierten Funktionen (UDFs) oder Gruppenmitgliedschaften aktualisieren.

Erneutes Zuweisen zu einer anderen Abteilung

Ändern Sie Ihre Abteilung von engineering zu sales. Order #2 (Beta Inc) ist ein confidential Verkaufsauftrag, sodass dessen PII trotz masked Freigabeeinstufung vollständig redigiert ist.

UPDATE abac_tutorial.mapping_demo.user_access
SET department = 'sales'
WHERE user_email = current_user();

Führen Sie die folgende Abfrage aus, um dies zu überprüfen. Sie sollten die Bestellung Nr. 2 mit ***REDACTED*** personenbezogenen Informationen sehen.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Änderung rückgängig machen:

UPDATE abac_tutorial.mapping_demo.user_access
SET department = 'engineering'
WHERE user_email = current_user();

Upgrade von PII-Freigaben

Ändern Sie Ihre Freigabe von masked zu full. Für Zeilen mit Standardpriorität werden nun die tatsächlichen PII-Werte angezeigt.

UPDATE abac_tutorial.mapping_demo.user_access
SET pii_access = 'full'
WHERE user_email = current_user();

Führen Sie die folgende Abfrage aus, um dies zu überprüfen. Bestellung Nr. 1 hat standard Priorität, daher sollten Sie mit full Freigabe Acme Corp und orders@acme.com sehen können.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Änderung rückgängig machen:

UPDATE abac_tutorial.mapping_demo.user_access
SET pii_access = 'masked'
WHERE user_email = current_user();

Gewähren des Zugriffs auf eine zusätzliche Region

Fügen Sie eine zweite Zeile ein, um Den Zugriff auf EU-Engineering zu gewähren. Es sind keine neuen Gruppen oder Richtlinien erforderlich.

INSERT INTO abac_tutorial.mapping_demo.user_access
VALUES (current_user(), 'eu', 'engineering', 'masked', '2099-12-31');

Führen Sie die folgende Abfrage aus, um dies zu überprüfen. Sie sollten jetzt sowohl die Bestellung Nr. 1 (us_east, Engineering) als auch die Bestellung #5 (eu, Engineering) sehen, wobei PII teilweise maskiert ist.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Entfernen Sie den zusätzlichen Zugriff:

DELETE FROM abac_tutorial.mapping_demo.user_access
WHERE user_email = current_user() AND region = 'eu';

Zugriff beenden

Legen Sie Ihren Zugriffseintrag auf ein vergangenes Datum fest. Die Zeilenfilter-UDF überprüft expires_on >= current_date(), sodass abgelaufene Einträge automatisch ignoriert werden und der Zugriff automatisch widerrufen wird. Dies ist nützlich für Auftragnehmer, Datenfreigabevereinbarungen mit fester Dauer oder zeitlich begrenzte Projekte.

UPDATE abac_tutorial.mapping_demo.user_access
SET expires_on = current_date() - INTERVAL 1 DAY
WHERE user_email = current_user();

Führen Sie die folgende Abfrage aus, um sicherzustellen, dass keine Zeilen angezeigt werden.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Wiederherstellen des Zugriffs mit einem zukünftigen Ablaufdatum:

UPDATE abac_tutorial.mapping_demo.user_access
SET expires_on = '2099-12-31'
WHERE user_email = current_user();

Führen Sie die folgende Abfrage aus, um zu überprüfen, ob der Zugriff wiederhergestellt wird.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Zusammenfassung

In diesem Lernprogramm wurden drei Muster veranschaulicht:

  • Zuordnungstabellenmuster: Eine einzelne Nachschlagetabelle steuert sowohl die Zeilenfilterung als auch die Spaltenmaskierung. Zugriffsänderungen werden vorgenommen, indem Zeilen aktualisiert werden, ohne dass Richtlinien- oder Gruppenänderungen erforderlich sind.
  • Bedingte Maskierung: Die UDF-Maske überprüft die order_priority Spalte in jeder Zeile, um zu entscheiden, wie PII maskiert werden soll. Vertrauliche Zeilen werden unabhängig von der Freigabestufe des Benutzers immer vollständig redigiert, implementiert durch Kennzeichnen order_priority und an die UDF übergeben via MATCH COLUMNS.
  • Ablauf des Zugriffs: Die Zuordnungstabelle enthält ein expires_on Datum. Der Zeilenfilter-UDF überprüft dieses Datum auf current_date(), sodass abgelaufene Zugriffe still ignoriert und automatisch widerrufen werden, ohne dass manuelle Eingriffe erforderlich sind.

Aufräumen

Führen Sie das folgende aus, um alle in diesem Tutorial erstellten Objekte zu entfernen.

DROP POLICY user_access_filter ON SCHEMA abac_tutorial.mapping_demo;
DROP POLICY pii_mask_name ON SCHEMA abac_tutorial.mapping_demo;
DROP POLICY pii_mask_email ON SCHEMA abac_tutorial.mapping_demo;
DROP FUNCTION IF EXISTS abac_tutorial.mapping_demo.access_filter;
DROP FUNCTION IF EXISTS abac_tutorial.mapping_demo.pii_mask;
DROP TABLE IF EXISTS abac_tutorial.mapping_demo.orders;
DROP TABLE IF EXISTS abac_tutorial.mapping_demo.user_access;
DROP SCHEMA IF EXISTS abac_tutorial.mapping_demo CASCADE;

Verwenden Sie die Benutzeroberfläche des Katalog-Explorers, um die verwalteten Tags region, department, pii und priority zu entfernen.