Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tato stránka popisuje běžné vzory implementace zásad filtrování řádků ABAC a masky sloupců.
- Celkové koncepty najdete v základních konceptech řízení přístupu na základě atributů (ABAC).
- Syntaxi zásad najdete v tématu Vytváření a správa zásad filtrování řádků a masky sloupců.
- Pro GRANT zásady viz ABAC GRANT politiky.
- Pokud vaše prostředí používá RBAC, přečtěte si téma Použití RBAC s ABAC , jak se funkce identit chovají, když uživatelé přebírají roli, a vzory, které kombinují RBAC s ABAC.
Funkce maskování kompatibilní s Cast
Azure Databricks automaticky přetypuje výstup maskovací funkce tak, aby odpovídal datovému typu cílového sloupce. Viz Automatické přetypování pro masky sloupců.
Následující vzory vám pomůžou navrhnout funkce maskování kompatibilní s přetypováním.
Vrácení přetypovatelného typu
Při maskování sloupce vraťte stejný datový typ nebo typ, který je pro něj možné přetypovat. Zkontrolujte datové typy sloupců, na které zásady cílí, a ověřte, že každá větev funkce vrací kompatibilní hodnotu.
-- Succeeds: Masks a DOUBLE column, returns DOUBLE in every branch
CREATE FUNCTION mask_salary(salary DOUBLE, user_role STRING)
RETURNS DOUBLE
RETURN CASE
WHEN user_role IN ('admin', 'hr') THEN salary
WHEN user_role = 'manager' THEN ROUND(salary / 1000) * 1000
ELSE 0.0
END;
-- Fails: 'CONFIDENTIAL' cannot be cast to a DOUBLE column type
CREATE FUNCTION mask_salary_as_text(salary DOUBLE, user_role STRING)
RETURNS STRING
RETURN CASE
WHEN user_role IN ('admin', 'hr') THEN CAST(salary AS STRING)
ELSE 'CONFIDENTIAL'
END;
Vyhněte se přetečení čísel
Když funkce masky přijme a vrátí širší číselný typ než cílový sloupec, výsledek se automaticky přetypuje zpět na typ sloupce. Pokud vrácená hodnota překročí rozsah užšího typu, přetéká a dotaz za běhu selže.
-- The target column is TINYINT (max 127). The input is upcast to BIGINT
-- for the function. Adding 1000 produces a BIGINT result that overflows
-- when cast back to TINYINT.
CREATE FUNCTION mask_score(score BIGINT)
RETURNS BIGINT
RETURN score + 1000;
Použití VARIANT pro více typů sloupců
Viz funkce maskování založené na variantách pro více typů sloupců.
Kompatibilita testovacího případu
Otestujte maskovací funkce s různými vzory dat.
SELECT CAST(mask_salary(salary, 'admin') AS DOUBLE) FROM employees;
SELECT CAST(mask_salary(salary, 'manager') AS DOUBLE) FROM employees;
SELECT CAST(mask_salary(salary, 'viewer') AS DOUBLE) FROM employees;
Funkce maskování založené na variantách pro více typů sloupců
Pokud potřebujete maskovat sloupce různých datových typů (například INT, DOUBLE, DECIMAL(10,2), DECIMAL(15,5)a tak dále), můžete napsat jeden maskující UDF, který přijímá a vrací VARIANT typ. Azure Databricks automaticky přetypuje výstup funkce masky sloupce tak, aby odpovídal datovému typu cílového sloupce podle standardů ANSI SQL.
Tento přístup snižuje počet UDF a zásad, které jsou potřeba. Místo psaní samostatných maskovacích funkcí pro každý typ sloupce jedna funkce zpracovává všechny typy.
Maskování více číselných typů pomocí jedné funkce
Místo vytvoření samostatné maskové funkce pro každou číselnou přesnost je můžete použít VARIANT ke zpracování všech pomocí jedné funkce:
CREATE FUNCTION mask_numeric(val VARIANT)
RETURNS VARIANT
DETERMINISTIC
RETURN 0::VARIANT;
Tato funkce vrátí 0 jako VARIANT a Azure Databricks jej automaticky přetypuje na typ cílového sloupce. Jedna zásada ABAC používající tuto funkci může maskovat INT, DOUBLEa DECIMAL sloupce bez nutnosti samostatných funkcí pro každou přesnost.
Pokud preferujete zachování typu explicitně ve funkci, můžete rozčlenit na základě typu a vrátit pro každý typ odpovídající maskovanou hodnotu pomocí schema_of_variant():
-- Use VARIANT to accommodate different data types
CREATE FUNCTION flexible_mask(data VARIANT)
RETURNS VARIANT
RETURN CASE
WHEN schema_of_variant(data) = 'INT' THEN 0::VARIANT
WHEN schema_of_variant(data) = 'DATE' THEN DATE'1970-01-01'::VARIANT
WHEN schema_of_variant(data) = 'DOUBLE' THEN 0.00::VARIANT
ELSE NULL::VARIANT
END;
Maskování strukturovaných sloupců s VARIANT
Pro Databricks Runtime 18.1 a vyšší můžete také maskovat sloupce typu struct tím, že je přetypujete v rámci zásady ABAC na VARIANT. Větvení podle tvaru struktury pro selektivní utajení polí:
Note
Přetypování struktur na VARIANT pro maskování je podporováno pouze v rámci politik maskování sloupců ABAC.
Následující příklad používá schema_of_variant() k identifikaci dvou různých obrazců struktury a redakce citlivých polí v jednotlivých polích:
CREATE FUNCTION flexible_mask(data VARIANT)
RETURNS VARIANT
RETURN CASE
WHEN schema_of_variant(data) = 'OBJECT<age: BIGINT, email: STRING>' THEN
to_variant_object(named_struct('age', data:age, 'email', 'redacted'))
WHEN schema_of_variant(data) = 'OBJECT<id: BIGINT, ssn: STRING>' THEN
to_variant_object(named_struct('id', data:id, 'ssn', 'xxx-xx-xxxx'))
ELSE NULL::VARIANT
END;
Zabránění přístupu, dokud nebudou označené citlivé sloupce
Běžným vzorem zásad správného řízení je řízení přístupu na základě toho, jestli byla data klasifikovaná. Můžete to implementovat s výchozí omezující značkou a zásadami, které vynucují různé úrovně ochrany v závislosti na stavu klasifikace.
- Použít značku jako
classification : unverifiedu všech nových objektů ve výchozím nastavení prostřednictvím automatizace nebo dědičnosti značek použitím značky na úrovni katalogu nebo schématu, aby všechny nové tabulky přidané do katalogu nebo schématu automaticky dědily značku. - Vytvořte zásadu filtru řádků, která blokuje přístup k tabulkám označeným
classification : unverified. - Vytvořte zásadu masky sloupce, která maskuje citlivé sloupce v tabulkách, kde
classification : unverifieduž značka neexistuje. - Když správce dat dokončí klasifikaci, aktualizuje značku. Zásady blokování již neodpovídají a zásady maskování vstupují v platnost.
-- Block access to unverified tables for all non-admin users
CREATE FUNCTION catalog.schema.block_all() RETURNS BOOLEAN
RETURN FALSE;
CREATE POLICY block_unverified
ON CATALOG my_catalog
ROW FILTER catalog.schema.block_all
TO `account users` EXCEPT `data_admins`
FOR TABLES
WHEN has_tag_value('classification', 'unverified');
Pokud chcete chránit citlivá data po klasifikaci, definujte zásadu masky sloupce, která se projeví, když classification : unverified už značka neexistuje:
CREATE FUNCTION catalog.schema.mask_pii(val STRING)
RETURNS STRING
RETURN '***';
CREATE POLICY mask_reviewed_pii
ON CATALOG my_catalog
COLUMN MASK catalog.schema.mask_pii
TO `account users`
EXCEPT `data_admins`
FOR TABLES
WHEN NOT has_tag_value('classification', 'unverified')
MATCH COLUMNS (has_tag_value('pii', 'name') OR has_tag_value('pii', 'address')) AS m
ON COLUMN m;
Částečné odhalení bez regulárního výrazu
Zobrazte část citlivé hodnoty pomocí řetězcových operací místo regulárních výrazů. Maskování založené na regulárních výrazech kontroluje celou hodnotu pro každý řádek, což je nákladné u velkých textových polí (viz Vyhněte se maskování regulárních výrazů u velkých textových polí).
CREATE FUNCTION mask_ssn(ssn STRING, show_last INT) RETURNS STRING
DETERMINISTIC
RETURN CONCAT('***-**-', RIGHT(ssn, show_last));
Konzistentní hashování (deterministické pseudonymizace)
Konzistentní hashování (označované také jako deterministické pseudonymizace) nahrazuje citlivá data hodnotou hash, která je stejná napříč několika tabulkami. Označení funkce tak, jak DETERMINISTIC říká modulu, že funkce vždy vrací stejný výsledek pro stejný vstup, což pomáhá optimalizovat dotaz. Viz Použití deterministických a chybově bezpečných výrazů.
Následující funkce konzistentně hashuje řetězcovou hodnotu a používá version parametr pro podporu obměny klíčů. Prostřednictvím klauzule zásady version zvyšte USING COLUMNS číslici, aby se generovaly nové hashy, aniž by se přerušila historická data, která používala předchozí verzi. Funkce zřetězí původní hodnotu s číslem verze před hashováním, takže stejný vstup se stejnou verzí vždy vytvoří stejnou hodnotu hash.
CREATE FUNCTION pseudonymize(val STRING, version INT) RETURNS STRING
DETERMINISTIC
RETURN SHA2(CONCAT(val, CAST(version AS STRING)), 256);
Maskujte sloupec založený na atributech dotazujícího uživatele
Important
Atributy identity v zásadách ABAC jsou ve verzi beta. Chcete-li je použít, musí správce účtu na stránce Previews v konzoli účtu povolit náhledovou funkci Identity Attributes in ABAC Policies. Viz Správa náhledů na úrovni účtu.
Politika sloupcové masky může využít atributy identity dotazovaného uživatele k zakrytí citlivých dat bez nutnosti vyhrazených skupin. Například může udržet data nemaskovaná pro uživatele department = HR a maskovat je pro ostatní.
Tyto vzory vyžadují atributy identity, které jsou uživatelům poskytovány od poskytovatele identity, a funkce se chovají odlišně od podmínek pouze pro tagy, což ovlivňuje způsob, jakým politiku píšete. Před jejich použitím si projděte funkce atributů identity a atributy identity.
Important
Funkce se vyhodnotí jako false, pokud uživatel nemá pro atribut žádnou hodnotu nebo pokud klíč atributu neexistuje. Napište podmínku tak, aby tento false výsledek omezoval přístup, místo aby jej povolil. Pomocí NOT znegujte shodu tak, aby se maska použila, pokud se atribut neshoduje. Například maskuje WHEN NOT has_identity_attribute_value('department', 'HR') sloupec pro všechny kromě uživatelů, jejichž oddělení je , HRa protože chybějící hodnota je také false, jsou maskováni i uživatelé bez atributu oddělení. Vyhněte se opačnému postupu: podmínka, která zamaskuje pouze v případě, že atribut odpovídá, ponechá uživatele, kteří pro tento atribut nemají žádnou hodnotu, nezamaskované.
Pro vyhodnocovací chování viz Podmínky atributů identity. Pro omezení viz Atributy identity v podmínkách zásad.
Porovnat s pevnou hodnotou
Skrýt ssn pro všechny, jejichž oddělení není HR:
CREATE FUNCTION hr_catalog.people.mask_ssn(s STRING) RETURNS STRING RETURN '***-**-****';
CREATE OR REPLACE POLICY mask_ssn_non_hr
ON SCHEMA hr_catalog.people
COLUMN MASK hr_catalog.people.mask_ssn
TO `account users`
FOR TABLES
WHEN NOT has_identity_attribute_value('department', 'HR')
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn_col
ON COLUMN ssn_col;
V tomto příkladu uživatel, jehož oddělení je, HR vidí skutečné hodnoty. Uživatel v jakémkoli jiném oddělení i uživatel bez atributu oddělení vidí masku.
Zápas proti řízenému tagu
Předchozí příklad uvádí konkrétní hodnotu atributu (HR) v politice, takže pokrytí několika oddělení by znamenalo napsat samostatnou politiku pro každé z nich. Pro pokrytí všech oddělení jednou politikou označte každou tabulku oddělením, které ji vlastní, a poté porovnejte atribut dotazovaného uživatele department s tímto štítkem. Sloupec se odhalí pouze tehdy, když uživatelské oddělení odpovídá hodnotě dept_tag tabulky:
CREATE FUNCTION prod.sales.mask_ssn(s STRING) RETURNS STRING RETURN '***-**-****';
CREATE OR REPLACE POLICY mask_unless_dept_matches
ON SCHEMA prod.sales
COLUMN MASK prod.sales.mask_ssn
TO `account users`
FOR TABLES
WHEN NOT has_identity_attribute_tag_match('department', 'dept_tag')
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn_col
ON COLUMN ssn_col;
Klíče atributů i hodnoty rozlišují velikost písmen a hodnoty se porovnávají přesně: Finance a finance se neshodují.
Omezit přístup externím agentům jednajícím jménem uživatele
Important
Kontextové atributy v ABAC politikách jsou v beta verzi. Pro jejich použití musí správce účtu povolit náhled kontextových atributů UC ABAC na stránce Preview konzole účtu. Viz Správa náhledů na úrovni účtu.
Kontextové atributy lze použít k omezení přístupu k datům u požadavků podané jménem uživatele prostřednictvím aplikace OAuth. Pokud jsou agenti připojeni přes OAuth, toto nastavení může být použito k tomu, aby jim zabránilo v přístupu k datům, když jednají jménem uživatele, i když uživatel může data při přímém dotazování v pracovním prostoru stále číst.
Jakýkoli přístup autentizovaný OAuth přes Azure Databricks CLI, SDK nebo SQL Statement Execution API je nastaven request.is_on_behalf_of na 'true', i když uživatel dotazuje ručně. Přístup ověřený osobním přístupovým tokenem (PAT) nikoli. Přístup ke Genie nelze zachytit pomocí tohoto mechanismu, protože nenastavuje request.is_on_behalf_of na 'true'.
Tyto vzory využívají funkce atributů kontextu. Pro dostupné atributy a chování viz Context attribute functions (Beta).
Nastavte agenta, aby posílal kontextové atributy
Pro použití kontextových atributů připojte agenta k Azure Databricks pomocí vlastní aplikace OAuth:
- Správce účtu aktivuje náhled kontextových atributů UC ABAC z konzole účtu. Viz Manage Azure Databricks preview.
- Správce účtu zaregistruje vlastní aplikaci OAuth v konzoli účtu a zaznamená její klientské ID. Viz Povolení nebo zakázání partnerských aplikací OAuth.
- Připojte agenta k MCP spravovanému Azure Databricks přes tuto OAuth aplikaci. Viz Připojení klientů pomocí ověřování OAuth.
Agent, který používá vestavěného databricks-cli klienta, se stále autentizuje přes OAuth, takže request.is_on_behalf_of čte .'true' Nicméně nelze rozlišit jeho požadavky od manuálního použití CLI, protože oba sdílejí databricks-cli ID klienta. Pro správu konkrétní aplikace zaregistrujte vlastní OAuth aplikaci a propojte agenta přes ni.
Informace o konceptech OAuth najdete v článku Autorizace přístupu uživatelů k Azure Databricks pomocí OAuth.
Warning
Ujistěte se, že agent nemůže získat data cestou, kterou vaše pojistka nepokrývá:
- Pokud omezíte přístup na základě
request.is_on_behalf_of, ujistěte se, že agent nemůže ověřit pomocí PAT. PAT nenastavujerequest.is_on_behalf_ofna'true', takže podmínka na tomto atributu jej neomezuje. - Pokud omezíte přístup na základě
request.client_id, ujistěte se, že se agent nemohl připojit prostřednictvím klienta, na kterého se vaše podmínka nevztahuje, například generického klientadatabricks-cli.
Maskovat sloupec pro požadavky typu on-behalf-of
Maskujte ssn pro požadavky běžící jménem uživatele, například agenta působícího prostřednictvím registrované aplikace OAuth, přičemž pro přímé dotazy zůstává nemaskovaná:
CREATE FUNCTION hr_catalog.people.mask_ssn(s STRING) RETURNS STRING RETURN '***-**-****';
CREATE OR REPLACE POLICY mask_ssn_for_agents
ON SCHEMA hr_catalog.people
COLUMN MASK hr_catalog.people.mask_ssn
TO `account users`
FOR TABLES
WHEN has_context_attribute_value('request.is_on_behalf_of', 'true')
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn_col
ON COLUMN ssn_col;
V tomto příkladu přímý dotaz vrací skutečné hodnoty a požadavek provedený jménem jiného uživatele vidí maskované hodnoty. Pomocí CLI a SQL Statement Execution API request.is_on_behalf_of čte také 'true', takže tato politika maskuje sloupec i pro tyto požadavky. Chcete-li místo toho cílit na konkrétní aplikaci, porovnejte request.client_id s ID klienta dané aplikace.
Omezte sloupec pouze na schválenou aplikaci
Maskujte ssn pro každý externí požadavek kromě těch z vaší schválené aplikace, identifikované podle OAuth client ID:
CREATE OR REPLACE POLICY mask_ssn_unapproved_apps
ON SCHEMA hr_catalog.people
COLUMN MASK hr_catalog.people.mask_ssn
TO `account users`
FOR TABLES
WHEN NOT has_context_attribute_value('request.client_id', '<your-app-client-id>')
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn_col
ON COLUMN ssn_col;
Chcete-li zjistit, která aplikace požádala o něco, zkontrolujte identity_metadata.acting_resource pole v auditních záznamech.
Filtrování řádků s predikáty, které se týkají pouze sloupců
Filtrovat řádky pomocí jednoduché logické logiky, která odkazuje pouze na sloupce tabulky. Predikáty pouze pro sloupce umožňují prosazení predikátu, což umožňuje modulu přeskočit irelevantní data během skenování (viz Vysvětlení prosazení predikátu na chráněných tabulkách).
CREATE FUNCTION filter_by_region(region STRING, allowed STRING)
RETURNS BOOLEAN
DETERMINISTIC
RETURN array_contains(split(allowed, ','), lower(region));
Použijte se zásadou, která předává povolené oblasti jako konstantu:
CREATE POLICY regional_access
ON CATALOG analytics
ROW FILTER filter_by_region
TO 'emea_team'
FOR TABLES
MATCH COLUMNS has_tag('region') AS rgn
USING COLUMNS (rgn, 'emea,apac');
Filtrování řádků napříč několika souvisejícími sloupci
Pokud tabulka obsahuje více sloupců představujících související atributy (například ship_to_country a bill_to_country), můžete je spárovat se samostatnými podmínkami značek a předat obě do jedné uživatelem definované funkce. Tím se zabrání vytváření samostatných zásad pro každý sloupec. Zásada může v rámci klauzule obsahovat až tři výrazy MATCH COLUMNS sloupců (viz kvóty zásad).
CREATE FUNCTION filter_by_countries(ship_country STRING, bill_country STRING, allowed STRING)
RETURNS BOOLEAN
DETERMINISTIC
RETURN array_contains(split(allowed, ','), lower(ship_country))
OR array_contains(split(allowed, ','), lower(bill_country));
CREATE POLICY regional_orders
ON SCHEMA prod.orders
ROW FILTER filter_by_countries
TO analysts
FOR TABLES
WHEN has_tag_value('sensitivity', 'high')
MATCH COLUMNS
has_tag('ship_country') AS ship,
has_tag('bill_country') AS bill
USING COLUMNS (ship, bill, 'us,ca,mx');
Analytik vidí pouze ty objednávky, kde je buď země expedice, nebo fakturace na seznamu povolených.
Vyhledávací tabulky v UDF zásad ABAC
Pokud se pravidla přístupu liší podle uživatele a nelze je vyjádřit prostřednictvím samotných klauzulí zásad TO/EXCEPT , můžete zkontrolovat přístupová práva vůči malé vyhledávací tabulce. Pokud je to možné, používejte TO/EXCEPT, protože je to upřednostňovaný přístup pro cílení na hlavní subjekty (viz Přístup pro cílení na hlavní subjekty). Udržujte vyhledávací tabulku malou, aby optimalizátor převedl poddotaz na broadcast join (viz Zachování malých vyhledávacích tabulek).
CREATE TABLE access_rules (
principal VARCHAR(255),
priority VARCHAR(64)
);
INSERT INTO access_rules VALUES
('alice@company.com', '1-URGENT'),
('alice@company.com', '2-HIGH'),
('bob@company.com', '1-URGENT');
CREATE FUNCTION priority_allowed(o_priority STRING) RETURNS BOOLEAN
RETURN EXISTS (
SELECT 1 FROM access_rules
WHERE principal = session_user() AND priority = o_priority
);
CREATE POLICY priority_filter
ON CATALOG operations
ROW FILTER priority_allowed
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag('priority') AS pri
USING COLUMNS (pri);