Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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).
-
MANAGEtillstånd för målkatalogen eller schemat. -
EXECUTEpå 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 somA***ellero***@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ärconfidential, är PII alltid helt maskerad oavsett användarens klareringsnivå. -
Lager 2 (användarfrigång): För standardrader kontrollerar UDF mappningstabellen efter användarens
pii_accessnivå 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_prioritykolumnen 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 taggaorder_priorityoch skicka dem till UDF viaMATCH COLUMNS. -
Förfallodatum för åtkomst: mappningstabellen innehåller ett
expires_ondatum. Radfiltret UDF kontrollerar det här datumet motcurrent_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.