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 :
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 domainepartial(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()')
-- [email protected]
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;
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;
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.