background success stories

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

Introduites avec la version 2016 de SQL Server, ces fonctionnalités permettent de se conformer à la nouvelle réglementation européenne (RGPD) entrée en vigueur le 25 Mai 2018.
Le principe général repose non pas sur un chiffrement des données, mais sur le fait de masquer ou de filtrer celles-ci aux utilisateurs non autorisés.

Le « Dynamic Data Masking » (DDM) utilise des fonctions de masquage pré-construites (default, email, random, partial) pour masquer certaines colonnes contenant des données sensibles.

Voici un exemple :

Création et peuplement d’une table :

USE SETRA
GO
CREATE TABLE EMPLOYE (
Id INT PRIMARY KEY
,prenom NVARCHAR(10) NOT NULL
,nom NVARCHAR(10) NOT NULL
,salaire INT NULL
,email NVARCHAR(50) NULL
)
INSERT INTO [dbo].[EMPLOYE] 
VALUES ('1','romain','batavoine','5000','romain.batavoine@setra-conseil.com');

Création d’un utilisateur destiné à consulter la table :

USE [master]
GO
CREATE LOGIN [service_administratif] WITH PASSWORD=N'', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [SETRA]
GO
CREATE USER [service_administratif] FOR LOGIN [service_administratif]
GO

Les données de salaire et de courriers étant confidentiels, nous masquons celles-ci en base :

ALTER TABLE EMPLOYE ALTER COLUMN salaire int MASKED WITH (FUNCTION='random(1,3)');
ALTER TABLE EMPLOYE ALTER COLUMN email nvarchar(50) MASKED WITH (FUNCTION = 'Email()'); 

Lorsque le service administratif essaie à nouveau de visualiser les données, il obtient le résultat suivant :

A noter que :

  • Aucune modification côté applicatif n’est requise.
  • Aucune donnée n’est modifiée en base.
  • La fonction UNMASK, accordée à un utilisateur, lui permettra de visualiser les données masquées.
  • Le masque de colonne peut être facilement abandonné via la commande « DROP MASK ».
  • La table « sys.masked_columns » permet de visualiser toutes les colonnes possédant un masque.

Dans le prochain post, nous verrons comment le row-filtering permet de filtrer le résultat d’une requête en fonction de l’utilisateur qui l’a initié.