Rafik BELLAHSENE, Data Architect
Limiter l’accès aux données aux utilisateurs externes à votre organisation dans le cadre d’un partage de données (Delta Sharing) Databricks to Databricks.
Cet article présente la mise en place de vues dynamiques accessibles à divers groupes d’utilisateurs, désignés sous le nom de récipients, dans le contexte du data sharing.
Afin de créer des vues au sein de Databricks, vous devez :
- Avoir la permission USE CATALOG sur votre catalog Databricks
- Avoir les permissions USE SCHEMA et CREATE TABLE sur le schéma parent
- Pouvoir lire les tables et les vues référencées dans la vue (GRANT SELECT)
Afin de créer des récipients au sein de Databricks, vous devez :
- Disposer du privilège CREATE_RECIPIENT pour le métastore où sont enregistrées les données que vous souhaitez partager
- Utiliser le runtime Databricks 11.3 LTS au minimum
Les vues dynamiques prennent en charge 3 types de sécurité :
- LA SECURITE AU NIVEAU DES LIGNES (RLS)
- LA SECURITE AU NIVEAU DES COLONNES (CLS)
- LE MASQUAGE DYNAMIQUE DES DONNEES (DDM)
Mais avant de pouvoir les mettre en place, voyons comment créer un récipient Databricks-To-Databricks.
Mise en place du récipient Databricks-To-Databricks
Ce type de récipient concerne les groupes d’utilisateurs ayant accès à un espace de travail Databricks avec Unity Catalog activé. L’accès aux données partagées se fait exclusivement via le métastore attaché à l’espace de travail concerné.
Création du récipient
Personnalisation du récipient
Une fois le récipient crée, vous trouverez toutes les informations qui lui sont associées depuis la section Catalog Explorer -> Shared By me -> Recipients.

Vous remarquerez que j’ai ajouté une propriété personnalisée « location » qui me servira de filtre pour mes différentes vues dynamiques. Vous pouvez créer autant de propriétés personnalisées que nécessaire.
Pour ajouter une propriété, cliquez sur « Edit Properties », puis «Add property ».

Création des vues dynamiques
Dans cette section, je vais créer des vues dynamiques à partir d’une table de dimension appelée « dim_vehicle » qui contient des informations sur des véhicules qui ont été verbalisés pour défaut de stationnement.
Ci-dessous, vous trouverez le schéma de la table ainsi qu’un exemple d’échantillon de données :


La sécurité au niveau des lignes (RLS)
L’accès aux données est limité aux utilisateurs du groupe « worldwide_admin_users ».
Seules les informations pour l’état de New York (NY) sont accessibles, c’est-à-dire Registration_State_Code = ‘NY’.
CREATE OR REPLACE VIEW VD_VEHICLE AS
(
SELECT Code, Plate_ID, Body_Type_Code,Type_Plate_Code,Registration_State_Code, Plate_Type_EN, Plate_Type_FR,State_EN, State_FR, Vehicle_Color
FROM `cat-rbe-dev`.sch_gold.dim_vehicle
WHERE
CASE
WHEN current_recipient('location') = 'ALL' THEN TRUE -- Si La propriété location du récipient est égale à ALL, le récipient a accès à l'ensemble des données
ELSE Registration_State_Code = current_recipient('location') -- Sinon la table est filtrée sur Registration_State_Code = La propriété location du récipient
END
)
Requêtage des données depuis l’espace de travail Databricks du récipient


On remarque que la table a bien été filtrée et que seules les lignes concernant NY sont disponibles.
La sécurité au niveau des colonnes (CLS)
Dans ce premier exemple, je vais masquer la colonne « Plate_ID » pour le récipient créé précédemment.
CREATE OR REPLACE VIEW VD_VEHICLE_CLS AS
(
SELECT Code,
CASE
WHEN current_recipient('location') = 'ALL' THEN Plate_ID -- Si la propriété location = ALL, on ne masque pas la colonne Plate_ID
ELSE 'REDACTED' -- Sinon la colonne Plate_ID est masquée
END AS Plate_ID,
Body_Type_Code,Type_Plate_Code,Registration_State_Code, Plate_Type_EN, Plate_Type_FR,State_EN, State_FR, Vehicle_Color
FROM `cat-rbe-dev`.sch_gold.dim_vehicle
WHERE
CASE
WHEN current_recipient('location') = 'ALL' THEN TRUE -- Si La propriété location du récipient est égale à ALL, le récipient a accès à l'ensemble des données
ELSE Registration_State_Code = current_recipient('location') -- Sinon la table est filtrée sur Registration_State_Code = La propriété location du récipient
END
)
Requêtage des données depuis l’espace de travail Databricks du récipient
Le masquage de la colonne Plate_ID est effectif pour les utilisateurs du recipient. On observe que cette colonne renvoie la valeur REDACTED pour chaque ligne.

Le masquage dynamique des colonnes (DDM)
Dans ce dernier exemple, je vais remplacer les deux premiers caractères de la plaque d’immatriculation par le masque ‘MASK-‘ pour les utilisateurs du récipient.
CREATE OR REPLACE VIEW VD_VEHICLE_DDM AS
(
SELECT Code,
CASE
WHEN current_recipient('location') = 'ALL' THEN Plate_ID -- Si la propriété location = ALL, on ne masque pas la colonne Plate_ID
ELSE regexp_replace(Plate_ID, '^.{2}','MASK-' ) -- Sinon les deux premiers caractères sont remplacés par 'MASK-'
END AS Plate_ID,
Body_Type_Code,Type_Plate_Code,Registration_State_Code, Plate_Type_EN, Plate_Type_FR,State_EN, State_FR, Vehicle_Color
FROM `cat-rbe-dev`.sch_gold.dim_vehicle
WHERE
CASE
WHEN current_recipient('location') = 'ALL' THEN TRUE -- Si La propriété location du récipient est égale à ALL, le récipient a accès à l'ensemble des données
ELSE Registration_State_Code = current_recipient('location') -- Sinon la table est filtrée sur Registration_State_Code = La propriété location du récipient
END
)
Requêtage des données depuis l’espace de travail Databricks du récipient
Le masquage des données est correctement appliqué à la colonne Plate ID, les deux premiers caractères étant remplacés par la chaine de caractères ‘MASK-‘.

En résumé, l’usage des vues dynamiques dans le cadre du partage de données entre plateformes Databricks offre une solution simple et efficace pour gérer la gouvernance des données et assurer la sécurité de leur accès.
En centralisant la gestion des autorisations et en garantissant une approche dynamique, cette méthode facilite la collaboration tout en préservant la confidentialité des informations.