Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Op deze pagina worden algemene patronen beschreven voor het implementeren van ABAC-rijfilter- en kolommaskerbeleid.
- Zie Basisconcepten voor op kenmerken gebaseerd toegangsbeheer (ABAC) voor algemene concepten.
- Zie Beleid voor het maken en beheren van rijfilters en kolommaskers voor beleidssyntaxis.
- Voor GRANT beleidsregels, zie ABAC-beleidGRANT.
- Als uw omgeving gebruikmaakt van RBAC, raadpleegt u RBAC gebruiken met ABAC voor de werking van identiteitsfuncties wanneer gebruikers een rol aannemen en patronen die RBAC combineren met ABAC.
Cast-compatibele maskeringsfuncties
Azure Databricks cast automatisch de uitvoer van de maskeringsfunctie om overeen te komen met het datatype van de doelkolom. Zie Automatische typecasting voor kolommaskers.
De volgende patronen helpen u bij het ontwerpen van cast-compatibele maskeringsfuncties.
Een castable type retourneren
Wanneer u een kolom maskert, retourneert u hetzelfde gegevenstype of een type dat naar deze kolom kan worden gecastreerd. Controleer de gegevenstypen van de kolommen die uw beleidsdoelen hebben en controleer of elke vertakking van de functie een compatibele waarde retourneert.
-- 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;
Numerieke overloop voorkomen
Wanneer een maskerfunctie een breder numeriek type accepteert en retourneert dan de doelkolom, wordt het resultaat automatisch teruggezet naar het type kolom. Als de geretourneerde waarde het bereik van het smallere type overschrijdt, resulteert de cast in een overflow en faalt de query tijdens runtime.
-- 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;
VARIANT gebruiken voor meerdere kolomtypen
Zie Maskeren van meerdere kolomtypen met één functie.
Testcast-compatibiliteit
Test maskeringsfuncties met verschillende gegevenspatronen.
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;
Meerdere kolomtypen maskeren met één functie
Een enkele maskerende UDF die een VARIANT accepteert en teruggeeft, kan kolommen van veel datatypen maskeren, wat het aantal UDF's en beleidsregels dat je onderhoudt vermindert. Azure Databricks zet de kolomwaarde naar VARIANT vóór de functie uitvoert, en zet vervolgens de returnwaarde terug naar het type van de kolom volgens de ANSI SQL-regels.
Gebruik binnen de functie schema_of_variant() om de waarde te inspecteren en afhankelijk van het type ervan te vertakken. In elke branch geef je een waarde terug die kan worden gecast naar het type van de doelkolom.
Masker meerdere numerieke typen
Het meest eenvoudige VARIANT masker retourneert één constante die Azure Databricks omzet naar het type van elke kolom. Eén beleidsregel die deze functie gebruikt, kan kolommen met DOUBLE, DECIMAL en INT maskeren, zonder een aparte functie voor elke precisie:
CREATE FUNCTION mask_numeric(val VARIANT)
RETURNS VARIANT
DETERMINISTIC
RETURN 0::VARIANT;
Om de gemaskeerde waarde per type te variëren, vertak je op schema_of_variant() en geef een geschikte waarde terug voor elk:
CREATE FUNCTION flexible_mask(data VARIANT)
RETURNS VARIANT
RETURN CASE
WHEN schema_of_variant(data) = 'BIGINT' 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;
Typen gehele getallen worden in een VARIANT uitgebreid tot BIGINT, dus test op BIGINT in plaats van op INT of TINYINT.
Masker STRUCT-, ARRAY- en MAP-kolommen
De VARIANT benadering maskeert ook complexe kolommen, waarbij het numerieke voorbeeld hierboven wordt uitgebreid naar geneste data. Een STRUCT, , of MAP kolom bereikt de functie als een VARIANT, en Azure Databricks zet wat de functie teruggeeft terug naar het gedeclareerde type ARRAYvan de kolom. De geretourneerde waarde moet hetzelfde schema hebben als de input, anders mislukt de cast en geeft de query een fout.
Opmerking
STRUCT kolommen worden ondersteund op Databricks Runtime 18.1 en hoger.
ARRAY en MAP kolommen worden ondersteund op Databricks Runtime 19 en hoger. Deze casting werkt alleen binnen ABAC-kolommaskers en rijfilterbeleid, niet in algemene SQL- of tabelmaskers.
De volgende voorbeeldfunctie maskeert specifieke STRUCT, ARRAY, en MAP types. Voeg een WHEN tak toe voor elk schema dat je moet maskeren:
CREATE OR REPLACE FUNCTION generic_mask(val VARIANT)
RETURNS VARIANT
RETURN CASE
-- STRUCT<id: INT, ssn: STRING>: keep id, redact ssn
WHEN schema_of_variant(val) = 'OBJECT<id: BIGINT, ssn: STRING>' THEN
to_variant_object(named_struct('id', val:id, 'ssn', 'xxx-xx-xxxx'))
-- ARRAY<STRING>: return a single redacted element
WHEN schema_of_variant(val) = 'ARRAY<STRING>' THEN
to_variant_object(array('redacted'))
-- MAP<STRING, STRING>: redact every value
WHEN schema_of_variant(val) = 'OBJECT<key1: STRING, key2: STRING>' THEN
to_variant_object(map('key1', 'redacted', 'key2', 'redacted'))
ELSE NULL::VARIANT
END;
Elke WHEN tak doet twee dingen, beschreven in de volgende secties:
-
Identificeer het VARIANT-schema. Elk
VARIANTschema heeft zijn eigen maskeringslogica nodig, dus de functie vertakt zich op de schemastring dieschema_of_variant(val)terugkeert om de juiste redactie op elk schema toe te passen. -
Bouw de gemaskerde waarde opnieuw op. Bouw een gecensureerde waarde van het type van de kolom en wikkel deze in
to_variant_object()om eenVARIANTterug te geven.
Een waarde waarvan het schema overeenkomt met geen enkele tak, valt door naar ELSE.
Identificeer het VARIANT-schema
Toets aan het VARIANT-schema van de waarde, niet aan het opgegeven type van de kolom: converteren naar VARIANT normaliseert de gegevens, waardoor het schema kan afwijken van de kolomdefinitie. De volgende voorbeelden tonen veelvoorkomende gevallen:
| Kolomtype |
schema_of_variant() resultaat |
Aantekeningen |
|---|---|---|
ARRAY<STRING> |
ARRAY<STRING> |
|
ARRAY<INT> |
ARRAY<BIGINT> |
Gehele getaltypen verbreden zich tot BIGINT. |
STRUCT<id: INT, name: STRING> |
OBJECT<id: BIGINT, name: STRING> |
STRUCT- en MAP-kolommen worden beide OBJECT. |
STRUCT<name: STRING, id: INT> |
OBJECT<id: BIGINT, name: STRING> |
Velden zijn alfabetisch gesorteerd op sleutel, niet op declaratievolgorde. |
ARRAY<STRUCT<id: INT, name: STRING>> |
ARRAY<OBJECT<id: BIGINT, name: STRING>> |
|
MAP<STRING, STRING> vasthouden {a: 'x'} |
OBJECT<a: STRING> |
Varieert per rij: de sleutels van elke rij bepalen het schema. |
MAP<STRING, STRING> vasthouden {a: 'x', b: 'y'} |
OBJECT<a: STRING, b: STRING> |
Een andere rij van dezelfde kolom levert een ander schema op. |
MAP<STRING, STRING> vasthouden {a: null} |
OBJECT<a: VOID> |
Een nulwaarde wordt VOID. |
MAP<STRING, STRUCT<id: INT, name: STRING>> vasthouden {a: ...} |
OBJECT<a: OBJECT<id: BIGINT, name: STRING>, ...> |
Herbouw de gemaskeerde waarde
Voor elk schema dat je matcht, bouw je een geredigeerde waarde met dezelfde structuur, en wikkel je deze vervolgens in to_variant_object():
- Gebruik
named_struct()om eenSTRUCTte herbouwen, waarbij je de velden behoudt die je wilt en de rest vervangt. - Gebruik
array()om eenARRAYopnieuw op te bouwen. - Gebruik
map()om eenMAPte herbouwen met geredigeerde waarden.
Azure Databricks zet de teruggestuurde VARIANT terug naar het gedeclareerde type van de kolom, dus elke herbouwde waarde moet naar dat type gecastet kunnen worden.
Test een VARIANT-masker
Voordat je een functie aan een beleid koppelt, kun je deze testen in een gewone query om de gemaskeerde output te bevestigen. De volgende functie maskeert een ARRAY<STRUCT<id: BIGINT, value: FLOAT>> kolom en veroorzaakt een fout voor elk ander schema:
CREATE OR REPLACE FUNCTION mask_points(v VARIANT)
RETURNS VARIANT
RETURN CASE
WHEN schema_of_variant(v) = 'ARRAY<OBJECT<id: BIGINT, value: FLOAT>>' THEN
to_variant_object(array(named_struct('id', 1, 'value', 2.1)))
ELSE raise_error('Unexpected VARIANT schema: ' || schema_of_variant(v))
END;
Converteer de kolom met to_variant_object(), pas de maskingfunctie toe en gebruik variant_get() om de masked VARIANT terug te zetten naar het type van de kolom. Dit weerspiegelt wat het beleid tijdens runtime doet:
SELECT variant_get(mask_points(to_variant_object(points)), '$', typeof(points)) AS masked
FROM my_catalog.my_schema.my_table;
Limitations
- Een complexe kolom die
CHAR,GEOGRAPHY,TIME,VARIANTofGEOMETRYbevat, kan niet worden gemaskeerd metVARCHAR. -
MAPsleutels moetenSTRINGzijn. Kolommen die alsMAP<INT, ...>,MAP<DATE, ...>, enz. zijn getypt, worden niet omgezet.
Toegang voorkomen totdat gevoelige kolommen zijn gelabeld
Een gemeenschappelijk governancepatroon is om de toegang te beheren op basis van of gegevens zijn geclassificeerd. U kunt dit implementeren met een standaardbeperkende tag en beleidsregels die verschillende beveiligingsniveaus afdwingen, afhankelijk van de classificatiestatus.
- Pas een tag zoals
classification : unverifiedalle nieuwe objecten standaard toe via automatisering of via tagovername door de tag toe te passen op catalogus- of schemaniveau, zodat nieuwe tabellen die aan de catalogus of het schema worden toegevoegd, automatisch de tag overnemen. - Maak een rijfilterbeleid waarmee de toegang tot tabellen met tags wordt geblokkeerd
classification : unverified. - Maak een kolommaskerbeleid waarmee gevoelige kolommen worden gemaskeerd in tabellen waarin de
classification : unverifiedtag niet meer aanwezig is. - Wanneer een gegevenssteward de classificatie voltooit, wordt de tag bijgewerkt. Het blokkerende beleid komt niet meer overeen en het maskeringsbeleid wordt van kracht.
-- 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');
Als u gevoelige gegevens wilt beveiligen nadat deze zijn geclassificeerd, definieert u een kolommaskerbeleid dat van kracht wordt wanneer de classification : unverified tag niet meer aanwezig is:
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;
Gedeeltelijke onthulling zonder regex
Geef een deel van een gevoelige waarde weer met behulp van tekenreeksbewerkingen in plaats van regex. Maskering op basis van Regex scant de volledige waarde voor elke rij, wat duur is voor grote tekstvelden (zie Regex-maskering voorkomen voor grote tekstvelden).
CREATE FUNCTION mask_ssn(ssn STRING, show_last INT) RETURNS STRING
DETERMINISTIC
RETURN CONCAT('***-**-', RIGHT(ssn, show_last));
Consistente hashing (deterministische pseudonimisatie)
Consistente hashing (ook wel deterministische gepseudonimisatie genoemd) vervangt gevoelige gegevens door een hash-waarde die hetzelfde is voor meerdere tabellen. Als u een functie markeert zoals DETERMINISTIC aan de engine wordt aangegeven dat de functie altijd hetzelfde resultaat retourneert voor dezelfde invoer, zodat de query kan worden geoptimaliseerd. Zie Deterministische, foutveilige expressies gebruiken.
De volgende functie hashes consistent een tekenreekswaarde en gebruikt een version parameter ter ondersteuning van sleutelrotatie. Verhoog het version nummer via de clausule van het USING COLUMNS beleid om nieuwe hashes te genereren zonder historische gegevens te verbreken die de vorige versie hebben gebruikt. De functie voegt de oorspronkelijke waarde samen met het versienummer voordat de hash wordt gehasht, zodat dezelfde invoer met dezelfde versie altijd dezelfde hash produceert.
CREATE FUNCTION pseudonymize(val STRING, version INT) RETURNS STRING
DETERMINISTIC
RETURN SHA2(CONCAT(val, CAST(version AS STRING)), 256);
Masker een kolom op basis van attributen van de zoekende gebruiker
Important
Identiteitsattributen in ABAC-beleidsregels zijn in bèta. Om ze te gebruiken, moet een accountbeheerder:
- Schakel de preview Identiteitskenmerken in ABAC-beleid in op de pagina Previews van de accountconsole. Zie Previews op accountniveau beheren.
- Configureer de inrichting van identiteitsattributen voor het account. Zie Identiteitsattributen.
Een kolommaskerbeleid kan de identiteitsattributen van de zoekende gebruiker gebruiken om gevoelige gegevens te maskeren zonder dat speciale groepen nodig zijn. Zo kan het bijvoorbeeld gegevens ongemaskeerd houden voor gebruikers met department = HR en deze voor alle anderen maskeren.
Deze patronen vereisen identiteitsattributen die aan je gebruikers worden verstrekt door je identiteitsprovider, en de functies gedragen zich anders dan tag-only voorwaarden op manieren die beïnvloeden hoe je het beleid schrijft. Voordat je ze gebruikt, bekijk de functies van identiteitsattributen en identiteitsattributen.
Important
De functies evalueren naar false wanneer de gebruiker geen waarde voor het attribuut heeft of wanneer de attribuutsleutel niet bestaat. Schrijf de voorwaarde zo dat dit false resultaat de toegang beperkt in plaats van deze toestaat. Negeer de match met NOT zodat het masker van toepassing is, tenzij het attribuut overeenkomt. Bijvoorbeeld, WHEN NOT has_identity_attribute_value('department', 'HR') maskeert de kolom voor iedereen behalve gebruikers wiens afdeling is HR, en omdat een ontbrekende waarde ook falseis , worden gebruikers zonder afdelingsattributen ook gemaskeerd. Vermijd het omgekeerde: een voorwaarde die alleen maskeert als de attribuutwaarde overeenkomt, zorgt ervoor dat gebruikers die geen waarde voor dat attribuut hebben, ongemaskeerd blijven.
Voor evaluatiegedrag, zie Identiteitsattribuutvoorwaarden. Voor beperkingen, zie Identiteitsattributen in beleidsvoorwaarden.
Match een vaste waarde
Verbergen ssn voor iedereen van wie de afdeling niet HR is:
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;
In dit voorbeeld ziet een gebruiker wiens afdeling is HR echte waarden. Een gebruiker in een andere afdeling, en een gebruiker zonder afdelingsattributen, zien allebei het masker.
Wedstrijd tegen een gereguleerde tag
Het vorige voorbeeld noemt een specifieke attribuutwaarde (HR) in het beleid, dus het dekken van meerdere afdelingen zou betekenen dat er voor elk een apart beleid wordt geschreven. Om alle afdelingen met één beleid te dekken, tag je elke tabel met de afdeling die ervan bezit en vergelijk je vervolgens het department attribuut van de zoekende gebruiker met die tag. De kolom wordt alleen onthuld wanneer de afdeling van de gebruiker overeenkomt met de dept_tag waarde van de tabel:
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;
Attribuutsleutels en -waarden zijn beide hoofdlettergevoelig, en waarden worden exact vergeleken: Finance en finance komen niet overeen.
Beperk de toegang voor externe agenten die namens een gebruiker handelen
Important
Contextattributen in ABAC-beleidsregels zijn in bèta. Om ze te gebruiken, moet een accountbeheerder de UC ABAC Context Attributen-preview inschakelen vanaf de pagina Voorlezen in de accountconsole. Zie Previews op accountniveau beheren.
Contextattributen kunnen worden gebruikt om de toegang tot gegevens te beperken voor verzoeken die namens een gebruiker worden gedaan via een OAuth-applicatie (user-to-machine (U2M) autorisatie). Als agenten via OAuth zijn verbonden, kan deze opstelling worden gebruikt om te voorkomen dat ze data kunnen benaderen wanneer ze namens een gebruiker handelen, ook al kan de gebruiker de data nog steeds lezen wanneer ze deze direct in de werkruimte opvragen.
Elke door OAuth geauthenticeerde toegang via de Azure Databricks CLI, de SDK's of de SQL Statement Execution API zet request.is_on_behalf_of op 'true', zelfs wanneer een gebruiker handmatig een query indient. Toegang die geauthenticeerd is met een persoonlijke toegangstoken (PAT) doet dat niet. Toegang tot Genie kan niet via dit mechanisme worden verkregen.
Deze patronen gebruiken de contextattribuutfuncties. Voor beschikbare attributen en gedrag, zie Contextattribuutfuncties (Bèta).
Verbind de agent met Azure Databricks
Om contextattributen te gebruiken, verbind je de agent met een aangepaste OAuth-applicatie:
- Een accountbeheerder schakelt de UC ABAC Context Attributen-preview in vanuit de accountconsole. Zie Azure Databricks previews beheren.
- Een accountbeheerder registreert een aangepaste OAuth-applicatie in de accountconsole en noteert de client-ID.
- Verbind de agent met de door Azure Databricks beheerde MCP via die OAuth-applicatie. Zie Configureer een aangepaste OAuth-client.
Een agent die de ingebouwde databricks-cli client gebruikt, authenticeert nog steeds via OAuth, dus request.is_on_behalf_of leest 'true'. Je kunt echter geen onderscheid maken tussen de verzoeken en handmatig gebruik van de CLI, omdat beide de databricks-cli client-ID delen. Om een specifieke applicatie te beheren, registreer je een aangepaste OAuth-applicatie en verbind je de agent via deze applicatie.
Warning
Zorg ervoor dat een agent de gegevens niet kan bereiken via een pad dat uw polis niet dekt:
- Als je de toegang beperkt op basis van
request.is_on_behalf_of, zorg er dan voor dat de agent zich niet kan authenticeren met een PAT. Een PAT steltrequest.is_on_behalf_ofniet in op'true', dus een voorwaarde voor dat attribuut beperkt deze niet. - Als je de toegang beperkt op basis van
request.client_id, zorg er dan voor dat de agent niet via een client kan verbinden die jouw aandoening niet dekt, zoals de generiekedatabricks-cliclient.
Maskeer een kolom voor verzoeken namens een andere gebruiker
Masker ssn voor verzoeken die namens een gebruiker draaien, zoals een agent die handelt via een geregistreerde OAuth-applicatie, terwijl deze onbedekt blijft voor directe zoekopdrachten:
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;
In dit voorbeeld levert een directe query daadwerkelijke waarden op, en een on-behalf-of-aanvraag krijgt de gemaskeerde waarden te zien. Met behulp van de CLI en de SQL Statement Execution API leest request.is_on_behalf_of ook 'true', dus wordt de kolom door dit beleid ook voor die verzoeken gemaskeerd. Om in plaats daarvan een specifieke applicatie als doel te gebruiken, stemt u request.client_id af op de client-ID van die applicatie.
Beperk een kolom tot een goedgekeurde applicatie
Masker ssn voor elk extern verzoek behalve die van je goedgekeurde applicatie, geïdentificeerd door de 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;
Om te zien welke applicatie een verzoek heeft ingediend, inspecteer je het identity_metadata.acting_resource veld in de auditlogboeken.
Rijfiltering met alleen kolompredicaten
Filter rijen met behulp van eenvoudige Booleaanse logica die alleen verwijst naar tabelkolommen. Predicaten met alleen kolommen maken predicaatpushdown mogelijk, waardoor de engine irrelevante gegevens tijdens scans kan overslaan (zie Predicaatpushdown voor beveiligde tabellen begrijpen).
CREATE FUNCTION filter_by_region(region STRING, allowed STRING)
RETURNS BOOLEAN
DETERMINISTIC
RETURN array_contains(split(allowed, ','), lower(region));
Gebruik met een beleid dat de toegestane regio's doorgeeft als een constante:
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');
Rijfiltering in meerdere gerelateerde kolommen
Wanneer een tabel meerdere kolommen bevat die gerelateerde kenmerken vertegenwoordigen (bijvoorbeeld ship_to_country en bill_to_country), kunt u deze vergelijken met afzonderlijke tagvoorwaarden en beide doorgeven aan één UDF. Hiermee voorkomt u dat er afzonderlijke beleidsregels voor elke kolom worden gemaakt. Een rijfilterbeleid kan tot zes kolomuitdrukkingen bevatten, en een kolommaskerbeleid kan tot drie kolomuitdrukkingen in de MATCH COLUMNS clausule bevatten (zie Beleidquota).
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');
Een analist ziet alleen orders waarbij het land voor verzending of facturering in de lijst met toegestane orders staat.
Opzoektabellen in ABAC-beleids-UDF's
Wanneer toegangsregels per gebruiker verschillen en niet alleen kunnen worden uitgedrukt via de components van TO/EXCEPT het beleid, kunt u de toegangsrechten controleren op een kleine opzoektabel. Gebruik TO/EXCEPT indien mogelijk de voorkeursbenadering voor doelprinciplen (zie Benadering voor doelprinciplen). Houd de opzoektabel klein zodat de optimalisatie de subquery converteert naar een broadcast-hash-join (zie Opzoektabellen klein houden).
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);