- Introduction — Pourquoi la sécurité dans Fabric Warehouse
- Microsoft Entra ID — La fondation identitaire
- Network Security — Private Links, VNet et accès public
- Workspace Roles — Admin, Member, Contributor, Viewer
- Item-Level Permissions — Contrôle granulaire par objet
- SQL-Level Permissions — OLS, CLS, RLS avec exemples
- Dynamic Data Masking — Masquer les données sensibles
- Warnings & Gotchas — Les pièges à éviter
- Audit Logs — Tracer et surveiller les accès
- 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 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
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
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 |
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.
-- 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.
-- 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.
-- 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é.
-- É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
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 | 85000 → 42317 |
partial() |
Masque partiel avec prefixe/suffixe personnalisables | '0612345678' → '06XXXX78' |
email() |
Masquage spécifique pour les adresses email | 'jean@contoso.com' → 'jXXX@XXXX.com' |
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];
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.
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.
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.
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.
-- 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-UnifiedAuditLogpour 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).
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 |
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
- Security in Fabric Data Warehouse - Microsoft Learn
- Microsoft Fabric Security Overview - Microsoft Learn
- Row-Level Security in Fabric Warehouse - Microsoft Learn
- Column-Level Security in Fabric Warehouse - Microsoft Learn
- Dynamic Data Masking in Fabric Warehouse - Microsoft Learn
- Private Links for Microsoft Fabric - Microsoft Learn
- Session "End-to-End Security for Data Warehousing in Microsoft Fabric" par Shabnam Watson — FabCon + SQLCon Atlanta 2026