Filtern vertraulicher Tabellendaten mit Zeilenfiltern und Spaltenmasken

Wichtig

Dieses Feature befindet sich in der Public Preview.

Dieser Artikel enthält einen Leitfaden sowie Beispiele für die Verwendung von Zeilenfiltern, Spaltenmasken und Zuordnungstabellen zum Filtern vertraulicher Daten in Ihren Tabellen.

Was sind Zeilenfilter?

Mit Zeilenfiltern können Sie einen Filter auf eine Tabelle anwenden, sodass nachfolgende Abfragen nur Zeilen zurückgeben, für die das Filterprädikat „wahr“ ergibt. Ein Zeilenfilter wird als benutzerdefinierte SQL-Funktion (User-defined Function, UDF) implementiert.

Um einen Zeilenfilter zu erstellen, schreiben Sie zuerst eine SQL-UDF, um die Filterrichtlinie zu definieren. Im Anschluss wenden Sie den Filter mit einer ALTER TABLE-Anweisung auf eine Tabelle an. Alternativ können Sie einen Zeilenfilter für eine Tabelle in der ursprünglichen CREATE TABLE-Anweisung angeben. Sie können für jede Tabelle nur einen Zeilenfilter angeben. Ein Zeilenfilter akzeptiert null oder mehr Eingabeparameter, wobei jeder Eingabeparameter an eine Spalte der entsprechenden Tabelle gebunden wird.

Worin besteht der Unterschied zwischen diesen Filtern und dynamischen Ansichten?

Die dynamische Ansicht ist eine abstrahierte, schreibgeschützte Ansicht einer oder mehrerer Quelltabellen. Der Benutzer kann auf die dynamische Ansicht zugreifen, ohne direkten Zugriff auf die Quelltabellen zu haben. Durch das Erstellen einer dynamischen Ansicht wird ein neuer Tabellenname definiert, der nicht mit dem Namen von Quell- oder anderen Tabellen und Ansichten übereinstimmen darf, die im selben Schema vorhanden sind.

Demgegenüber wird durch das Zuordnen eines Zeilenfilters oder einer Spaltenmaske zu einer Zieltabelle die entsprechende Logik ohne Einführung neuer Tabellennamen direkt auf die Tabelle selbst angewendet. Nachfolgende Abfragen können weiterhin direkt auf die Zieltabelle verweisen und dabei ihren ursprünglichen Namen verwenden.

Sowohl dynamische Ansichten als auch Zeilenfilter und Spaltenmasken ermöglichen es Ihnen, komplexe Logiken auf Tabellen anzuwenden und deren Filterentscheidungen zur Abfragelaufzeit zu verarbeiten.

Verwenden Sie dynamische Ansichten, wenn Sie Transformationslogiken wie Filter und Masken auf schreibgeschützte Tabellen anwenden müssen, und wenn es für Benutzer akzeptabel ist, mit unterschiedlichen Namen auf die dynamischen Ansichten zu verweisen. Verwenden Sie Zeilenfilter und Spaltenmasken, wenn Sie Ausdrücke über bestimmte Daten filtern oder berechnen, Benutzern jedoch weiterhin Zugriff auf die Tabellen unter Nutzung ihrer ursprünglichen Namen gewähren möchten.

Zeilenfiltersyntax

Verwenden Sie die folgende Syntax, um einen Zeilenfilter zu erstellen und zu einer vorhandenen Tabelle hinzuzufügen:

Erstellen des Zeilenfilters:

CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
RETURN {filter clause whose output must be a boolean};

Anwenden des Zeilenfilters auf eine Tabelle:

ALTER TABLE <table_name> SET ROW FILTER <function_name> ON (<column_name>, ...);

Entfernen eines Zeilenfilters aus einer Tabelle:

ALTER TABLE <table_name> DROP ROW FILTER;

Ändern eines Zeilenfilters:

Run a DROP FUNCTION statement to drop the existing function, or use CREATE OR REPLACE FUNCTION to replace it.

Löschen eines Zeilenfilters:

ALTER TABLE <table_name> DROP ROW FILTER;
DROP FUNCTION <function_name>;

Hinweis

Sie müssen den Befehl ALTER TABLE ... DROP ROW FILTER ausführen, bevor Sie die Funktion ablegen. Andernfalls kann nicht auf die Tabelle zugegriffen werden.

Wenn aus diesem Grund nicht auf die Tabelle zugegriffen werden kann, ändern Sie sie, und legen Sie den verwaisten Zeilenfilterverweis mithilfe von ALTER TABLE <table_name> DROP ROW FILTER; ab.

Beispiele für Zeilenfilter

Erstellen Sie eine benutzerdefinierte SQL-Funktion, die auf Mitglieder der Gruppe admin in der Region US angewendet wird.

Mit dieser Funktion können Mitglieder der Gruppe admin auf alle Datensätze in der Tabelle zugreifen. Wenn die Funktion von einem Nichtadministrator aufgerufen wird, schlägt die RETURN_IF-Bedingung fehl, und die Auswertung des region='US'-Ausdrucks filtert die Tabelle so, dass nur Datensätze in der Region US angezeigt werden.

CREATE FUNCTION us_filter(region STRING)
RETURN IF(IS_ACCOUNT_GROUP_MEMBER('admin'), true, region='US');

Wenden Sie die Funktion als Zeilenfilter auf eine Tabelle an. Die nachfolgenden Abfragen aus der sales-Tabelle geben dann eine Teilmenge der Zeilen zurück.

CREATE TABLE sales (region STRING, id INT);
ALTER TABLE sales SET ROW FILTER us_filter ON (region);

Deaktivieren Sie den Zeilenfilter. Zukünftige Benutzerabfragen aus der sales-Tabelle geben dann alle Zeilen in der Tabelle zurück.

ALTER TABLE sales DROP ROW FILTER;

Erstellen Sie eine Tabelle, wobei die Zeilenfilterfunktion als Teil der „CREATE TABLE“-Anweisung angewendet wird. Zukünftige Abfragen aus der sales-Tabelle geben dann eine Teilmenge der Zeilen zurück.

CREATE TABLE sales (region STRING, id INT)
WITH ROW FILTER us_filter ON (region);

Was sind Spaltenmasken?

Mit Spaltenformaten können Sie eine Maskierungsfunktion auf eine Tabellenspalte anwenden. Die Maskierungsfunktion wird zur Abfragelaufzeit ausgewertet, wobei jeder Verweis der Zielspalte durch die Ergebnisse der Maskierungsfunktion ersetzt wird. In den meisten Anwendungsfällen bestimmen Spaltenmasken, ob der ursprüngliche Spalten- oder (basierend auf der Identität des aufrufenden Benutzers) ein bearbeiteter Wert zurückgegeben werden soll. Spaltenmasken sind Ausdrücke, die als SQL-UDFs geschrieben werden.

Auf jede Tabellenspalte kann optional eine Maskierungsfunktion angewendet werden. Die Maskierungsfunktion verwendet den nicht maskierten Wert der Spalte als Eingabe und gibt den maskierten Wert als Ergebnis zurück. Der Rückgabewert der Maskierungsfunktion sollte vom gleichen Typ wie die zu maskierende Spalte sein. Die Maskierungsfunktion akzeptiert auch zusätzliche Spalten als Eingabeparameter und kann diese in der zugehörigen Maskierungslogik verwenden.

Um Spaltenmasken anzuwenden, erstellen Sie eine Funktion und wenden sie im Anschluss mithilfe einer ALTER TABLE-Anweisung auf eine Tabellenspalte an. Alternativ können Sie die Maskierungsfunktion beim Erstellen der Tabelle anwenden.

Spaltenmaskensyntax

Innerhalb der MASK-Klausel können Sie eine der integrierten Laufzeitfunktionen von Azure Databricks verwenden oder andere benutzerdefinierte Funktionen aufrufen. Gängige Anwendungsfälle umfassen das Überprüfen der Identität des aufrufenden Benutzers, der die Funktion ausführt, mithilfe von current_user( ), sowie die Überprüfung, bei welchen Gruppen der Benutzer Mitglied ist, mithilfe von is_account_group_member( ).

Erstellen einer Spaltenmaske:

CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
RETURN {expression with the same type as the first parameter};

Anwenden einer Spaltenmaske auf eine Spalte in einer vorhandenen Tabelle:

ALTER TABLE <table_name> ALTER COLUMN <col_name> SET MASK <mask_func_name> [USING COLUMNS <additional_columns>];

Entfernen einer Spaltenmaske aus einer Spalte in einer Tabelle:

ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;

Verändern einer Spaltenmaske:

Verwenden Sie entweder DROP zum Ablegen der vorhandenen Funktion oder CREATE OR REPLACE TABLE.

Löschen einer Spaltenmaske:

ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;
DROP FUNCTION <function_name>;

Hinweis

Sie müssen den Befehl ALTER TABLE ausführen, bevor Sie die Funktion ablegen. Andernfalls kann nicht auf die Tabelle zugegriffen werden.

Wenn aus diesem Grund nicht auf die Tabelle zugegriffen werden kann, ändern Sie sie, und legen Sie den verwaisten Maskenverweis mithilfe von ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK; ab.

Beispiele für Spaltenmasken

In diesem Beispiel erstellen Sie eine benutzerdefinierte Funktion, die die ssn-Spalte maskiert, sodass nur Benutzer*innen, die Mitglied der Gruppe HumanResourceDept sind, Werte in dieser Spalte anzeigen können.

CREATE FUNCTION ssn_mask(ssn STRING)
  RETURN CASE WHEN is_member('HumanResourceDept') THEN ssn ELSE '***-**-****' END;

Wenden Sie die neue Funktion als Spaltenmaske auf eine Tabelle an. Sie können die Spaltenmaske beim Erstellen der Tabelle oder danach hinzufügen.

--Create the `users` table and apply the column mask in a single step:

CREATE TABLE users (
  name STRING,
  ssn STRING MASK ssn_mask);
--Create the `users` table and apply the column mask after:

CREATE TABLE users
  (name STRING, ssn STRING);

ALTER TABLE users ALTER COLUMN ssn SET MASK ssn_mask;

Abfragen für diese Tabelle geben jetzt maskierte ssn-Spaltenwerte zurück, wenn die abfragenden Benutzer*innen kein Mitglied der Gruppe HumanResourceDept sind:

SELECT * FROM users;
  James  ***-**-****

So deaktivieren Sie die Spaltenmaske, damit Abfragen die ursprünglichen Werte in der Spalte ssn zurückgeben

ALTER TABLE users ALTER COLUMN ssn DROP MASK;

Verwenden von Zuordnungstabellen zum Erstellen einer Zugriffssteuerungsliste

Um Sicherheit auf Zeilenebene zu erzielen, sollten Sie eine Zuordnungstabelle (oder Zugriffssteuerungsliste) definieren. Jede Zuordnungstabelle ist eine umfassende Zugriffssteuerungsliste, die codiert, auf welche Datenzeilen in der ursprünglichen Tabelle bestimmte Benutzer oder Gruppen Zugriff haben. Zuordnungstabellen sind nützlich, da sie eine einfache Integration in Ihre Faktentabellen mithilfe direkter Verknüpfungen bieten.

Diese Methodik ist bei der Behandlung vieler Anwendungsfälle mit benutzerdefinierten Anforderungen vorteilhaft. Beispiele:

  • Festlegen von Einschränkungen basierend auf dem angemeldeten Benutzer bei gleichzeitiger Beachtung verschiedener Regeln für bestimmte Benutzergruppen.
  • Erstellen komplizierter Hierarchien, z. B. Organisationsstrukturen, die unterschiedliche Regelsätze erfordern.
  • Replizieren komplexer Sicherheitsmodelle aus externen Quellsystemen.

Durch die Einführung von Zuordnungstabellen können Sie diese anspruchsvollen Szenarien effektiv meistern und für die Implementierung einer stabilen Sicherheit auf Zeilen- und Spaltenebene sorgen.

Beispiele für Zuordnungstabellen

Verwenden einer Zuordnungstabelle, um zu überprüfen, ob sich der aktuelle Benutzer in einer Liste befindet:

USE CATALOG main;

Erstellen einer neuen Zuordnungstabelle:

DROP TABLE IF EXISTS valid_users;

CREATE TABLE valid_users(username string);
INSERT INTO valid_users
VALUES
  ('fred@databricks.com'),
  ('barney@databricks.com');

Erstellen eines neuen Filters:

Hinweis

Alle Filter werden mit den Rechten des Definierenden (Definer) ausgeführt. Eine Ausnahme bilden Funktionen, die den Benutzerkontext überprüfen (z. B. die CURRENT_USER- und IS_MEMBER-Funktionen). Sie werden als Aufrufer (Invoker) ausgeführt werden.

In diesem Beispiel überprüft die Funktion, ob sich der aktuelle Benutzer in der valid_users-Tabelle befindet. Wenn der Benutzer gefunden wird, gibt die Funktion „wahr“ zurück.

DROP FUNCTION IF EXISTS row_filter;

CREATE FUNCTION row_filter()
  RETURN EXISTS(
    SELECT 1 FROM valid_users v
    WHERE v.username = CURRENT_USER()
);

Im folgenden Beispiel wird der Zeilenfilter während der Tabellenerstellung angewendet. Sie können den Filter mithilfe einer ALTER TABLE-Anweisung auch später hinzufügen. Verwenden Sie beim Anwenden auf eine ganze Tabelle die Syntax ON (). Verwenden Sie für eine bestimmte Zeile ON (row);.

DROP TABLE IF EXISTS data_table;

CREATE TABLE data_table
  (x INT, y INT, z INT)
  WITH ROW FILTER row_filter ON ();

INSERT INTO data_table VALUES
  (1, 2, 3),
  (4, 5, 6),
  (7, 8, 9);

Wählen Sie Daten aus der Tabelle aus. Hierbei sollten nur Daten zurückgeben werden, wenn sich der Benutzer in der Tabelle valid_users befindet.

SELECT * FROM data_table;

Erstellen Sie eine Zuordnungstabelle mit Konten, die immer Zugriff haben sollen, um unabhängig von den Spaltenwerten alle Zeilen in der Tabelle anzuzeigen:

CREATE TABLE valid_accounts(account string);
INSERT INTO valid_accounts
VALUES
  ('admin'),
  ('cstaff');

Erstellen Sie nun eine SQL-UDF, die true zurückgibt, wenn die Werte aller Spalten in der Zeile kleiner als fünf sind, oder wenn der aufrufende Benutzer ein Mitglied der obigen Zuordnungstabelle ist.

CREATE FUNCTION row_filter_small_values (x INT, y INT, z INT)
  RETURN (x < 5 AND y < 5 AND z < 5)
  OR EXISTS(
    SELECT 1 FROM valid_accounts v
    WHERE IS_ACCOUNT_GROUP_MEMBER(v.account));

Wenden Sie zum Abschluss die SQL-UDF als Zeilenfilter auf die Tabelle an:

ALTER TABLE data_table SET ROW FILTER row_filter_small_values ON (x, y, z);

Support-Fähigkeit

  • Databricks SQL und Databricks-Notebooks für SQL-Workloads werden unterstützt.
  • DML-Befehle von Benutzern mit MODIFY-Berechtigungen werden unterstützt. Filter und Masken werden auf die durch UPDATE- und LÖSCHEN-Anweisungen gelesenen Daten und nicht auf geschriebene Daten (einschließlich mit einer EINFÜGEN-Anweisung eingefügte Daten) angewendet.
  • Unterstützte Formate: Delta und Parquet. Parquet wird nur für verwaltete oder externe Tabellen unterstützt.
  • Ansichten in Tabellen mit Spaltenmasken oder Zeilenfiltern werden unterstützt.
  • Delta Lake-Änderungsdatenfeeds werden unterstützt, solange das Schema mit den Zeilenfiltern und Spaltenmasken kompatibel ist, die für die Zieltabelle gelten.
  • Fremdtabellen werden unterstützt.

Begrenzungen

  • Databricks Runtime-Versionen vor Version 12.2 LTS unterstützen weder Zeilenfilter noch Spaltenmasken. Diese Laufzeiten schlagen sicher fehl, d. h., wenn Sie versuchen, aus nicht unterstützten Versionen dieser Laufzeiten auf Tabellen zuzugreifen, werden keine Daten zurückgegeben.
  • Materialisierte Ansichten und Streamingtabellen von Delta Live Tables unterstützen keine Zeilenfilter oder Spaltenmasken.
  • Python- oder Scala-UDFs werden nicht direkt als Zeilenfilter- oder Spaltenmaskenfunktionen unterstützt. Es ist jedoch möglich, in SQL-UDFs auf sie zu verweisen, solange ihre Definitionen dauerhaft im Katalog (d. h. nicht temporär für die Sitzung) gespeichert sind.
  • Delta Sharing funktioniert für Sicherheit auf Zeilenebene oder Spaltenmasken nicht.
  • Zeitreisen funktionieren für Sicherheit auf Zeilenebene oder Spaltenmasken nicht.
  • Tabellensampling funktioniert für Sicherheit auf Zeilenebene oder Spaltenmasken nicht.
  • Der pfadbasierte Zugriff auf Dateien in Tabellen mit Richtlinien wird derzeit nicht unterstützt.
  • Zeilenfilter- oder Spaltenmaskenrichtlinien mit Zirkelabhängigkeiten zurück zu den ursprünglichen Richtlinien werden nicht unterstützt.
  • MERGE und unechte Klone werden nicht unterstützt.

Einschränkung für Einzelbenutzercluster

Fügen Sie Zeilenfilter oder Spaltenmasken keiner Tabelle hinzu, auf die Sie von Einzelbenutzerclustern aus zugreifen. Dies geschieht in der Regel im Kontext von Azure Databricks Jobs. Während der öffentlichen Vorschau können Sie nicht von einem Einzelbenutzercluster aus auf die Tabelle zugreifen, nachdem ein Filter oder eine Maske angewendet wurde.