Didacticiel : Configurer ABAC avec SQL
Ce tutoriel vous montre comment configurer les politiques ABAC de filtrage de lignes et de masquage de colonnes dans Unity Catalog à l'aide de SQL. Pour la version basée sur l'interface utilisateur de Catalog Explorer, voir Tutoriel : configurer ABAC.
Dans cet exemple, une équipe d’analytique ne peut pas accéder aux dossiers des clients de l’UE, et les numéros de sécurité sociale sont toujours masqués. Les clients qui ont consenti au Data Sharing voient leur adresse e-mail complète affichée. Les autres ne voient qu’une version masquée.
Ce tutoriel comprend les étapes suivantes :
- Créer des tags gouvernés
- Créez un catalogue, un schéma et une table Unity Catalog
- Appliquer des tags gouvernés aux colonnes
- Créer un UDF pour détecter les adresses de l'UE
- Créer une politique de filtre de lignes
- Tester le filtre de ligne
- Créer une UDF pour masquer les numéros de sécurité sociale.
- Créer une politique de masquage de colonne
- Tester le masque de colonne
Après avoir terminé ces étapes, vous pouvez éventuellement étendre le tutoriel avec un masquage conditionnel des e-mails (étapes 10 à 12).
Prérequis
- Databricks Runtime 16.4 ou version supérieure, ou compute serverless.
- Autorisations d'administrateur de compte ou d'administrateur de Workspace (pour créer des tags gouvernés).
MANAGEautorisation sur le catalogue ou le schéma cible.EXECUTEsur les UDF.
Les compute exécutant des environnements d’exécution plus anciens ne peuvent pas accéder aux tables sécurisées par ABAC.
Étape 1 : Créer des balises gouvernées.
Les tags gouvernés sont des paires clé-valeur définies au niveau du compte. Les politiques ABAC les utilisent pour découvrir quelles colonnes filtrer ou masquer. Dans ce didacticiel, vous créez deux tags gouvernés :
- Une balise
piiavec trois valeurs autorisées :ssn,addressetemail - Une balise clé seule
consent(aucune valeur autorisée) pour identifier les colonnes de consentement.
Pour créer un tag gouverné, vous devez disposer de l'autorisation CREATE de tag gouverné au niveau du compte. Les administrateurs de compte et de Workspace disposent de CREATE par default.
- Dans votre workspace Databricks, cliquez sur
Catalogue .
- Cliquez sur le
bouton **Gouverner**.
- Dans le menu déroulant, cliquez sur Balises régies .
- Cliquez sur **Créer un tag gouverné**.
- Pour la clé de tag, entrez
pii. - Saisissez une description pour le tag gouverné.
- Pour les valeurs autorisées, veuillez saisir :
ssn,addressetemail. Seules ces valeurs peuvent être attribuées à cette clé de balise. - Cliquez sur Créer .
- Répétez les étapes 4 à 8 pour créer un deuxième tag gouverné avec la clé
consent. Laissez les valeurs autorisées vides (balise à clé uniquement).
Les données des tags sont stockées en texte brut et peuvent être répliquées à l’échelle mondiale. N’utilisez pas de noms de tags, de valeurs ou de descripteurs qui pourraient compromettre la sécurité de vos ressources. Par exemple, n’utilisez pas de noms de tags, de valeurs ou de descripteurs contenant des informations personnelles ou sensibles.
Étape 2 : Créez la table des clients.
Créez un catalogue, un schéma et une table avec les profils clients. La colonne has_consent est utilisée ultérieurement pour le masquage conditionnel des e-mails. Les clients qui ont donné leur consentement (TRUE) voient leur adresse e-mail complète affichée.
Exécutez les commandes suivantes dans un Notebook attaché à un compute sur Databricks Runtime 16,4 ou version supérieure :
-- 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);
Étape 3 : Ajouter des tags gouvernés aux colonnes
Balisez les colonnes ssn_number, home_address et email avec le tag gouverné pii. Les politiques ABAC correspondent aux colonnes par balise, et non par nom.
La colonne has_consent est marquée avec le tag gouverné consent. Ceci est requis pour la politique de masquage tenant compte du consentement à l'étape 11, qui transmet has_consent à l'UDF via 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' = '');
Étape 4 : Créez une UDF pour détecter les adresses de l'UE
Cette UDF reçoit la valeur de chaque colonne taguée pii = address et renvoie :
FALSESi l'adresse contientEU,E.U.ouEurope— la ligne est masquée.TRUESinon — la ligne est affichée.
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
);
Il s’agit d’une vérification simplifiée à des fins de démonstration. En production, utilisez une méthode plus robuste, telle qu'une colonne de code de pays ou une table de recherche, pour déterminer la région.
Étape 5 : Créez une politique de filtre de lignes
Pour créer une stratégie, vous devez disposer de MANAGE sur l'objet ou de la propriété de l'objet. Pour ajouter une UDF à une stratégie, vous devez disposer de EXECUTE sur l'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);
Vous pouvez également créer des politiques par le biais de l'interface utilisateur de Catalog Explorer. Voir Créer et gérer des politiques de filtre de lignes et de masquage de colonne pour plus de détails.
Étape 6 : Tester le filtre de ligne
Exécutez la query suivante pour vérifier que la politique de filtre de lignes fonctionne.
SELECT * FROM abac_tutorial.customers.profiles;
Seules les 10 lignes de résidents non-UE sont renvoyées. Les cinq clients de l'UE (Liam, Sophie, Hans, Elena et Johan) sont cachés.
Étape 7 : Créer un UDF pour masquer les numéros de sécurité sociale
Cette UDF renvoie un espace réservé entièrement masqué pour toute valeur de SSN qui lui est transmise.
CREATE OR REPLACE FUNCTION redact_ssn(ssn STRING)
RETURNS STRING
RETURN '***-**-****';
Étape 8 : Créer une politique de masquage de colonne
Créer une politique qui cible toutes les colonnes étiquetées pii = ssn et applique la fonction redact_ssn à chacune.
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;
Étape 9 : Tester le masque de colonne
Exécutez la query suivante pour vérifier que le filtre de ligne et le masque de colonne sont actifs.
SELECT * FROM abac_tutorial.customers.profiles;
Les SSN sont maintenant renvoyés en tant que ***-**-****. Seuls les résidents non-UE sont renvoyés car le filtre de ligne est également actif.
Étendre : Masquage conditionnel d'e-mail
Les étapes suivantes prolongent le tutoriel avec le masquage des e-mails tenant compte du consentement. Les clients qui ont choisi de participer (has_consent = TRUE) voient leur e-mail complet affiché ; les autres ne voient que le premier caractère et le domaine.
Étape 10 : Créer un UDF de masquage d'e-mail respectant le consentement
Cette UDF prend deux arguments :
email: la valeur réelle de l'e-mail de la colonne correspondanteconsent: la valeur de la colonnehas_consentsur la même ligne
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;
Étape 11 : Créer la politique de masquage conditionnel d'e-mail
Cette politique cible les colonnes étiquetées pii = email et transmet la colonne has_consent à la UDF.
La colonne has_consent a été étiquetée avec le tag gouverné consent à l’ étape 3. Ceci est requis, car USING COLUMNS ne peut référencer que les colonnes qui sont mises en correspondance via MATCH COLUMNS. Même si has_consent n'est pas masqué, il doit être tagué afin que la politique puisse transmettre sa valeur à l'UDF.
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);
Étape 12 : Tester le masquage conditionnel des e-mails
Exécutez la query suivante pour vérifier que les trois politiques fonctionnent ensemble.
SELECT * FROM abac_tutorial.customers.profiles;
Les clients avec has_consent = TRUE voient leur e-mail complet affiché. Les clients avec has_consent = FALSE voient une version masquée. Les SSN restent entièrement masqués et seuls les clients non-UE sont renvoyés.
prénom | a_consenti | ssn_number | |
|---|---|---|---|
John | VRAI | ***-**-**** | |
Jane | false | ***-**-**** | |
Alice | VRAI | ***-**-**** | |
Bob | false | ***-**-**** | |
Charlie | VRAI | ***-**-**** | |
Emily | false | ***-**-**** | |
Frank | VRAI | ***-**-**** | |
Grace | VRAI | ***-**-**** | |
Hank | false | ***-**-**** | |
Ivy | VRAI | ***-**-**** |
Résumé
Ce tutoriel a démontré trois modèles ABAC :
- Filtrage des lignes : masquer les lignes en fonction des valeurs de colonne correspondant aux tags régis
- Masquage de colonne : masquer les colonnes correspondant aux balises régies
- Masquage conditionnel : masquez une colonne en fonction de la valeur d’une autre colonne sur la même ligne, en balisant la colonne de contexte et en la transmettant à la UDF via
USING COLUMNS
Nettoyer
Pour supprimer tous les objets créés dans ce tutoriel, exécutez les éléments suivants. Si vous avez ignoré les étapes de masquage conditionnel des e-mails, les instructions DROP POLICY mask_email_by_consent_policy et DROP FUNCTION mask_email_by_consent échouent, ce qui est normal.
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;
Pour supprimer les tags gouvernés pii et consent, utilisez l'interface utilisateur de Catalog Explorer.