La sécurité au niveau des lignes (RLS) est un contrôle d'accès aux bases de données qui limite les lignes d'une table qu'un utilisateur peut lire ou modifier en fonction de son identité, de son rôle ou du contexte de sa session.
Au lieu de restreindre l'accès à des tables entières ou à des colonnes spécifiques, la RLS filtre les données ligne par ligne. Le moteur de base de données applique automatiquement le filtre au moment de la requête, de sorte que la même règle s'applique quel que soit l'outil utilisé par l'utilisateur pour accéder aux données.
La RLS fait partie du contrôle d'accès de précision, aux côtés de :
Par exemple, un commercial peut interroger la table des commandes de l'entreprise mais ne voir que les commandes de la région qui lui est attribuée, même si la table contient les données de toutes les régions. L'utilisateur écrit une instruction SELECT normale, et le moteur ne renvoie que les lignes qu'il est autorisé à voir.
La RLS est désormais un élément fondamental pour le SaaS multi-tenant, la ségrégation régionale des données et les cas d'usage de conformité. Cet article explique comment fonctionne la RLS, ses avantages, ses limites et son fonctionnement sur la plateforme Databricks.
La sécurité au niveau des lignes fonctionne en appliquant une règle de filtrage, souvent appelée politique ou prédicat, à une table. Lorsqu'un utilisateur exécute une requête, le moteur de base de données applique automatiquement ce filtre et ne renvoie que les lignes que l'utilisateur est autorisé à voir.
En pratique, la RLS fonctionne généralement en trois étapes :
CURRENT_USER, d'une variable de session définie par l'application ou d'une table de correspondance qui associe les utilisateurs et les groupes aux données autorisées.TRUE pour les lignes que l'utilisateur peut voir et FALSE pour tout le reste. Seules les lignes qui passent le prédicat sont renvoyées.Comme l'application se fait au niveau de la base de données, la même règle s'applique de manière cohérente à tous les chemins d'accès, y compris les tableaux de bord BI, les notebooks, le SQL ad-hoc, les API et les outils tiers. C'est cette cohérence qui fait la force de la RLS : une seule règle, appliquée partout, imposée par le moteur.
La plupart des moteurs font également la distinction entre l'application en lecture et en écriture. Un prédicat de lecture contrôle ce qu'une requête SELECT renvoie. Un prédicat d'écriture, souvent défini séparément avec une clause WITH CHECK, contrôle les lignes qu'un utilisateur peut insérer, mettre à jour ou supprimer.
Les deux prédicats peuvent être identiques, mais ce n'est pas obligatoire. For exemple, un utilisateur peut être autorisé à lire les lignes de toutes les régions, mais ne peut insérer des lignes que pour sa propre région. Il est important de définir les deux aspects lorsqu'une table accepte des écritures, car l'omission de la vérification d'écriture est l'une des erreurs de configuration de la RLS les plus courantes en production.
La RLS est l'un des nombreux contrôles d'accès fins, et en production, elle est presque toujours associée à d'autres. Le tableau ci-dessous montre comment chaque contrôle s'intègre.
| Contrôle | Ce qu'il restreint | Cas d'usage typique |
|---|---|---|
| Sécurité au niveau des lignes (RLS) | Lignes spécifiques dans une table | Limiter les utilisateurs à leur région, tenant ou département |
| Sécurité au niveau des colonnes (CLS) | Colonnes spécifiques dans une table | Masquer les colonnes de salaire, de SSN ou de PII pour les analystes |
| Sécurité au niveau des objets (OLS) | Tables, vues ou mesures entières | Bloquer complètement l'accès à un jeu de données sensible |
| Masquage des données | Valeurs visibles dans une colonne | Afficher uniquement les 4 derniers chiffres d'un numéro de carte |
| GRANT / REVOKE | Autorisations de lecture/écriture au niveau de la table | Autoriser ou refuser l'accès à la table dans son ensemble |
Ces contrôles sont conçus pour se superposer. Une configuration typique utilise des autorisations au niveau de la table pour contrôler qui peut y accéder, la RLS pour définir les lignes visibles, et la sécurité au niveau des colonnes ou le masquage des données pour protéger les champs sensibles au sein de ces lignes. Le fait de les traiter comme une pile plutôt que comme un menu d'alternatives rend la gouvernance à la fois auditable et résiliente. Une mauvaise configuration dans une couche ne compromet pas les autres.
La RLS est le moyen standard d'imposer qui peut voir quoi dans une table partagée, en filtrant les lignes en fonction des attributs d'un utilisateur par rapport à une colonne clé telle que la région, le tenant ou la classification. La plupart des équipes y ont recours lorsqu'un même jeu de données doit servir plusieurs publics ayant des règles de visibilité différentes.
Le modèle général est cohérent sur toutes les plateformes, la syntaxe spécifique au fournisseur étant intégrée là où c'est nécessaire.
tenant_id, region ou owner_id. Si aucune colonne de ce type n'existe encore, prévoyez un backfill avant la mise en œuvre de la politique, et envisagez d'indexer la colonne pour que le prédicat reste peu coûteux.