Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym samouczku pokazano, jak za pomocą tabeli mapowania kontrolować dostęp na poziomie wiersza i na poziomie kolumn bez zarządzania dużą liczbą grup. Pojedyncza tabela wyszukiwania umożliwia filtrowanie wierszy i maskowanie kolumn. Zmiany dostępu wymagają tylko aktualizacji wiersza. Nie musisz tworzyć nowych grup ani ponownie pisać zasad.
W tym samouczku przedstawiono również maskowanie warunkowe: kolumny piI są maskowane inaczej w zależności od wartości innej kolumny w tym samym wierszu. Zamówienia oznaczone confidential mają swoje dane osobowe w pełni utajnione niezależnie od poziomu uprawnień użytkownika.
Aby uzyskać ogólne wskazówki dotyczące projektowania tabeli mapowania, zobacz Tworzenie listy kontroli dostępu przy użyciu tabel mapowania.
Wymagania wstępne
- Środowisko Databricks Runtime w wersji 16.4 lub nowszej, lub obliczeń bezserwerowych.
- Uprawnienia administratora konta lub administratora obszaru roboczego (aby utworzyć tagi zarządzane).
-
MANAGEuprawnienia do katalogu docelowego lub schematu. -
EXECUTEw UDF. - Notatnik SQL albo edytor zapytań.
Scenario
Twoja organizacja ma pracowników w czterech regionach (Wschodnie stany USA, Zachodnie stany USA, UE, APAC) i czterech działach. Każdy użytkownik powinien widzieć tylko wiersze pasujące do ich regionu i działu, a kolumny PII powinny być maskowane na podstawie dwóch czynników: poziomu uprawnień użytkownika (full, masked, lub none), przechowywanego w tabeli mapowania, oraz kolejności order_priority.
W przypadku podejścia opartego na grupach potrzebna jest grupa dla każdej kombinacji działów regionów. Na przykład potrzebujesz 16 grup dla czterech regionów i czterech działów. Dodanie poziomów przejrzystości PII trzykrotnie zwiększa tę liczbę. Każdy nowy region lub dział wymaga nowych grup i aktualizacji zasad.
Podejście do tabeli mapowania zastępuje to pojedynczą tabelą wyszukiwania: jeden wiersz na użytkownika, jedna kolumna na wymiar dostępu. Aby zmienić dostęp użytkownika, należy zaktualizować wiersz.
Krok 1: Tworzenie tagów zarządzanych
Przed uruchomieniem dowolnego kodu SQL utwórz następujące tagi zarządzane w interfejsie użytkownika Eksploratora katalogu (Wykaz>zarządzaj>zarządzanymi tagami>Utwórz zarządzany tag):
| Klucz tagu | Dozwolone wartości |
|---|---|
region |
(tag wyłącznie z kluczem) |
department |
(tag zawierający tylko klucz) |
pii |
name, email |
priority |
(tag jednoelementowy) |
Tagi region i department informują zasady filtrowania wierszy, które kolumny mają być przekazywane do filtru UDF. Tag pii informuje zasady maski kolumn, które kolumny mają być maskowania i jakiego typu dane osobowe zawierają. Tag priority pozwala zasadom maskowania kolumn przekazać order_priority wartość do funkcji zdefiniowanej przez użytkownika maski na potrzeby maskowania warunkowego.
Ostrzeżenie
Dane tagów są przechowywane jako zwykły tekst i mogą być replikowane globalnie. Nie używaj nazw tagów, wartości ani deskryptorów, które mogą naruszyć bezpieczeństwo zasobów. Na przykład nie należy używać nazw tagów, wartości ani deskryptorów zawierających informacje osobiste lub poufne.
Krok 2. Tworzenie przykładowych danych
Utwórz tabelę wykazu, schematu i zamówień. Kolumna order_priority napędza maskowanie warunkowe: oznaczone confidential zamówienia mają w pełni zredagowane dane osobowe, nawet dla użytkowników o wysokim poziomie dostępu.
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');
Krok 3: Stosuj zarządzane tagi
Oznacz kolumny, aby zasady ABAC mogły je odnajdywać automatycznie. Kolumna order_priority jest oznaczona tagiem priority przeznaczonym wyłącznie dla klucza, aby polityki maskowania kolumn mogły jej dotyczyć poprzez MATCH COLUMNS i przekazywać jej wartość do funkcji maskującej 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' = '');
Krok 4. Tworzenie tabeli mapowania
Zamiast tworzyć grupy dla każdego regionu, działu i kombinacji odprawy, utrzymujesz jedną tabelę z jednym wierszem na użytkownika. Kolumna pii_access steruje sposobem wyświetlania kolumn PII.
-
full— zobacz rzeczywistą wartość (w przypadku zamówień o standardowym priorytcie) -
masked— zobacz wartość częściową, taką jakA***lubo***@acme.com -
none— zobacz***REDACTED***
Kolumna expires_on ustawia datę wygaśnięcia dla każdego wpisu dostępu. Po tej dacie funkcja UDF filtru wierszy przestaje pasować do wpisu, a użytkownik dyskretnie traci dostęp bez konieczności ręcznego odwoływania. Jest to przydatne w przypadku wykonawców, tymczasowych umów dotyczących udostępniania danych lub projektów ograniczonych czasowo.
Jeśli użytkownik potrzebuje dostępu do wielu kombinacji regionów i działów, dodaj dodatkowe wiersze.
Uwaga / Notatka
Zachowaj małe i proste tabele mapowania. Każde zapytanie względem chronionej tabeli uruchamia filtr wierszy i funkcje zdefiniowane przez użytkownika maski kolumn, które z kolei wykonuje zapytanie względem tabeli mapowania. Duże tabele mapowania i złożona logika UDF mogą mieć wpływ na wydajność zapytań. Użyj wąskich schematów i utrzymuj logikę funkcji zdefiniowanych przez użytkownika do jednej operacji wyszukiwania, tam gdzie to możliwe.
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');
Krok 5: Utwórz UDF filtru wierszy
Ta funkcja UDF odbiera wartości sales_region i dept wierszy (przekazywane przez politykę za pomocą dopasowywania tagów), wyszukuje bieżącego użytkownika w tabeli mapowań i zwraca TRUE tylko wtedy, gdy istnieje pasujący wpis, który nie wygasł. Użytkownicy, którzy nie znajdują się w tabeli mapowania lub których dostęp wygasł, nie widzą wierszy (projekt zamknięty w trybie fail-closed).
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()
);
Krok 6. Tworzenie funkcji UDF maski kolumn zdefiniowanej przez użytkownika
Ta funkcja UDF określa sposób wyświetlania kolumn zawierających dane osobowe. Przyjmuje trzy argumenty: wartość kolumny, typ PII ('name' lub 'email') i wiersz order_priority. Logika maskowania ma dwie warstwy:
-
Warstwa 1 (maskowanie warunkowe): Jeśli
order_prioritywartość toconfidential, PII jest zawsze w pełni redagowane niezależnie od poziomu uprawnień użytkownika. -
Warstwa 2 (autoryzacja użytkownika): Dla standardowych wierszy funkcja UDF sprawdza tabelę mapowania dla poziomu użytkownika
pii_accessi stosuje odpowiednią maskę. Jeśli użytkownik ma wiele wpisów tabeli mapowania (dostęp do wielu regionów), stosuje się najwyższy poziom uprawnień we wszystkich wierszach.
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;
Krok 7. Tworzenie zasad
Utwórz trzy zasady, wszystkie oparte na tej samej tabeli mapowania. Obie zasady maskowania kolumn używają tej samej pii_mask funkcji. Argument pii_type informuje funkcję, która ma być stosowana w stylu maskowania, więc nie potrzebujesz oddzielnej funkcji zdefiniowanej przez użytkownika dla typu kolumny.
Tag priority zarządzany jest używany w MATCH COLUMNS w celu dopasowania do order_priority kolumny i przekazywania jej wartości jako order_pri do funkcji UDF maski. W ten sposób zaimplementowano maskowanie warunkowe: polityka przekazuje wartość priorytetu wiersza do funkcji zdefiniowanej przez użytkownika podczas wykonywania zapytania.
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);
Krok 8. Weryfikowanie wyników
Wpis tabeli mapowania zapewnia dostęp do us_east / engineering z uprawnieniami masked. Uruchom następujące zapytanie, aby sprawdzić, czy widzisz tylko zamówienie nr 1 z częściowo zamaskowanymi danymi PII.
SELECT * FROM abac_tutorial.mapping_demo.orders;
Zamówienie nr 1 ma order_priority = 'standard', więc twoje masked clearance ma zastosowanie.
Oczekiwany wynik dla użytkownika:
| identyfikator_zamówienia | nazwa_klienta | email_klienta | region sprzedaży | dział | kwota | data zamówienia | priorytet_zamówienia |
|---|---|---|---|---|---|---|---|
| 1 | A*** |
o***@acme.com |
us_east | Inżynieria | 50000 | 2025-01-15 | standard |
Co widzą inni użytkownicy:
| User | Widoczne zamówienia | priorytet_zamówienia | Zachowanie danych osobowych |
|---|---|---|---|
bob@example.com (full prześwit) |
#4 (us_west, sprzedaż) | poufny |
***REDACTED*** — poufność przesłania full uprawnienia |
carol@example.com (none prześwit) |
#5 (eu, inżynieria) | standard |
***REDACTED*** — none uprawnienia oznaczają całkowitą cenzurę |
david@example.com (masked prześwit) |
#7 (apac, marketing) | poufny |
***REDACTED*** — poufność ma pierwszeństwo przed masked uprawnieniami |
| (właściciel wykazu) | Wszystkie 10 | — | Wszystkie niemaskowane (właściciel nie podlega zasadom) |
| (nieznajdowany użytkownik) | Żadne | — | Filtr wierszy nie zwraca wierszy |
Zwróć uwagę, że Bob ma full uprawnienia, ale nadal ma dostęp do ***REDACTED***, ponieważ zamówienie nr 4 jest confidential. Jest to maskowanie warunkowe: wartość priorytetu wiersza przeważa nad uprawnieniami użytkownika.
Krok 9. Dynamiczne aktualizowanie dostępu
Kluczową zaletą podejścia do tabeli mapowania jest możliwość zmiany dostępu przez zaktualizowanie wierszy w tabeli. Nie musisz aktualizować polityk, ani funkcji zdefiniowanych przez użytkownika, ani członkostw w grupach.
Ponowne przypisywanie do innego działu
Zmień dział z engineering na sales. Order #2 (Beta Inc) jest zamówieniem confidential sprzedaży, więc jego dane osobowe są w pełni ocenzurowane nawet przy posiadaniu masked dostępu.
UPDATE abac_tutorial.mapping_demo.user_access
SET department = 'sales'
WHERE user_email = current_user();
Uruchom następujące zapytanie, aby sprawdzić. Powinno zostać wyświetlone zamówienie nr 2 z ***REDACTED*** danymi osobowymi.
SELECT * FROM abac_tutorial.mapping_demo.orders;
Przywróć zmianę:
UPDATE abac_tutorial.mapping_demo.user_access
SET department = 'engineering'
WHERE user_email = current_user();
Aktualizacja uprawnień dotyczących PII
Zmień prześwit z masked na full. W przypadku wierszy o standardowym priorytecie są teraz widoczne rzeczywiste wartości danych osobowych.
UPDATE abac_tutorial.mapping_demo.user_access
SET pii_access = 'full'
WHERE user_email = current_user();
Uruchom następujące zapytanie, aby sprawdzić. Zlecenie nr 1 ma standard priorytet, więc przy full zgodzie powinieneś zobaczyć Acme Corp i orders@acme.com.
SELECT * FROM abac_tutorial.mapping_demo.orders;
Przywróć zmianę:
UPDATE abac_tutorial.mapping_demo.user_access
SET pii_access = 'masked'
WHERE user_email = current_user();
Udzielanie dostępu do dodatkowego regionu
Wstaw drugi wiersz, aby udzielić dostępu do działu inżynierii UE. Nie są wymagane żadne nowe grupy ani zasady.
INSERT INTO abac_tutorial.mapping_demo.user_access
VALUES (current_user(), 'eu', 'engineering', 'masked', '2099-12-31');
Uruchom następujące zapytanie, aby sprawdzić. Teraz powinny być widoczne zarówno zamówienie #1 (us_east, inżynieria) i zamówienie #5 (eu, inżynieria), z częściowo zamaskowanymi danymi PII.
SELECT * FROM abac_tutorial.mapping_demo.orders;
Usuń dodatkowy dostęp:
DELETE FROM abac_tutorial.mapping_demo.user_access
WHERE user_email = current_user() AND region = 'eu';
Wygasanie dostępu
Ustaw wpis dostępu na datę wcześniejszą. Funkcja UDF filtru wierszy przeprowadza weryfikację expires_on >= current_date(), więc wygasłe wpisy są po cichu ignorowane, a dostęp jest automatycznie cofany. Jest to przydatne w przypadku wykonawców, umów dotyczących udostępniania danych z ustalonym czasem trwania lub projektów ograniczonych czasowo.
UPDATE abac_tutorial.mapping_demo.user_access
SET expires_on = current_date() - INTERVAL 1 DAY
WHERE user_email = current_user();
Uruchom następujące zapytanie, aby sprawdzić, czy nie widzisz żadnych wierszy.
SELECT * FROM abac_tutorial.mapping_demo.orders;
Przywróć dostęp przy użyciu przyszłej daty wygaśnięcia:
UPDATE abac_tutorial.mapping_demo.user_access
SET expires_on = '2099-12-31'
WHERE user_email = current_user();
Uruchom następujące zapytanie, aby sprawdzić, czy dostęp został przywrócony.
SELECT * FROM abac_tutorial.mapping_demo.orders;
Podsumowanie
W tym samouczku przedstawiono trzy wzorce:
- Wzorzec tabeli mapowania: pojedyncza tablica przeszukiwań zarządza filtrowaniem wierszy i maskowaniem kolumn. Zmiany dostępu są wprowadzane przez aktualizowanie wierszy bez konieczności wprowadzania zmian zasad ani grup.
-
Maskowanie warunkowe: funkcja maskowania UDF sprawdza kolumnę
order_priorityw każdym wierszu, aby zdecydować, jak maskować dane osobowe (PII). Poufne wiersze są zawsze w pełni redagowane niezależnie od poziomu uprawnień użytkownika, implementowane przez tagowanieorder_priorityi przekazywanie ich do funkcji zdefiniowanej przez użytkownika za pomocąMATCH COLUMNS. -
Wygaśnięcie dostępu: tabela mapowania zawiera
expires_ondatę. Funkcja UDF filtru wierszy sprawdza tę datę względem elementucurrent_date(), więc wygasłe wpisy są dyskretnie ignorowane, a dostęp jest automatycznie odwoływany bez potrzeby ręcznej interwencji.
Czyszczenie
Aby usunąć wszystkie obiekty utworzone w tym samouczku, uruchom następujące polecenie.
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;
Aby usunąć tagi region, department, pii i priority w kontrolowanych obszarach, użyj interfejsu Eksploratora katalogu.