Scroll Top

Step By Step : Data Sharing et RLS/CLS/DDM via des vues dynamiques Databricks

Rafik BELLAHSENE, Data Architect

Objectif

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.

Contexte

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.

Prérequis

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
Types de sécurité

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

Pour créer le récipient, référez-vous à notre article décrivant le principe de Data Sharing et son implémentation pratique via Databricks (lien) ou à la documentation officielle de Databricks. (lien)

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.

Figure 1 : Création d'un récipient

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 ».

Figure 2 : Personnalisation du récipient

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 :

Figure 3 : Schéma de données
Figure 4 : Echantillon 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 

Figure 5 : Application du RLS - Vue 1
Figure 6 : Application du RLS - Vue 2

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.

Figure 7 : Application du CLS

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-.

Figure 8 : Application du DDM
Conclusion

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.

Leave a comment

Privacy Preferences
When you visit our website, it may store information through your browser from specific services, usually in form of cookies. Here you can change your privacy preferences. Please note that blocking some types of cookies may impact your experience on our website and the services we offer.