Dela 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. De här funktionerna kräver Unity Catalog.

Vad är radfilter?

Med radfilter kan du använda ett filter i en tabell så att frågor endast returnerar rader som uppfyller filtervillkoren. Du implementerar ett radfilter som en SQL-användardefinierad funktion (UDF). Python och Scala UDF:er stöds också, men endast när de är inslagna i SQL UDF:er.

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 eller som Python- eller Scala-UDF:er som omsluts i SQL UDF:er.

Varje tabellkolumn kan bara 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.

Vad är skillnaden mellan dessa filter och dynamiska vyer?

Med dynamiska vyer, radfilter och kolumnmasker kan du använda komplex logik för tabeller och bearbeta deras filtreringsbeslut vid frågekörning.

En dynamisk vy är en abstrakt, skrivskyddad vy över en eller flera källtabeller. Användaren kan komma åt en dynamisk vy 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 nya tabellnamn introduceras. Efterföljande frågor kan fortsätta att referera direkt till måltabellen med dess ursprungliga namn.

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. Om du vill filtrera data när du delar dem med deltadelning måste du använda dynamiska vyer. 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.

Innan du börjar

Om du vill lägga till radfilter och kolumnmasker i tabeller måste du ha:

Du måste också uppfylla följande krav:

  • Om du vill tilldela en funktion som lägger till radfilter eller kolumnmasker i en tabell måste du ha behörigheten EXECUTE för funktionen, USE SCHEMA i schemat och USE CATALOG i den överordnade katalogen.
  • Om du vill lägga till filter eller masker när du skapar en ny tabell måste du också ha behörigheten CREATE TABLE för schemat.
  • Om du vill lägga till filter eller masker genom att ändra en befintlig tabell måste du också vara tabellägare eller ha MODIFY behörighet för tabellen.

För att få åtkomst till en tabell som har radfilter eller kolumnmasker måste beräkningsresursen uppfylla följande krav:

  • Ett kluster för delat åtkomstläge på Databricks Runtime 12.2 LTS eller senare, eller ett SQL-lager.

Använda ett radfilter

Om du vill skapa ett radfilter skriver du en funktion (UDF) för att definiera filterprincipen och sedan tillämpa den på en tabell. 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.

Du kan använda ett radfilter med hjälp av Catalog Explorer- eller SQL-kommandon. Instruktionerna i Katalogutforskaren förutsätter att du redan har skapat en funktion och att den är registrerad i Unity Catalog. SQL-instruktionerna innehåller exempel på hur du skapar en radfilterfunktion och tillämpar den på en tabell.

Katalogutforskaren

  1. På din Azure Databricks-arbetsyta klickar du på Katalogikon Katalog.
  2. Bläddra eller sök efter den tabell som du vill filtrera.
  3. På fliken Översikt klickar du på Radfilter: Lägg till filter.
  4. I dialogrutan Lägg till radfilter väljer du den katalog och det schema som innehåller filterfunktionen och väljer sedan funktionen.
  5. I den expanderade dialogrutan visar du funktionsdefinitionen och väljer de tabellkolumner som matchar kolumnerna som ingår i funktionssatsen.
  6. Klicka på Lägg till.

Om du vill ta bort filtret från tabellen klickar du på fx Row-filtret och klickar på Ta bort.

SQL

Om du vill skapa ett radfilter och sedan lägga till det i en befintlig tabell använder CREATE FUNCTION du och tillämpar funktionen med .ALTER TABLE Du kan också använda en funktion när du skapar en tabell med .CREATE TABLE

  1. Skapa radfiltret:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {filter clause whose output must be a boolean};
    
  2. Använd radfiltret på en tabell med ett kolumnnamn:

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

Ytterligare syntaxexempel:

  • 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. Om du inte gör det ä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;.

Se även ROW FILTER-sats.

Exempel på radfilter

Det här exemplet skapar en SQL-användardefinierad funktion som gäller för medlemmar i gruppen admin i regionen US.

När den här exempelfunktionen tillämpas på sales tabellen kan medlemmar i admin gruppen komma åt alla poster i tabellen. Om funktionen anropas av en icke-administratör misslyckas villkoret RETURN_IF region='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 -instruktionen CREATE TABLE . 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);

Använda en kolumnmask

Om du vill använda en kolumnmask skapar du en funktion (UDF) och tillämpar den sedan på en tabellkolumn.

Du kan använda en kolumnmask med hjälp av Catalog Explorer- eller SQL-kommandon. Instruktionerna i Katalogutforskaren förutsätter att du redan har skapat en funktion och att den är registrerad i Unity Catalog. SQL-instruktionerna innehåller exempel på hur du skapar en kolumnmaskfunktion och tillämpar den på en tabellkolumn.

Katalogutforskaren

  1. På din Azure Databricks-arbetsyta klickar du på Katalogikon Katalog.
  2. Bläddra eller sök efter tabellen.
  3. På fliken Översikt letar du reda på den rad som du vill använda kolumnmasken på och klickar på Ikonen Redigera ikonen Maskeringsredigering.
  4. I dialogrutan Lägg till kolumnmask väljer du katalogen och schemat som innehåller filterfunktionen och väljer sedan funktionen.
  5. I den expanderade dialogrutan visar du funktionsdefinitionen. Om funktionen innehåller några parametrar utöver den kolumn som maskeras väljer du de tabellkolumner som du vill omvandla de ytterligare funktionsparametrarna till.
  6. Klicka på Lägg till.

Om du vill ta bort kolumnmasken från tabellen klickar du på fx Kolumnmask på tabellraden och klickar på Ta bort.

SQL

Om du vill skapa en kolumnmask och lägga till den i en befintlig tabellkolumn använder CREATE FUNCTION du och använder maskeringsfunktionen med hjälp av ALTER TABLE. Du kan också använda en funktion när du skapar en tabell med .CREATE TABLE

Du använder SET MASK för att använda maskeringsfunktionen. 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 current_user( ) av eller hämta de grupper som de är medlemmar i med .is_account_group_member( ) Mer information finns i Kolumnmasksats och Inbyggda funktioner.

  1. Skapa en kolumnmask:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {expression with the same type as the first parameter};
    
  2. Använd kolumnmasken på en kolumn i en befintlig tabell:

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

Ytterligare syntaxexempel:

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

Funktioner och format som stöds

  • Databricks SQL- och Databricks-notebook-filer för SQL-arbetsbelastningar stöds.

  • DML-kommandon från användare med MODIFY behörighet stöds. Filter och masker tillämpas på de data som läss av UPDATE och DELETE instruktioner och tillämpas inte på data som skrivs (inklusive INSERT).

  • Dataformat som stöds:

    • Delta och Parquet för hanterade och externa tabeller.
    • Flera andra dataformat för utländska tabeller som registrerats i Unity Catalog med Hjälp av Lakehouse Federation.
  • SQL-, Python- och Scala-UDF:er stöds som radfilter- eller kolumnmaskfunktioner, så länge de är registrerade i Unity Catalog. Python- och Scala-UDF:er måste vara omslutna i en SQL UDF.

  • 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 gäller för måltabellen.

  • MERGE -instruktioner stöds när källtabeller, måltabeller eller både använder radfilter och kolumnmasker. Detta inkluderar tabeller med radfilterfunktioner som innehåller enkla underfrågor, men det finns begränsningar som anges i avsnittet nedan.

  • Databricks SQL-materialiserade vyer och Databricks SQL-strömningstabeller stöder radfilter och kolumnmasker (offentlig förhandsversion):

    • Du kan lägga till radfilter och kolumnmasker i en materialiserad Databricks SQL-vy eller en strömmande tabell.
    • Du kan definiera Databricks SQL Materialiserade vyer eller strömmande tabeller på tabeller som innehåller radfilter och kolumnmasker.

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 om du försöker komma åt tabeller från versioner som inte stöds av dessa körningar returneras inga data.
  • Materialiserade vyer och strömmande tabeller som deklareras i Delta Live Tables stöder inte radfilter eller kolumnmasker.
  • 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.
  • Principer för radfilter eller kolumnmask med cirkulära beroenden tillbaka till de ursprungliga principerna stöds inte.
  • Djupa och grunda kloner stöds inte.
  • MERGE -instruktioner stöder inte tabeller med radfilterprinciper som innehåller kapsling, sammansättningar, fönster, gränser eller icke-deterministiska funktioner.
  • Delta Lake-API:er stöds inte.
  • SHOW CREATE TABLE på materialiserade vyer och strömmande tabeller visar inte radfilter- och kolumnmaskinformation.

Beräkningsbegränsning för en användare

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