Accueil À propos Tech Stack Projets Blog Tracker
Retour au Blog

Sécurité End-to-End pour le Data Warehousing
dans Microsoft Fabric

Récap de la session de Shabnam Watson à la FabCon Atlanta 2026 — Les couches de sécurité essentielles pour protéger vos données dans Fabric.

Sommaire
  1. Introduction — Pourquoi la sécurité dans Fabric Warehouse
  2. Microsoft Entra ID — La fondation identitaire
  3. Network Security — Private Links, VNet et accès public
  4. Workspace Roles — Admin, Member, Contributor, Viewer
  5. Item-Level Permissions — Contrôle granulaire par objet
  6. SQL-Level Permissions — OLS, CLS, RLS avec exemples
  7. Dynamic Data Masking — Masquer les données sensibles
  8. Warnings & Gotchas — Les pièges à éviter
  9. Audit Logs — Tracer et surveiller les accès
  10. Best Practices — Les recommandations clés

01. Introduction — Pourquoi la sécurité dans Fabric Warehouse

À la FabCon + SQLCon Atlanta 2026 (16-20 mars), Shabnam Watson — Microsoft Data Platform MVP et Principal Consultant chez ABI Cube — a présenté une session dense et extrêmement pratique sur la sécurité end-to-end pour le Data Warehousing dans Microsoft Fabric. En tant que Data Engineer, c'etait l'une des sessions que j'attendais le plus.

La raison est simple : dans Fabric, le Warehouse est souvent le point d'accès principal aux données pour les analystes, les data scientists et les outils de reporting. C'est là où convergent les données sensibles. Et pourtant, beaucoup d'équipes déploient leurs Warehouses avec les paramètres par défaut, sans implémenter les couches de sécurité avancées disponibles.

La vision de Shabnam Watson

La sécurité dans Fabric n'est pas une couche unique — c'est un empilement de couches complémentaires. De l'identité (Entra ID) au réseau (Private Links), en passant par les permissions workspace, les permissions SQL (RLS, CLS, OLS) et le masquage dynamique. Chaque couche couvre un angle d'attaque different, et aucune ne suffit à elle seule.

Voici mon récap complet de cette session, avec tous les exemples de code et les recommandations pratiques que Shabnam a partagées.

02. Microsoft Entra ID — La fondation identitaire

Tout commence par l'identité. Dans Fabric, Microsoft Entra ID (anciennement Azure AD) est le socle de toute la chaîne de sécurité. Chaque utilisateur, chaque service principal, chaque application qui accède à Fabric doit être authentifié via Entra ID.

Single Sign-On et protocoles

Fabric s'appuie sur le SSO (Single Sign-On) via Entra ID. Les protocoles utilisés sont :

  • OAuth 2.0 — pour l'autorisation d'accès aux ressources Fabric
  • OpenID Connect — pour l'authentification des utilisateurs, construit au-dessus d'OAuth 2.0

Concrètement, quand un utilisateur se connecte au portail Fabric ou qu'un pipeline accède à un Warehouse via un Service Principal, un token OAuth est émis par Entra ID. Ce token contient les claims d'identité et les permissions associées.

Conditional Access Policies

Shabnam a insisté sur l'importance des Conditional Access Policies — des règles Entra ID qui permettent de conditionner l'accès à Fabric en fonction de critères comme :

  • L'emplacement réseau — bloquer l'accès depuis des IPs non approuvées
  • Le type d'appareil — exiger un appareil managé (Intune)
  • Le niveau de risque — bloquer les connexions à risque élevé détectées par Identity Protection
  • La MFA — imposer l'authentification multi-facteurs systématiquement
Mon conseil

Si vous n'avez pas encore de Conditional Access Policy sur votre tenant Fabric, c'est la première chose à configurer. Combinez au minimum la MFA obligatoire + une restriction géographique. C'est la base, et ça ne coûte rien à mettre en place.

03. Network Security — Private Links, VNet et accès public

La deuxième couche de sécurité concerne le réseau. Shabnam a décomposé la sécurité réseau en deux axes : Inbound (qui peut atteindre Fabric) et Outbound (où Fabric peut envoyer des données).

Sécurité Inbound : Private Links et Endpoints

Par défaut, Fabric est accèssible depuis Internet public. Pour verrouiller cet accès, deux mécanismes complémentaires existent :

Mécanisme Niveau Description
Private Links (tenant-level) Tenant Active les liens privés pour tout le tenant. Prérequis pour les Private Endpoints.
Private Endpoints Workspace Crée un point d'entrée privé dans votre VNet Azure pour accéder à un workspace spécifique.
Block Public Access Tenant Désactive complètement l'accès via Internet public. Seuls les Private Endpoints fonctionnent.

Sécurité Outbound : VNet Integration

Pour le trafic sortant (Fabric vers vos sources de données), la VNet integration permet à Fabric d'accéder à vos ressources Azure via un réseau privé, sans passer par Internet :

  • Managed VNet — Fabric gère le VNet automatiquement, vous configurez des Managed Private Endpoints vers vos ressources (SQL Server, Storage Account, etc.)
  • Trusted workspace accèss — autorise Fabric à accéder à des ressources Azure protégées par un firewall, sans Private Endpoint, en se basant sur l'identité du workspace
Attention — Configuration tenant-level requise

Les Private Links doivent être activés au niveau du tenant par un admin Fabric avant de pouvoir créer des Private Endpoints au niveau workspace. C'est une étape souvent oubliée qui bloque les équipes projet.

04. Workspace Roles — Admin, Member, Contributor, Viewer

Une fois l'identité et le réseau sécurisés, on passe aux permissions au niveau workspace. Fabric propose quatre roles de workspace, chacun avec des capacites spécifiques :

Role Créer / Modifier Supprimer Partager Gérer accès
Admin Oui Oui Oui Oui
Member Oui Oui Oui Non
Contributor Oui Oui (ses propres items) Non Non
Viewer Non Non Non Non
Principe du moindre privilège

Attribuez le role Viewer par défaut. Ne montez en privilège que lorsque c'est justifié. Le role Admin doit être réservé à 2-3 personnes maximum par workspace. C'est basique, mais beaucoup d'organisations mettent tout le monde en Member "pour simplifier".

Point important soulevé par Shabnam : les rôles workspace s'appliquent à tous les items du workspace. Si un utilisateur est Viewer sur le workspace, il voit tous les items (Warehouses, Lakehouses, notebooks, rapports...). Pour un contrôle plus fin, il faut passer aux permissions au niveau item.

05. Item-Level Permissions — Contrôle granulaire par objet

Les item-level permissions permettent de donner accès à un objet spécifique (un Warehouse, un Lakehouse, un rapport) sans donner accès à tout le workspace. C'est essentiel pour les scénarios multi-équipes.

Les quatre permissions item-level

Permission Description Cas d'usage
Connect Se connecter au Warehouse (SQL endpoint) Minimum requis pour toute connexion SQL
ReadData Lire les données via T-SQL Analystes qui exécutent des requêtes SELECT
ReadAll Lire les fichiers sous-jacents (Parquet/Delta) via OneLake Data Engineers qui accèdent aux fichiers bruts
Share Partager l'item avec d'autres utilisateurs Responsables d'equipe qui délèguent les accès

Partage avec des non-membres du workspace

Un point clé de la présentation : vous pouvez partager un Warehouse avec un utilisateur qui n'a aucun role dans le workspace. L'utilisateur recoit uniquement les permissions item-level que vous choisissez (Connect, ReadData, ReadAll). Il ne voit pas les autres items du workspace.

SQL Verifier les permissions via OPENROWSET
-- Acceder aux données via le SQL Endpoint avec les permissions ReadData
SELECT *
FROM OPENROWSET(
    'CosmosDB',
    'Account=myaccount;Database=mydb',
    Products
) AS query1;

-- Verifier les permissions effectives de l'utilisateur courant
SELECT * FROM sys.fn_my_permissions('dbo.FactSales', 'OBJECT');

06. SQL-Level Permissions — OLS, CLS, RLS avec exemples

C'est le cœur de la session. Shabnam a détaillé les trois mécanismes de sécurité au niveau SQL qui permettent un contrôle granulaire sur qui voit quoi dans le Warehouse.

Object Level Security (OLS)

L'OLS permet de contrôler l'accès aux objets SQL entiers (tables, vues, schemas) via les commandes classiques GRANT, DENY et REVOKE.

SQL Object Level Security — GRANT / DENY / REVOKE
-- Accorder le droit SELECT sur une table à un utilisateur
GRANT SELECT ON dbo.FactSales TO [analyst@contoso.com];

-- Refuser le droit SELECT sur une table sensible
DENY SELECT ON dbo.DimEmployee TO [junior_analyst@contoso.com];

-- Révoquer un droit précédemment accordé
REVOKE SELECT ON dbo.FactSales FROM [contractor@external.com];

-- Accorder SELECT sur tout un schéma
GRANT SELECT ON SCHEMA::reporting TO [reporting_team@contoso.com];

Column Level Security (CLS)

Le CLS va plus loin : il restreint l'accès à des colonnes spécifiques au sein d'une table. L'utilisateur peut voir la table, mais certaines colonnes lui sont masquées.

SQL Column Level Security — DENY SELECT sur des colonnes
-- Masquer la colonne Salary pour les analystes
DENY SELECT ON dbo.DimEmployee(Salary) TO [analyst@contoso.com];

-- Masquer plusieurs colonnes sensibles
DENY SELECT ON dbo.DimEmployee(Salary, SSN, BankAccount)
    TO [analyst@contoso.com];

-- L'utilisateur peut toujours interroger les autres colonnes
-- SELECT EmployeeID, Name, Department FROM dbo.DimEmployee; -- OK
-- SELECT Salary FROM dbo.DimEmployee; -- ERREUR : permission refusée

Row Level Security (RLS)

Le RLS est le mécanisme le plus puissant : il filtre les lignes retournées en fonction de l'identité de l'utilisateur connecté. La mise en place se fait en trois étapes : créer un schéma, créer une fonction de filtre, puis créer une politique de sécurité.

SQL Row Level Security — Implementation complete
-- Étape 1 : Créer un schéma dédié pour les fonctions de sécurité
CREATE SCHEMA Security;
GO

-- Étape 2 : Créer la fonction de filtre
-- Cette fonction retourne 1 (autoriser) si l'utilisateur connecté
-- correspond au SalesRep de la ligne, ou s'il est manager
CREATE FUNCTION Security.fn_securitypredicate(
    @SalesRep AS NVARCHAR(256)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
    RETURN SELECT 1 AS fn_securitypredicate_result
    WHERE @SalesRep = USER_NAME()
       OR USER_NAME() = 'manager@contoso.com';
GO

-- Étape 3 : Créer la politique de sécurité et l'appliquer à la table
CREATE SECURITY POLICY SalesFilter
ADD FILTER PREDICATE Security.fn_securitypredicate(SalesRep)
    ON dbo.FactSales
WITH (STATE = ON);
GO
Comment ça fonctionne

Quand un utilisateur exécute SELECT * FROM dbo.FactSales, Fabric applique automatiquement la fonction de filtre. L'utilisateur alice@contoso.com ne verra que les lignes où SalesRep = 'alice@contoso.com'. Le manager verra toutes les lignes. Tout est transparent — la requête de l'utilisateur ne change pas.

07. Dynamic Data Masking — Masquer les données sensibles

Le Dynamic Data Masking (DDM) ne filtre pas les lignes ou les colonnes — il masque les valeurs retournées. L'utilisateur voit la colonne, mais la valeur est remplacee par un masque. Quatre fonctions de masquage sont disponibles :

Fonction Description Exemple (valeur originale → masquée)
default() Masque par défaut selon le type de données 'Jean-Marie''xxxx'
random() Remplace par un nombre aleatoire dans un intervalle 8500042317
partial() Masque partiel avec prefixe/suffixe personnalisables '0612345678''06XXXX78'
email() Masquage spécifique pour les adresses email 'jean@contoso.com''jXXX@XXXX.com'
SQL Dynamic Data Masking — CREATE TABLE avec masques
CREATE TABLE dbo.Employees (
    EmployeeID    INT           NOT NULL,
    FirstName     NVARCHAR(50)  MASKED WITH (FUNCTION = 'default()'),
    LastName      NVARCHAR(50)  MASKED WITH (FUNCTION = 'default()'),
    Email         NVARCHAR(100) MASKED WITH (FUNCTION = 'email()'),
    Phone         NVARCHAR(15)  MASKED WITH (FUNCTION = 'partial(2, "XXXX", 2)'),
    Salary        DECIMAL(10,2) MASKED WITH (FUNCTION = 'random(10000, 99999)'),
    Department    NVARCHAR(50)
);

-- Accorder la permission de voir les données non masquées
GRANT UNMASK TO [hr_manager@contoso.com];

-- Révoquer la permission UNMASK
REVOKE UNMASK FROM [analyst@contoso.com];
DDM vs CLS : quelle difference ?

Avec le CLS, l'utilisateur ne peut pas du tout accéder à la colonne (erreur SQL). Avec le DDM, l'utilisateur voit la colonne mais les valeurs sont masquées. Le DDM est idéal quand l'utilisateur a besoin de savoir que la donnée existe (par exemple, voir qu'un email est renseigné) sans voir la valeur réelle.

08. Warnings & Gotchas — Les pièges à éviter

C'est la partie de la session qui m'a le plus marqué. Shabnam a partage plusieurs pièges concrets que les équipes rencontrent en production.

Piège #1 — RLS Data Leakage

Le RLS filtre les lignes retournées, mais il ne protège pas contre les attaques par inférence via les fonctions d'agrégation. Un utilisateur malveillant pourrait utiliser des WHERE clauses créatives avec des COUNT ou SUM pour déduire des informations sur des lignes qu'il ne peut pas voir directement. Combinez toujours le RLS avec le CLS sur les colonnes sensibles.

Piège #2 — DDM Inference Risk

Le Dynamic Data Masking n'est pas une solution de sécurité forte. Un utilisateur avec des droits SELECT peut potentiellement deviner les valeurs masquées via des requêtes comme WHERE Email = 'jean@contoso.com'. Si la requete retourne des résultats, l'email existe. Le DDM est un mécanisme de protection "casual" — pas un coffre-fort.

Piège #3 — SQL Logins orphelins

Quand un utilisateur est supprimé d'un workspace (rôle retiré), ses permissions SQL ne sont pas automatiquement révoquées. Si l'utilisateur avait des GRANT directs au niveau SQL, ces permissions persistent. Il faut manuellement exécuter des REVOKE ou DENY sur les objets SQL concernés. C'est un oubli fréquent qui crée des failles de sécurité silencieuses.

SQL Détecter les permissions orphelines
-- Lister toutes les permissions SQL accordées
SELECT
    dp.name            AS principal_name,
    dp.type_desc       AS principal_type,
    perm.permission_name,
    perm.state_desc,
    OBJECT_NAME(perm.major_id) AS object_name
FROM sys.database_permissions perm
JOIN sys.database_principals dp
    ON perm.grantee_principal_id = dp.principal_id
WHERE dp.type IN ('S', 'E', 'X')
ORDER BY dp.name;

09. Audit Logs — Tracer et surveiller les accès

La dernière couche de defense : les Audit Logs. Ils ne bloquent rien, mais ils tracent tout. Shabnam a insisté : sans audit logs, vous ne savez pas ce qui se passe réellement dans votre Warehouse.

Ce que les Audit Logs tracent

  • Connexions — qui se connecte, quand, depuis quelle IP
  • Requêtes exécutées — les SELECT, INSERT, UPDATE, DELETE sur les objets
  • Modifications de permissions — les GRANT, DENY, REVOKE
  • Modifications de schéma — CREATE, ALTER, DROP sur les tables et vues
  • Accès aux données sensibles — les tentatives d'accès à des objets protégés par RLS/CLS

Où vivent les Audit Logs

Dans Fabric, les audit logs sont centralises dans le Microsoft 365 Unified Audit Log. Ils sont accèssibles via :

  • Microsoft Purview Compliance Portal — interface web pour rechercher et exporter les logs
  • PowerShell — cmdlets Search-UnifiedAuditLog pour l'automatisation
  • API Office 365 Management Activity — pour intégrer les logs dans un SIEM (Sentinel, Splunk, etc.)

Mise en place

Les audit logs doivent être activés au niveau du tenant par un admin Microsoft 365. Une fois activés, ils capturent automatiquement les événements Fabric. Il est recommandé de configurer des alertes sur les événements critiques (ex : modification de permissions, tentatives d'accès refusées).

Rétention des logs

Par défaut, les audit logs sont conservés 90 jours (licence E3) ou 365 jours (licence E5). Pour des besoins de conformité réglementaire, configurez l'export automatique vers un Data Lake ou un SIEM pour une rétention plus longue.

10. Best Practices — Les recommandations clés

Shabnam a conclu sa session avec un récapitulatif des best practices. Voici les 10 recommandations que je retiens :

# Recommandation Couche
1 Activez les Conditional Access Policies avec MFA obligatoire Identite
2 Configurez les Private Links et bloquez l'accès public si possible Réseau
3 Restreignez le trafic Outbound via les Managed VNet Réseau
4 Appliquez le principe du moindre privilège sur les roles workspace Workspace
5 Utilisez les item-level permissions pour partager avec les non-membres Item
6 Implémentez une protection en couches : RLS + CLS + OLS combinés SQL
7 Utilisez le DDM pour les données sensibles non critiques uniquement SQL
8 Auditez régulièrement les permissions SQL orphelines SQL
9 Activez les Audit Logs et configurez des alertes sur les événements critiques Audit
10 Documentez votre matrice de sécurité et révisez-la trimestriellement Gouvernance
Le takeaway principal

La sécurité dans Fabric Warehouse n'est efficace que si toutes les couches sont activées. Entra ID sans Private Links laisse votre Warehouse accèssible publiquement. RLS sans CLS expose les colonnes sensibles. CLS sans audit logs vous empêche de détecter les violations. Chaque couche renforce les autres — aucune ne suffit seule.

Cette session de Shabnam Watson était l'une des meilleures que j'ai suivies à la FabCon Atlanta 2026. En tant que Data Engineer, j'ai souvent tendance à me concentrer sur les pipelines et les transformations — mais la sécurité mérite la même rigueur. Les exemples de code sont directement applicables, et les "gotchas" partagées par Shabnam évitent des erreurs coûteuses.

Mon plan d'action personnel après cette session : auditer les permissions SQL orphelines sur nos Warehouses de production, implémenter le RLS sur notre table FactSales, et configurer des alertes sur les modifications de permissions dans les audit logs.

Retrouvez-moi sur LinkedIn pour en discuter. Et si vous étiez à la FabCon, dites-moi quelles sessions vous ont le plus marqué !

Sources & References