Använda mappningstabeller för dynamisk åtkomstkontroll

Den här handledningen visar hur du använder en mappningstabell för att styra åtkomst på radnivå och kolumnnivå utan att hantera ett stort antal grupper. En enda uppslagstabell styr både radfiltrering och kolumnmaskering. Åtkomständringar kräver endast en raduppdatering. Du behöver inte skapa nya grupper eller skriva om principer.

Den här självstudien visar också villkorlig datamaskering: PII-kolumner maskeras på olika sätt beroende på ett värde i en annan kolumn på samma rad. Beställningar som har markerats confidential har sin PII helt redigerad oavsett användarens rensningsnivå.

Allmän vägledning om utformning av mappningstabeller finns i Använda mappningstabeller för att skapa en lista med åtkomstkontroll.

Förutsättningar

  • Databricks Runtime 16.4 eller senare eller serverlös beräkning.
  • Behörigheter för kontoadministratör eller arbetsyteadministratör (för att skapa styrda taggar).
  • MANAGE tillstånd för målkatalogen eller schemat.
  • EXECUTE på UDF:erna.
  • En SQL-anteckningsbok eller frågeredigerare.

Scenario

Din organisation har anställda i fyra regioner (USA, östra, USA, västra, EU, APAC) och fyra avdelningar. Varje användare bör bara se de rader som matchar deras region och avdelning, och PII-kolumner ska maskeras baserat på två faktorer: användarens clearance-nivå (full, maskedeller none) som lagras i en mappningstabell och orderns order_priority.

Med en gruppbaserad metod behöver du en grupp för varje kombination av region-avdelning. Du behöver till exempel 16 grupper för fyra regioner och fyra avdelningar. Om du lägger till PII-rensningsnivåer tredubblas antalet. Varje ny region eller avdelning kräver nya grupper och principuppdateringar.

Metoden mappningstabell ersätter detta med en enda uppslagstabell: en rad per användare, en kolumn per åtkomstdimension. Om du vill ändra en användares åtkomst uppdaterar du en rad.

Steg 1: Skapa reglerade taggar

Innan du kör någon SQL skapar du följande styrda taggar i Catalog Explorer-användargränssnittet (Katalog>Styr>Styrda taggar>Skapa styrd tagg):

Taggnyckel Tillåtna värden
region (tagg med endast nyckel)
department (tagg med endast nyckel)
pii name, email
priority (tagg med endast nyckel)

Taggarna region och department talar om för radfilterprincipen vilka kolumner som ska skickas till filtrets UDF. Taggen pii talar om för kolumnmaskprinciperna vilka kolumner som ska maskeras och vilken PII-typ de innehåller. Med priority-taggen låter kolumnmaskprinciperna passera order_priority-värdet till mask-UDF för villkorlig maskering.

Varning

Taggdata lagras som oformaterad text och kan replikeras globalt. Använd inte taggnamn, värden eller deskriptorer som kan äventyra säkerheten för dina resurser. Använd till exempel inte taggnamn, värden eller deskriptorer som innehåller personlig eller känslig information.

Steg 2: Skapa exempeldata

Skapa en katalog, ett schema och en ordertabell. Kolumnen order_priority styr villkorsbunden maskering: beställningar som har markerats confidential har sina personuppgifter helt redigerade, även för användare med hög behörighet.

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

Steg 3: Tillämpa reglerade taggar

Tagga kolumnerna så att ABAC-principer kan identifiera dem automatiskt. Kolumnen order_priority är taggad med taggen endast nyckel priority så att kolumnmaskprinciperna kan matcha den via MATCH COLUMNS och skicka dess värde till maskens UDF.

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

Steg 4: Skapa mappningstabellen

I stället för att skapa grupper för varje region, avdelning och klareringskombination underhåller du en tabell med en rad per användare. Kolumnen pii_access styr hur PII-kolumner visas:

  • full — se det faktiska värdet (för standardprioritetsbeställningar)
  • masked — se ett partiellt värde som A*** eller o***@acme.com
  • none — se ***REDACTED***

Kolumnen expires_on anger ett förfallodatum för varje åtkomstpost. Efter det här datumet slutar radfilterfunktionen UDF att matcha posten och användaren förlorar åtkomst utan att användaren märker det och utan att något manuell återkallning behövs. Detta är användbart för entreprenörer, tillfälliga datadelningsavtal eller tidsbegränsade projekt.

Om en användare behöver åtkomst till flera kombinationer av regioner och avdelningar lägger du till ytterligare rader.

Note

Håll mappningstabeller små och enkla. Varje fråga mot en skyddad tabell kör radfiltret och kolumnmaskens UDF:er, som i sin tur kör frågor mot mappningstabellen. Stora mappningstabeller och komplex UDF-logik kan påverka frågeprestanda. Använd smala scheman och behåll UDF-logik till en enda sökning där det är möjligt.

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

Steg 5: Skapa radfiltret UDF

Denna UDF tar emot en rads sales_region och dept värden (som skickas in av principen via taggmatchning), söker upp den aktuella användaren i mappningstabellen och returnerar TRUE endast om en matchande post finns och inte har upphört att gälla. Användare som inte finns i mappningstabellen, eller vars åtkomst har upphört att gälla, ser inga rader (inte stängd design).

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

Steg 6: Skapa kolumnmasken UDF

Denna UDF styr hur PII-kolumner visas. Det tar tre argument: kolumnvärdet, PII-typen ('name' eller 'email') och radens order_priority. Maskeringslogik har två lager:

  • Lager 1 (villkorlig maskering): Om order_priority är confidential, är PII alltid helt maskerad oavsett användarens klareringsnivå.
  • Lager 2 (användarfrigång): För standardrader kontrollerar UDF mappningstabellen efter användarens pii_access nivå och tillämpar motsvarande mask. Om en användare har flera mappningstabellposter (åtkomst till flera regioner) gäller den högsta rensningen för alla rader.
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;

Steg 7: Skapa principerna

Skapa tre principer som alla drivs av samma mappningstabell. Båda kolumnmaskprinciperna använder samma pii_mask funktion. Argumentet pii_type anger vilken maskeringsstil som ska användas för funktionen, så du behöver inte en separat UDF per kolumntyp.

Den priority reglerade taggen används i MATCH COLUMNS för att matcha order_priority kolumnen och skicka dess värde till maskens UDF som order_pri. Så här implementeras villkorsstyrd maskering: principen skickar radens prioritetsvärde till UDF vid frågetillfället.

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

Steg 8: Verifiera resultatet

Inlägget i mappningstabellen ger dig tillgång till us_east / engineering med masked klarering. Kör följande fråga för att kontrollera att du bara ser ordning nr 1, med PII delvis maskerad.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Order nr 1 har order_priority = 'standard', så ditt masked godkännande gäller.

Förväntat resultat för din användare:

order_id customer_name kundens_e-post försäljningsregion avdelning belopp orderdatum beställningsprioritet
1 A*** o***@acme.com us_east Teknik 50000 2025-01-15 standard

Vad andra användare ser:

Användare Synliga beställningar order_priority PII-beteende
bob@example.com (full klarering) #4 (us_west, försäljning) konfidentiell ***REDACTED***— Konfidentiella åsidosättningar full
carol@example.com (none klarering) #5 (eu, ingenjörskonst) standard ***REDACTED***none klarering innebär fullständig redigering
david@example.com (masked klarering) #7 (apac, marknadsföring) konfidentiell ***REDACTED***— Konfidentiell överskrider masked behörighet
(katalogägare) Alla 10 Alla omaskerade (ägaren är undantagen från principer)
(ej listad användare) Ingen Radfilter returnerar inga rader

Observera att bob har full åtkomst men kan fortfarande se ***REDACTED*** eftersom order nr 4 är confidential. Det här är villkorlig maskering: radens prioritetsvärde åsidosätter användargodkännande.

Steg 9: Uppdatera åtkomst dynamiskt

Den viktigaste fördelen med mappningstabellmetoden är att du kan ändra åtkomsten genom att uppdatera rader i tabellen. Du behöver inte uppdatera policyer, UDF:er eller gruppmedlemskap.

Tilldela om till en annan avdelning

Ändra din avdelning från engineering till sales. Order nr 2 (Beta Inc) är en confidential försäljningsorder, så dess PII maskeras fullständigt även om masked klarering har tilldelats.

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

Kör följande fråga för att verifiera. Du bör se beställning nr. 2 med ***REDACTED*** PII.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Återställ ändringen:

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

** Uppgradera PII-godkännande

Ändra ditt tillstånd från masked till full. För standardprioritetsrader ser du nu de faktiska PII-värdena.

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

Kör följande fråga för att verifiera. Order nr 1 är standard prioritet, så med full klarering bör du se Acme Corp och orders@acme.com.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Återställ ändringen:

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

Bevilja åtkomst till ytterligare en region

Infoga en andra rad för att bevilja åtkomst till EU:s teknik. Inga nya grupper eller principer krävs.

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

Kör följande fråga för att verifiera. Nu bör du se både order nr 1 (us_east, engineering) och order nr 5 (eu, engineering), med PII delvis maskerad.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Ta bort den ytterligare åtkomsten:

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

Avsluta åtkomst

Ange åtkomstposten till ett tidigare datum. Radfiltrets UDF kontrollerar expires_on >= current_date(), så utgångna poster ignoreras tyst och åtkomsten återkallas automatiskt. Detta är användbart för entreprenörer, datadelningsavtal med fast varaktighet eller tidsbegränsade projekt.

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

Kör följande fråga för att kontrollera att du inte ser några rader.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Återställ åtkomst med ett framtida förfallodatum:

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

Kör följande fråga för att kontrollera att åtkomsten har återställts.

SELECT * FROM abac_tutorial.mapping_demo.orders;

Sammanfattning

Den här handledningen illustrerade tre mönster:

  • Mappningstabellmönster: en enda uppslagstabell styr både radfiltrering och kolumnmaskering. Åtkomständringar görs genom att uppdatera rader, utan behov av några princip- eller gruppändringar.
  • Villkorsstyrd maskering: Maskens UDF kontrollerar order_priority kolumnen på varje rad för att bestämma hur PII ska maskeras. Konfidentiella rader redigeras alltid helt oavsett användarens behörighetsnivå, implementeras genom att tagga order_priority och skicka dem till UDF via MATCH COLUMNS.
  • Förfallodatum för åtkomst: mappningstabellen innehåller ett expires_on datum. Radfiltret UDF kontrollerar det här datumet mot current_date(), så poster som har upphört att gälla ignoreras utan åtgärd och åtkomst återkallas automatiskt utan manuella ingripanden.

Rensa

Om du vill ta bort alla objekt som skapats i den här självstudien kör du följande.

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;

För att ta bort de styrda taggarna region, department, pii, och priority, använd katalogutforskarens användargränssnitt.