Samouczek: konfigurowanie usługi ABAC przy użyciu programu SQL

W tym samouczku pokazano, jak skonfigurować w katalogu Unity Catalog zasady ABAC dotyczące filtru wierszy i maski kolumn przy użyciu języka SQL. Aby zapoznać się z wersją opartą na interfejsie użytkownika eksploratora wykazu, zobacz Samouczek: konfigurowanie usługi ABAC.

W tym przykładzie zespół analiz nie może uzyskać dostępu do danych klientów z UE, a numery ubezpieczenia społecznego (SSN) są zawsze maskowane. Klienci, którzy wyrazili zgodę na udostępnianie danych, mają wyświetloną pełną wiadomość e-mail. Inni widzą tylko maskowaną wersję.

Ten samouczek obejmuje następujące kroki:

  1. Twórz tagi regulowane
  2. Utwórz katalog Unity Catalog, schemat i tabelę.
  3. Nakładanie tagów na kolumny podlegające reglamentacji
  4. Utwórz funkcję użytkownika do wykrywania adresów UE
  5. Utwórz zasady filtrowania wierszy
  6. Przetestuj filtr wierszy
  7. Stwórz FZPU do maskowania numerów ubezpieczenia społecznego.
  8. Tworzenie zasad maski kolumn
  9. Testowanie maski kolumn

Po wykonaniu tych kroków możesz opcjonalnie rozszerzyć samouczek przy użyciu warunkowego maskowania wiadomości e-mail (kroki 10–12).

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).
  • MANAGE uprawnienia do katalogu docelowego lub schematu.
  • EXECUTE w UDF.

Środowisko obliczeniowe ze starszymi środowiskami uruchomieniowymi nie może uzyskać dostępu do tabel zabezpieczonych przez usługę ABAC.

Krok 1: Tworzenie tagów zarządzanych

Tagi zarządzane to pary klucz-wartość zdefiniowane na poziomie konta. Zasady ABAC używają tych elementów do odnajdywania, które kolumny należy filtrować lub maskować. W tym samouczku utworzysz dwa zarządzane tagi:

  • Tag z trzema pii dozwolonymi wartościami: ssn, addressi email
  • Tag tylko jako klucz (bez dozwolonych wartości) do identyfikacji kolumn zgody

Aby utworzyć zarządzany tag, musisz mieć uprawnienia do tworzenia zarządzanych tagów na poziomie konta. Administratorzy kont i obszarów roboczych domyślnie mają uprawnienia CREATE.

  1. W obszarze roboczym Azure Databricks kliknij pozycję Ikona danych.Catalog.
  2. Kliknij ikonę Tarcza.Przycisk Zarządzaj .
  3. W menu rozwijanym kliknij pozycję Zarządzane tagi.
  4. Kliknij pozycję Utwórz tag zarządzany.
  5. Dla klucza tagu wprowadź pii.
  6. Wprowadź opis tagu zarządzanego.
  7. W przypadku dozwolonych wartości wprowadź: ssn, addressi email. Do tego klucza tagu można przypisać tylko te wartości.
  8. Kliknij Utwórz.
  9. Powtórz kroki 4–8, aby utworzyć drugi tag zarządzany za pomocą klucza consent. Pozostaw dozwolone wartości puste (tylko tag z kluczem).

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: Utwórz tabelę klientów

Utwórz wykaz, schemat i tabelę z profilami klientów. Kolumna has_consent jest później używana do warunkowego maskowania wiadomości e-mail. Klienci, którzy wyrazili zgodę (TRUE), mają wyświetloną pełną wiadomość e-mail.

Uruchom następujące polecenia w notesie dołączonym do obliczeń w środowisku Databricks Runtime 16.4 lub nowszym:

-- Create catalog (if not already exists)
CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;

-- Create schema
CREATE SCHEMA IF NOT EXISTS customers;
USE SCHEMA customers;
CREATE OR REPLACE TABLE profiles (
    first_name STRING,
    last_name STRING,
    email STRING,
    phone_number STRING,
    home_address STRING,
    ssn_number STRING,
    has_consent BOOLEAN
);
INSERT INTO profiles (first_name, last_name, email, phone_number, home_address, ssn_number, has_consent)
VALUES
('John', 'Doe', 'john.doe@example.com', '123-456-7890', '123 Main St, NY', '123-45-6789', TRUE),
('Jane', 'Smith', 'jane.smith@example.com', '234-567-8901', '456 Oak St, CA', '234-56-7890', FALSE),
('Alice', 'Johnson', 'alice.j@example.com', '345-678-9012', '789 Pine St, TX', '345-67-8901', TRUE),
('Bob', 'Brown', 'bob.brown@example.com', '456-789-0123', '321 Maple St, FL', '456-78-9012', FALSE),
('Charlie', 'Davis', 'charlie.d@example.com', '567-890-1234', '654 Cedar St, IL', '567-89-0123', TRUE),
('Emily', 'White', 'emily.w@example.com', '678-901-2345', '987 Birch St, WA', '678-90-1234', FALSE),
('Frank', 'Miller', 'frank.m@example.com', '789-012-3456', '741 Spruce St, WA', '789-01-2345', TRUE),
('Grace', 'Wilson', 'grace.w@example.com', '890-123-4567', '852 Elm St, NV', '890-12-3456', TRUE),
('Hank', 'Moore', 'hank.moore@example.com', '901-234-5678', '963 Walnut St, CO', '901-23-4567', FALSE),
('Ivy', 'Taylor', 'ivy.taylor@example.com', '012-345-6789', '159 Aspen St, AZ', '012-34-5678', TRUE),
('Liam', 'Connor', 'liam.c@example.com', '111-222-3333', '12 Abbey Street, Dublin, Ireland EU', '111-22-3333', TRUE),
('Sophie', 'Dubois', 'sophie.d@example.com', '222-333-4444', '45 Rue de Rivoli, Paris, France Europe', '222-33-4444', FALSE),
('Hans', 'Müller', 'hans.m@example.com', '333-444-5555', '78 Berliner Str., Berlin, Germany E.U.', '333-44-5555', TRUE),
('Elena', 'Rossi', 'elena.r@example.com', '444-555-6666', '23 Via Roma, Milan, Italy Europe', '444-55-6666', FALSE),
('Johan', 'Andersson', 'johan.a@example.com', '555-666-7777', '56 Drottninggatan, Stockholm, Sweden EU', '555-66-7777', TRUE);

Krok 3. Dodawanie zarządzanych tagów do kolumn

Taguj kolumny ssn_number, home_address i email za pomocą tagu pii zarządzanego. Zasady ABAC dopasowują kolumny na podstawie tagu, a nie nazwy.

Kolumna has_consent jest oznaczona tagiem zarządzanym consent . Jest to wymagane do realizacji zasad maskowania świadomych zgody w kroku 11, które przekazują has_consent do funkcji zdefiniowanej przez użytkownika za pośrednictwem USING COLUMNS.

ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN ssn_number
SET TAGS ('pii' = 'ssn');

ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN home_address
SET TAGS ('pii' = 'address');

ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN email
SET TAGS ('pii' = 'email');

ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN has_consent
SET TAGS ('consent' = '');

Krok 4: Tworzenie funkcji UDF do wykrywania adresów UE

Funkcja zdefiniowana przez użytkownika otrzymuje wartość każdej otagowanej pii = address kolumny i zwraca następujące elementy:

  • FALSE jeśli adres zawiera EU, E.U.lub Europe — wiersz jest ukryty.
  • TRUE w przeciwnym razie — wiersz zostanie wyświetlony.
CREATE OR REPLACE FUNCTION is_not_eu_address(address STRING)
RETURNS BOOLEAN
RETURN (
    SELECT CASE
        WHEN LOWER(address) LIKE '%eu%'
          OR LOWER(address) LIKE '%e.u.%'
          OR LOWER(address) LIKE '%europe%'
        THEN FALSE
        ELSE TRUE
    END
);

Uwaga / Notatka

Jest to uproszczona kontrola w celach demonstracyjnych. W środowisku produkcyjnym użyj bardziej niezawodnej metody, takiej jak kolumna kodu kraju lub tabela odnośników, aby określić region.

Krok 5. Tworzenie zasad filtru wierszy

Aby utworzyć zasady, musisz mieć MANAGE obiekt lub własność obiektu. Aby dodać UDF do polityki, musisz mieć EXECUTE na UDF.

CREATE POLICY hide_eu_customers
ON SCHEMA abac_tutorial.customers
ROW FILTER is_not_eu_address
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'address') AS addr_col
USING COLUMNS (addr_col);

Zasady można również tworzyć za pomocą interfejsu użytkownika Eksploratora wykazu. Aby uzyskać szczegółowe informacje, zobacz Tworzenie filtrów wierszy i zasad maski kolumn i zarządzanie nimi .

Krok 6. Testowanie filtru wierszy

Uruchom następujące zapytanie, aby sprawdzić, czy zasady filtrowania wierszy działają.

SELECT * FROM abac_tutorial.customers.profiles;

Zwracane są tylko 10 wierszy niebędących rezydentami UE. Pięciu klientów UE (Liam, Sophie, Hans, Elena i Johan) jest ukrytych.

Krok 7: Utwórz funkcję zdefiniowaną przez użytkownika w celu maskowania numerów SSN

Ta funkcja UDF zwraca w pełni zredagowany symbol zastępczy dla dowolnej przekazanej do niej wartości SSN.

CREATE OR REPLACE FUNCTION redact_ssn(ssn STRING)
RETURNS STRING
RETURN '***-**-****';

Krok 8. Tworzenie zasad maski kolumn

Utwórz politykę dotyczącą wszystkich kolumn oznaczonych tagami pii = ssn i stosując funkcję redact_ssn do każdej z nich.

CREATE POLICY redact_ssn_policy
ON SCHEMA abac_tutorial.customers
COLUMN MASK redact_ssn
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn_col
ON COLUMN ssn_col;

Krok 9. Testowanie maski kolumn

Uruchom następujące zapytanie, aby sprawdzić, czy filtr wierszy i maska kolumn są aktywne.

SELECT * FROM abac_tutorial.customers.profiles;

Numery SSN teraz wracają jako ***-**-****. Zwracani są tylko mieszkańcy spoza UE, ponieważ filtr wykazu jest również aktywny.

Rozszerzanie: warunkowe maskowanie wiadomości e-mail

Poniższe kroki rozszerzają proces maskowania wiadomości e-mail uwzględniającym zgodę. Klienci, którzy wyrazili zgodę (has_consent = TRUE) mają wyświetloną pełną wiadomość e-mail. Inni widzą tylko pierwszy znak i domenę.

Ta funkcja zdefiniowana przez użytkownika (UDF) przyjmuje dwa argumenty.

  • email: rzeczywista wartość wiadomości e-mail z dopasowanej kolumny
  • consent: wartość has_consent kolumny w tym samym wierszu
CREATE OR REPLACE FUNCTION mask_email_by_consent(email STRING, consent BOOLEAN)
RETURNS STRING
RETURN CASE
  WHEN consent = TRUE THEN email
  ELSE CONCAT(LEFT(email, 1), '***@', SUBSTRING_INDEX(email, '@', -1))
END;

Krok 11. Tworzenie warunkowych zasad maskowania wiadomości e-mail

Ta polityka dotyczy kolumn oznaczonych tagami pii = email i przekazuje kolumnę has_consent do funkcji zdefiniowanej przez użytkownika.

Uwaga / Notatka

Kolumna has_consent została oznaczona tagiem zarządzanym consent w kroku 3. Jest to wymagane, ponieważ USING COLUMNS może odwoływać się tylko do kolumn, które są zgodne za pośrednictwem elementu MATCH COLUMNS. Mimo że has_consent nie jest maskowany, należy go oznaczyć, aby polityka mogła przekazać jego wartość do funkcji zdefiniowanej przez użytkownika.

CREATE POLICY mask_email_by_consent_policy
ON SCHEMA abac_tutorial.customers
COLUMN MASK mask_email_by_consent
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'email') AS email_col,
  has_tag('consent') AS consent_col
ON COLUMN email_col
USING COLUMNS (consent_col);

Krok 12. Testowanie warunkowego maskowania poczty e-mail

Uruchom następujące zapytanie, aby sprawdzić, czy wszystkie trzy zasady współpracują ze sobą.

SELECT * FROM abac_tutorial.customers.profiles;

Klienci z has_consent = TRUE mają pełny adres e-mail wyświetlony. Klienci, którzy has_consent = FALSE widzą maskowaną wersję. Numery SSN pozostają w pełni zamaskowane, a zwracani są tylko klienci spoza UE.

imię ma_zgodę e-mail ssn_number
John TRUE john.doe@example.com ***-**-****
Jane FALSE j***@example.com ***-**-****
Alicja TRUE alice.j@example.com ***-**-****
Robert FALSE b***@example.com ***-**-****
Charlie TRUE charlie.d@example.com ***-**-****
Emily FALSE e***@example.com ***-**-****
Frank TRUE frank.m@example.com ***-**-****
Wdzięk TRUE grace.w@example.com ***-**-****
Hank FALSE h***@example.com ***-**-****
Bluszcz TRUE ivy.taylor@example.com ***-**-****

Podsumowanie

W tym samouczku przedstawiono trzy wzorce ABAC:

  • Filtrowanie wierszy: ukrywa wiersze na podstawie wartości kolumn dopasowanych przez tagi zarządzane
  • Maskowanie kolumn: maskowanie kolumn pasujących do tagów podlegających
  • Maskowanie warunkowe: maskowanie kolumny na podstawie wartości innej kolumny w tym samym wierszu poprzez oznaczanie kolumny kontekstu i przekazywanie jej do funkcji zdefiniowanej przez użytkownika, używając USING COLUMNS

Czyszczenie

Aby usunąć wszystkie obiekty utworzone w tym samouczku, uruchom następujące polecenie. Jeśli pominięto kroki warunkowego maskowania wiadomości e-mail, instrukcje DROP POLICY mask_email_by_consent_policy i DROP FUNCTION mask_email_by_consent kończą się niepowodzeniem, co jest oczekiwane.

DROP POLICY hide_eu_customers ON SCHEMA abac_tutorial.customers;
DROP POLICY redact_ssn_policy ON SCHEMA abac_tutorial.customers;
DROP POLICY mask_email_by_consent_policy ON SCHEMA abac_tutorial.customers;
DROP FUNCTION IF EXISTS abac_tutorial.customers.is_not_eu_address;
DROP FUNCTION IF EXISTS abac_tutorial.customers.redact_ssn;
DROP FUNCTION IF EXISTS abac_tutorial.customers.mask_email_by_consent;
DROP TABLE IF EXISTS abac_tutorial.customers.profiles;
DROP SCHEMA IF EXISTS abac_tutorial.customers CASCADE;

Aby usunąć tagi pii i consent zarządzane, użyj interfejsu użytkownika Eksploratora Katalogu.