background success stories

SQL Server 2016 et RGPD (partie 2/2) : « Dynamic Data Masking » et « Row-level Security ».

Le « Row-level filtering » est une autre fonctionnalité introduite avec la version 2016 de SQL Server, et basée sur la protection des données.
Celle-ci s’appuie sur l’utilisation de prédicats pour filtrer ou bloquer l’accès des données pertinentes aux utilisateurs concernés, à partir d’un attribut de table.
Le « Row-level filtering » permet donc un accès granulaire aux données, transparent côté applicatif.

Prenons, l’exemple d’une table référençant les employés et leurs salaires. Pour l’instant, chaque employé peut consulter l’ensemble de ces informations confidentielles :

Nous allons ajouter une fonction utilisant l’id d’un utilisateur pour associer chaque utilisateur aux données qui le concernent :

CREATE FUNCTION dbo.rowLevelPredicate (@code_salarie as sysname)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS rowLevelPredicateResult
WHERE @code_salarie = USER_NAME();
GO

puis ajouter un prédicat filtrant à la table via une politique de sécurité :

CREATE SECURITY POLICY FiltreSalaire
ADD FILTER PREDICATE dbo.rowLevelPredicate(code_salarie)
ON dbo.EmployeSalaire
WITH (STATE = ON);
GO

Les données propres à chaque salarié sont désormais filtrées:

SELECT * FROM dbo.EmployeSalaire;
SELECT COUNT(*) FROM dbo.EmployeSalaire;

De la même manière, un prédicat bloquant peut-être appliqué sur la table. Il ne s’agirait pas que les employés puissent modifier le montant de leur salaire d’eux-mêmes !

CREATE FUNCTION dbo.rowLevelPredicate2 (@code_salarie as sysname)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS rowLevelPredicateResult2
WHERE USER_NAME()='MGM' --Seul le manager aura la possibilité de modifier les salaires
GO

ALTER SECURITY POLICY FiltreSalaire
ADD BLOCK PREDICATE dbo.rowLevelPredicate2(code_salarie)
ON dbo.EmployeSalaire AFTER UPDATE;

Résultat :

UPDATE [dbo].[EmployeSalaire] SET salaire = '1000' WHERE code_salarie ='MSC';

(1 ligne(s) affectée(s))
Msg 33504, Niveau 16, État 1, Ligne 3
The attempted operation failed because the target object ‘SETRA.dbo.EmployeSalaire’
has a block predicate that conflicts with this operation. If the operation is performed on a view,
the block predicate might be enforced on the underlying table. Modify the operation to target only the rows that are allowed by the block predicate.
The statement has been terminated.