Algemene patronen voor rij-filtering en kolom-maskering

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 ABAC-beleid maken en beheren voor de syntaxis van beleid.

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

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