La version finale de SQL Server 2016 est sortie récemment. C’est donc le moment de s’intéresser aux nouvelles fonctionnalités apportées par cette version. Aujourd’hui nous allons voir Dynamic Data Masking. Cette fonctionnalité déjà disponible sur SQL Azure depuis quelques temps est désormais accessible aux installations on-premise.

Dans certaines tables on peut être amener à stocker des informations sensibles, ou tout du moins des informations dont on ne souhaite pas que tous les utilisateurs puissent avoir accès : numéro de carte bleu, adresse email, etc. Actuellement pour protéger ces données on peut créer des vues ou des procédures stockées masquant les colonnes souhaités, mais cela demande du temps et est difficile à paramétrer selon l’utilisateur connecté.

Dynamic Data Masking essaye de répondre à ce besoin en permettant de masquer le contenu de certaines colonnes selon les droits de l’utilisateur connecté. Avant de voir comment cela se paramètre, voici le résultat de la même requête avec 2 utilisateurs différents n’ayant pas les mêmes autorisations :

Requête droits différents

Comme on peut le voir l’idée n’est donc pas d’enlever des colonnes, mais d’en anonymiser le contenu. Par exemple un opérateur téléphonique pourra vous demander les X derniers chiffres de votre carte bancaire et vérifier qu’il s’agit bien de la votre, mais n’aura pour autant pas accès à l’intégralité de celle-ci. Par contre un utilisateur avec les droits suffisant pourra voir les données non masquées.

Mise en place des Mask

Avant d’utiliser cette fonctionnalité il faut l’activer :

DBCC TRACEON(209,219,-1)

Créons la table :

CREATE TABLE [dbo].[Customer](
    [Id] [uniqueidentifier] NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [CardNumber] [nchar](20) NULL,
    [Email] [nvarchar](255) NULL
) 

Pour activer le masquage des données il faut modifier la définition des colonnes souhaitées :

ALTER TABLE Customer 
ALTER COLUMN Name ADD MASKED WITH (FUNCTION = 'default()')

Le remplacement des données est défini avec FUNCTION = 'default()'. 3 fonctions sont disponibles :

  • default() : remplace la valeur par “XXXX” pour une chaine de caractères ou sa valeur par défaut (0 pour un nombre, 1/1/0001 pour une date, etc. )
  • email() : conserve la première lettre de l’email ainsi que l’extension du domaine
  • partial(prefix_length, 'XXX', suffix_length) : replace le texte par les N premiers caractères de la chaine originale suivi de la chaine souhaitée (‘XXX’ dans l’exemple) suivi des N caractères de la chaine originale

Par exemple pour filtrer un numéro de carte bancaire on peut utiliser le filtre suivant :

ALTER TABLE Customer
ALTER COLUMN CardNumber ADD MASKED WITH (FUNCTION = 'partial(0, "XXXX-XXXX-XXXX-", 4)')
-- XXXX-XXXX-XXXX-1234

Pour un numéro de téléphone on peut conserver les 4 premiers chiffres :

ALTER TABLE Customer 
ALTER COLUMN PhoneNumber ADD MASKED WITH (FUNCTION = 'partial(4, "000000", 0)')
-- 0175000000

Pour l’adresse email on utilise la fonction dédiée à cet usage :

ALTER TABLE Customer 
ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
-- cXXX@XXXX.com

Définir les permissions

Si vous exécuter la requête SELECT * FROM Customer il est fort probable que vous ne voyiez pas les masques. En effet vous avez surement la permission UNMASK. Nous allons donc créer un nouvel utilisateur sans cette permission et exécuter la requête avec son identité :

CREATE USER TestUser WITHOUT LOGIN;
GRANT SELECT ON Customer TO TestUser;

EXECUTE AS USER = 'TestUser';
SELECT * FROM Customer;
REVERT;
permissions

Les données sont bien masquées. Ajoutons maintenant la permission UNMASK à l’utilisateur et regardons la différence :

GRANT UNMASK TO TestUser;

EXECUTE AS USER = 'TestUser';
SELECT * FROM Customer;
REVERT;
permission UNMASK

Cette fois l’utilisateur peut voir les données non masquées.

Conclusion

Cette nouvelle fonctionnalité permet d’améliorer simplement la confidentialité des données sans pour autant modifier le contenu de la base de données. Selon les droits de l’utilisateur SQL Server anonymisera les données automatiquement selon les règles spécifiées.

Ne ratez plus aucunes actualités avec la newsletter mensuelle de SoftFluent