Algemene patronen voor rij-filtering en kolom-maskering

Op deze pagina worden algemene patronen beschreven voor het implementeren van ABAC-rijfilter- en kolommaskerbeleid.

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 op VARIANT gebaseerde maskeringsfuncties voor meerdere kolomtypen.

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;

Maskeringsfuncties op basis van VARIANT voor meerdere kolomtypen

Wanneer u kolommen van verschillende gegevenstypen moet maskeren (bijvoorbeeld INT, DOUBLEDECIMAL(10,2), DECIMAL(15,5)enzovoort), kunt u één maskering-UDF schrijven die een VARIANT type accepteert en retourneert. Azure Databricks cast automatisch de functie-uitvoer van de kolommaskerfunctie zodat deze overeenkomt met het datatype van de doelkolom volgens de ANSI SQL-standaarden.

Deze aanpak vermindert het aantal benodigde UDF's en beleidsregels. In plaats van afzonderlijke maskeringsfuncties te schrijven voor elk kolomtype, verwerkt één functie alle typen.

Meerdere numerieke typen maskeren met één functie

In plaats van een afzonderlijke maskerfunctie te maken voor elke numerieke precisie, kunt VARIANT u ze allemaal met één functie verwerken:

CREATE FUNCTION mask_numeric(val VARIANT)
RETURNS VARIANT
DETERMINISTIC
RETURN 0::VARIANT;

Deze functie retourneert 0 als een VARIANT, die door Azure Databricks automatisch wordt omgezet naar het type van de doelkolom. Eén ABAC-beleid met deze functie kan maskeren INT, DOUBLEen DECIMAL kolommen zonder afzonderlijke functies voor elke precisie te vereisen.

Als u het type liever expliciet binnen de functie wilt behouden, kunt u vertakking maken op het type en een geschikte gemaskeerde waarde retourneren voor elk type met behulp van 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;

Struct-kolommen maskeren met VARIANT

Voor Databricks Runtime 18.1 en hoger kunt u ook structkolommen maskeren door ze binnen een ABAC-beleid naar VARIANT te casten. Vertakking op de vorm van de struct om selectief velden uit te filteren.

Opmerking

Structs naar VARIANT gieten voor maskering wordt alleen ondersteund binnen ABAC-kolommaskeringsbeleid.

In het volgende voorbeeld worden schema_of_variant() twee verschillende structuren geïdentificeerd en worden gevoelige velden in elk geredigeerd.

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;

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.

  1. Pas een tag zoals classification : unverified alle 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.
  2. Maak een rijfilterbeleid waarmee de toegang tot tabellen met tags wordt geblokkeerd classification : unverified.
  3. Maak een kolommaskerbeleid waarmee gevoelige kolommen worden gemaskeerd in tabellen waarin de classification : unverified tag niet meer aanwezig is.
  4. 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 de Identiteitsattributen inschakelen in de ABAC Policies preview vanaf de accountconsole Previews-pagina . Zie Previews op accountniveau beheren.

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 gegevenstoegang te beperken voor verzoeken die namens een gebruiker worden gedaan via een OAuth-applicatie. 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 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. Genie-toegang kan via dit mechanisme niet worden vastgelegd, omdat het request.is_on_behalf_of niet instelt op 'true'.

Deze patronen gebruiken de contextattribuutfuncties. Voor beschikbare attributen en gedrag, zie Contextattribuutfuncties (Bèta).

Stel een agent in om contextattributen te verzenden

Om contextattributen te gebruiken, verbind je de agent met Azure Databricks via een aangepaste OAuth-applicatie:

  1. Een accountbeheerder schakelt de UC ABAC Context Attributen-preview in vanuit de accountconsole. Zie Azure Databricks previews beheren.
  2. Een accountbeheerder registreert een aangepaste OAuth-applicatie in de accountconsole en noteert de client-ID. Zie OAuth-toepassingen van partners in- of uitschakelen.
  3. Verbind de agent met de door Azure Databricks beheerde MCP via die OAuth-applicatie. Zie Clients verbinden via OAuth-authenticatie.

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.

Voor OAuth-concepten, zie Authorize user access to Azure Databricks with OAuth.

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 stelt request.is_on_behalf_of niet 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 generieke databricks-cli client.

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 beleid kan maximaal drie kolomexpressies bevatten in de MATCH COLUMNS component (zie Beleidsquota).

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);