Share via


Filtrera känsliga tabelldata med hjälp av radfilter och kolumnmasker

Viktigt!

Den här funktionen finns som allmänt tillgänglig förhandsversion.

Den här artikeln innehåller vägledning och exempel för användning av radfilter, kolumnmasker och mappningstabeller för att filtrera känsliga data i dina tabeller.

Vad är radfilter?

Med radfilter kan du tillämpa ett filter på en tabell så att efterföljande frågor endast returnerar rader som filterpredikatet utvärderas till sant för. Ett radfilter implementeras som en SQL-användardefinierad funktion (UDF).

Om du vill skapa ett radfilter skriver du först en SQL UDF för att definiera filterprincipen och tillämpar den sedan på en tabell med en ALTER TABLE -instruktion. Du kan också ange ett radfilter för en tabell i den första CREATE TABLE instruktionen. Varje tabell kan bara ha ett radfilter. Ett radfilter accepterar noll eller fler indataparametrar där varje indataparameter binder till en kolumn i motsvarande tabell.

Vad är skillnaden mellan dessa filter och dynamiska vyer?

Den dynamiska vyn är en abstrakt, skrivskyddad vy över en eller flera källtabeller. Användaren kan komma åt den dynamiska vyn utan att ha åtkomst till källtabellerna direkt. När du skapar en dynamisk vy definieras ett nytt tabellnamn som inte får matcha namnet på källtabeller eller andra tabeller och vyer som finns i samma schema.

Om du å andra sidan kopplar ett radfilter eller en kolumnmask till en måltabell tillämpas motsvarande logik direkt på själva tabellen utan att några nya tabellnamn introduceras. Efterföljande frågor kan fortsätta referera direkt till måltabellen med dess ursprungliga namn.

Med både dynamiska vyer och radfilter och kolumnmasker kan du tillämpa komplex logik på tabeller och bearbeta deras filtreringsbeslut vid frågekörning.

Använd dynamiska vyer om du behöver använda transformeringslogik, till exempel filter och masker på skrivskyddade tabeller, och om det är acceptabelt för användare att referera till dynamiska vyer med hjälp av olika namn. Använd radfilter och kolumnmasker om du vill filtrera eller beräkna uttryck över specifika data, men ändå ge användarna åtkomst till tabellerna med sina ursprungliga namn.

Syntax för radfilter

Om du vill skapa ett radfilter och lägga till det i en befintlig tabell använder du följande syntax:

Skapa radfiltret:

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

Använd radfiltret i en tabell:

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

Ta bort ett radfilter från en tabell:

ALTER TABLE <table_name> DROP ROW FILTER;

Ändra ett radfilter:

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

Ta bort ett radfilter:

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

Kommentar

Du måste utföra ALTER TABLE ... DROP ROW FILTER kommandot innan du släpper funktionen, annars är tabellen i ett otillgängligt tillstånd.

Om tabellen blir otillgänglig på det här sättet ändrar du tabellen och släpper den överblivna radfilterreferensen med hjälp av ALTER TABLE <table_name> DROP ROW FILTER;.

Exempel på radfilter

Skapa en SQL-användardefinierad funktion som tillämpas på medlemmar i gruppen admin i regionen US.

Med den här funktionen kan medlemmar i admin gruppen komma åt alla poster i tabellen. Om funktionen anropas av en icke-administratör misslyckas villkoret RETURN_IFregion='US' och uttrycket utvärderas och tabellen filtreras för att endast visa poster i US regionen.

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

Använd funktionen på en tabell som ett radfilter. Efterföljande frågor från sales tabellen returnerar sedan en delmängd rader.

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

Inaktivera radfiltret. Framtida användarfrågor från sales tabellen returnerar sedan alla rader i tabellen.

ALTER TABLE sales DROP ROW FILTER;

Skapa en tabell med funktionen tillämpad som ett radfilter som en del av CREATE TABLE-instruktionen. Framtida frågor från tabellen sales returnerar sedan en delmängd rader.

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

Vad är kolumnmasker?

Med kolumnmasker kan du använda en maskeringsfunktion i en tabellkolumn. Maskeringsfunktionen utvärderas vid frågekörning och ersätter varje referens i målkolumnen med resultatet av maskeringsfunktionen. För de flesta användningsfall avgör kolumnmasker om det ursprungliga kolumnvärdet ska returneras eller redigeras baserat på den anropande användarens identitet. Kolumnmasker är uttryck som skrivs som SQL-UDF:er.

Varje tabellkolumn kan också ha en maskeringsfunktion tillämpad på den. Maskeringsfunktionen tar det omaskerade värdet för kolumnen som indata och returnerar det maskerade värdet som resultat. Returvärdet för maskeringsfunktionen ska vara samma typ som kolumnen som maskeras. Maskeringsfunktionen kan också ta ytterligare kolumner som indataparametrar och använda dem i maskeringslogik.

Om du vill använda kolumnmasker skapar du en funktion och tillämpar den på en tabellkolumn med hjälp av en ALTER TABLE -instruktion. Du kan också använda maskeringsfunktionen när du skapar tabellen.

Syntax för kolumnmask

MASK I -satsen kan du använda någon av de inbyggda Funktionerna i Azure Databricks eller anropa andra användardefinierade funktioner. Vanliga användningsfall är att inspektera identiteten för den anropande användare som kör funktionen med hjälp av current_user( ) eller vilka grupper som de är medlemmar i med .is_account_group_member( )

Skapa en kolumnmask:

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

Använd kolumnmask på en kolumn i en befintlig tabell:

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

Ta bort en kolumnmask från en kolumn i en tabell:

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

Ändra en kolumnmask:

Antingen DROP den befintliga funktionen eller använd CREATE OR REPLACE TABLE.

Ta bort en kolumnmask:

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

Kommentar

Du måste utföra ALTER TABLE kommandot innan du släpper funktionen, annars är tabellen i ett otillgängligt tillstånd.

Om tabellen blir otillgänglig på det här sättet ändrar du tabellen och släpper referensreferensen för överblivna masker med hjälp av ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;.

Exempel på kolumnmask

I det här exemplet skapar du en användardefinierad funktion som maskerar ssn kolumnen så att endast användare som är medlemmar i gruppen kan visa värden i den HumanResourceDept kolumnen.

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

Använd den nya funktionen i en tabell som en kolumnmask. Du kan lägga till kolumnmasken när du skapar tabellen eller efter.

--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;

Frågor i tabellen returnerar nu maskerade ssn kolumnvärden när den frågande användaren inte är medlem i HumanResourceDept gruppen:

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

Så här inaktiverar du kolumnmasken så att frågor returnerar de ursprungliga värdena i ssn kolumnen:

ALTER TABLE users ALTER COLUMN ssn DROP MASK;

Använda mappningstabeller för att skapa en lista med åtkomstkontroll

För att uppnå säkerhet på radnivå kan du överväga att definiera en mappningstabell (eller åtkomstkontrolllista). Varje mappningstabell är en omfattande mappningstabell som kodar vilka datarader i den ursprungliga tabellen som är tillgängliga för vissa användare eller grupper. Mappningstabeller är användbara eftersom de erbjuder enkel integrering med dina faktatabeller via direkta kopplingar.

Den här metoden visar sig vara fördelaktig när det gäller att hantera många användningsfall med anpassade krav. Exempel:

  • Införa begränsningar baserat på den inloggade användaren och samtidigt anpassa olika regler för specifika användargrupper.
  • Skapa invecklade hierarkier, till exempel organisationsstrukturer, som kräver olika uppsättningar med regler.
  • Replikera komplexa säkerhetsmodeller från externa källsystem.

Genom att använda mappningstabeller på det här sättet kan du effektivt hantera dessa utmanande scenarier och säkerställa robusta säkerhetsimplementeringar på radnivå och kolumnnivå.

Mappa tabellexempel

Använd en mappningstabell för att kontrollera om den aktuella användaren finns i en lista:

USE CATALOG main;

Skapa en ny mappningstabell:

DROP TABLE IF EXISTS valid_users;

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

Skapa ett nytt filter:

Kommentar

Alla filter körs med definierarens rättigheter förutom funktioner som kontrollerar användarkontexten CURRENT_USER (till exempel funktionerna och IS_MEMBER ) som körs som anropare.

I det här exemplet kontrollerar funktionen om den aktuella användaren finns i valid_users tabellen. Om användaren hittas returnerar funktionen true.

DROP FUNCTION IF EXISTS row_filter;

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

Exemplet nedan använder radfiltret när tabellen skapas. Du kan också lägga till filtret senare med hjälp av en ALTER TABLE instruktion. När du tillämpar på en hel tabell använder du syntaxen ON () . För en specifik rad använder du 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);

Välj data från tabellen. Detta bör endast returnera data om användaren finns i valid_users tabellen.

SELECT * FROM data_table;

Skapa en mappningstabell som består av konton som alltid ska ha åtkomst för att visa alla rader i tabellen, oavsett kolumnvärden:

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

Skapa nu en SQL UDF som returnerar true om värdena för alla kolumner på raden är mindre än fem, eller om den anropande användaren är medlem i mappningstabellen ovan.

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));

Tillämpa slutligen SQL UDF på tabellen som ett radfilter:

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

Supportmöjlighet

  • Databricks SQL- och Databricks-notebook-filer för SQL-arbetsbelastningar stöds.
  • DML-kommandon från användare med BEHÖRIGHETEN ÄNDRA stöds. Filter och masker tillämpas på data som läses av UPDATEs och DELETEs och tillämpas inte på data som skrivs (inklusive INSERTed-data).
  • Format som stöds: Delta och Parquet. Parquet stöds endast för hanterade eller externa tabeller.
  • Vyer på tabeller med kolumnmasker eller radfilter stöds.
  • Delta Lake-ändringsdataflöden stöds så länge schemat är kompatibelt med radfilter och kolumnmasker som kan gälla för måltabellen.
  • Sekundärtabeller stöds.

Begränsningar

  • Databricks Runtime-versioner under 12.2 LTS stöder inte radfilter eller kolumnmasker. Dessa körningar misslyckas på ett säkert sätt, vilket innebär att inga data returneras om du försöker komma åt tabeller från versioner som inte stöds av dessa körningar.
  • Delta Live Tables materialiserade vyer och strömmande tabeller stöder inte radfilter eller kolumnmasker.
  • Python- och Scala-UDF:er stöds inte direkt som radfilter- eller kolumnmaskfunktioner. Det är dock möjligt att referera till dessa i SQL UDF:er så länge deras definitioner lagras permanent i katalogen (med andra ord inte tillfälliga till sessionen).
  • Deltadelning fungerar inte med säkerhet på radnivå eller kolumnmasker.
  • Tidsresor fungerar inte med säkerhet på radnivå eller kolumnmasker.
  • Tabellsampling fungerar inte med säkerhet på radnivå eller kolumnmasker.
  • Sökvägsbaserad åtkomst till filer i tabeller med principer stöds inte för närvarande.
  • Principer för radfilter eller kolumnmask med cirkulära beroenden tillbaka till de ursprungliga principerna stöds inte.
  • MERGE och grunda kloner stöds inte.

Begränsning av kluster för enskild användare

Lägg inte till radfilter eller kolumnmasker i någon tabell som du kommer åt från kluster med en enda användare. Detta görs ofta i kontexten för Azure Databricks-jobb. Under den offentliga förhandsversionen kan du inte komma åt tabellen från ett kluster med en enda användare när ett filter eller en mask har tillämpats.