Cet article donne une compréhension de haut niveau du masquage dynamique des données dans SQL Server, ainsi que de ses cas d'utilisation, des meilleures pratiques et des implications en matière de sécurité pour les utilisateurs avancés de SQL (y compris les développeurs et les testeurs). De plus, les lecteurs de cet article vont se familiariser avec l'application de différents types de masquage dynamique des données. L'article souligne également l'importance d'une utilisation avancée du masquage des données dans les tâches quotidiennes de développement et de test des bases de données.
Pré-requis
Passons d'abord en revue les prérequis pour cet article.
Familiarité avec T-SQL
Cet article suppose que les lecteurs connaissent bien les scripts T-SQL et peuvent facilement écrire et exécuter des requêtes SQL pour afficher et manipuler les bases de données SQL.
Principes de base du masquage dynamique des données
Cet article suppose également que les lecteurs connaissent les concepts de base du masquage dynamique des données dans SQL Server. Veuillez vous référer à l'article Masquage des données dans SQL Server pour les débutants afin de vous familiariser avec les bases du masquage dynamique des données si vous ne l'avez pas encore fait.
Base de données Azure SQL ou compatibilité SQL Server 2016
La fonctionnalité de masquage dynamique des données est disponible dans SQL Server 2016 à SQL Server 2019, il est donc fortement recommandé d'avoir l'un des éléments suivants :
1. Base de données Azure SQL
2. SQL Server 2016 installé localement ou à distance.
Configuration de la base de données exemple
N'oubliez pas de créer un exemple de base de données à l'aide du script T-SQL suivant compatible avec SQL Server 2016 ou en tant que base de données Azure SQL si vous souhaitez suivre la procédure pas à pas de cet article :
-- Créer une base de données exemple ITSalesV2CREATE DATABASE ITSalesV2;GOUSE [ITSalesV2]-- (2) Créer une table MonthlySaleCREATE TABLE [dbo].[MonthlySale]( [SaleId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, [SellingDate] [datetime2](7) NULL, [Customer] [varchar](50) NULL, [Email] [varchar] (200) NULL, [Product] [varchar](150) NULL, [TotalPrice] [decimal] (10, 2) NULL,)-- (2) Remplir la table de vente mensuelleSET IDENTITY_INSERT [dbo].[MonthlySale] ONINSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email] , [Product], [TotalPrice]) VALUES (1, N'2019-05-01 00:00:00', N'Asif', N'[email protected]', N'Dell Laptop', CAST(300.00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (2, N'2019 -05-02 00:00:00', N'Mike',N'[email protected]', N'Dell Laptop', CAST(300.00 AS Decimal(10, 2)))INSERT INTO [dbo].[ MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (3, N'2019-05-02 00 :00:00', N'Adil',N'[email protected]',N'Lenovo Laptop', CAST(350.00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId ], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (4, N'2019-05-03 00:00:00', N'Sarah',N'example@sqldat .com', N'HP Laptop', CAST(250.00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product ], [TotalPrice]) VALUES (5, N'2019-05-05 00:00:00', N'Asif', N'[email protected]', N'Dell Desktop', CAST(200.00 AS Decimal( 10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (6, N'2019-05- 10 00:00:00', N'Sam',N'[email protected]', N'HP Desktop', CAST(300.00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ( [SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (7, N'2019-05-12 00:00:00', N'Mike',N'example @sqldat.com', N'iPad', CAST(250.00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate] , [Client],[Email], [Produit], [PrixTotal]) VALEURS (8, N'2019-05-13 00:00:00', N'Mike',N'[email protected]', N 'iPad', CAST(250.00 AS Decimal(10, 2)))INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALEURS (9, N'2019-05-20 00:00:00', N'Peter',N'[email protected]', N'Dell Laptop', CAST(350.00 AS Decimal(10, 2))) INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (10, N'2019-05-25 00:00:00 ', N'Peter',N'[email protected]', N'Asus Laptop', CAST(400.00 AS Decimal(10, 2)))SET IDENTITY_INSERT [dbo].[MonthlySale] OFF
Vérification des données
Vérifiez l'exemple de base de données nouvellement créé et rempli ITSalesV2 en exécutant le script suivant :
-- Afficher les données de ventes mensuellesSELECT s.SaleId ,s.SellingDate ,s.Customer ,s.Email ,s.Product ,s.TotalPriceFROM dbo.MonthlySale s
Le résultat est le suivant :
Créer un utilisateur non privilégié
Veuillez créer un utilisateur non privilégié sans connexion ayant uniquement l'autorisation SELECT sur la table MonthlySale qui verra les données masquées comme prérequis à cet article. Utilisez le script suivant pour cela :
-- Créer DataUser pour avoir un accès Select à la table MonthlySaleCREATE USER DataUser SANS CONNEXION ; GRANT SELECT ON MonthlySale TO DataUser ;
Création d'une procédure pour vérifier l'état du masquage
Cet article suppose également qu'il existe une procédure stockée dans la base de données exemple qui nous montre l'état de masquage dynamique des données des colonnes dans les tables de la base de données :
-- Procédure stockée pour vérifier l'état du masquage dynamique des donnéesCREATE PROC ShowMaskingStatusASBEGINSET NOCOUNT ON SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function FROM sys.masked_columns AS c JOIN sys.tables AS tbl ON c. [object_id] =tbl.[object_id] WHERE is_masked =1;END
Types de masquage dynamique des données
Il existe quatre types courants de masquage dynamique des données dans SQL Server :
1. Masque(s) de données par défaut
2. Masque(s) de données partiel(s)
3. Masque(s) de données aléatoire(s)
4. Masque(s) de données de chaîne personnalisé(s)
Nous allons maintenant implémenter les quatre types courants de masquage de données dynamiques.
Mise en œuvre du masquage des données par défaut
Le masquage des données par défaut masque complètement une colonne à un utilisateur non autorisé en couvrant toutes les valeurs de la colonne avec un caractère spécial, ce qui rend très difficile de deviner le contenu de la colonne.
Exigence commerciale
Supposons maintenant que vous receviez une exigence commerciale indiquant que les adresses e-mail des clients doivent être complètement masquées (masquées) en raison de la sensibilité de ces informations.
La meilleure façon de répondre à cette exigence commerciale est de masquer la colonne E-mail en utilisant le masquage dynamique des données (DDM).
Masquage des données par défaut de l'adresse e-mail
Nous allons modifier le tableau pour masquer les adresses e-mail comme suit :
--Masquage dynamique des données par défaut de la colonne Email ALTER TABLE MonthlySaleALTER COLUMN Email varchar(200) MASKED WITH (FUNCTION ='default()');
Vérification de l'état du masquage
Vérifiez l'état du masquage dynamique des données à l'aide de la procédure stockée suivante basée sur un script T-SQL référencé dans la documentation Microsoft :
-- Vérification de l'état du masquage dynamique des donnéesEXEC ShowMaskingStatus
La sortie nous montre quelles colonnes ont été masquées avec succès :
Affichage de la colonne d'e-mail en tant que DataUser
Ensuite, exécutez l'instruction Select pour afficher les ventes mensuelles (table) en tant qu'utilisateur à faibles privilèges appelé DataUser n'ayant que l'autorisation de sélection sur la table comme suit :
-- Exécuter SELECT en tant que DataUserEXECUTE AS USER ='DataUser'; -- Afficher les ventes mensuelles SELECT s.SaleId, s.SellingDate, s.Customer, s.Email, s.Product, s.Product from dbo.MonthlySale s-- Rétablir l'utilisateur à quel utilisateur il était avantREVERT ;
Le résultat est le suivant :
Mise en œuvre du masquage partiel des données
Le masquage partiel des données, comme son nom l'indique, empêche partiellement une colonne d'être visualisée par un utilisateur non autorisé, couvrant une partie des valeurs de la colonne avec des caractères spéciaux, ce qui rend le contenu de la colonne quelque peu lisible mais toujours difficile à deviner.
Exigence commerciale
Pensez maintenant à une exigence commerciale dans laquelle il vous a été demandé de masquer partiellement le nom des clients de manière à ce que seul le premier caractère du nom reste visible. La meilleure façon de répondre à cette exigence commerciale consiste à masquer la colonne Client à l'aide du masquage dynamique partiel des données.
Masquage partiel des données des noms de clients
Nous allons modifier le tableau pour masquer partiellement la colonne Client comme suit :
-- Masquage partiel des données de Customer namesALTER TABLE MonthlySaleALTER COLUMN [Customer] ADD MASKED WITH (FUNCTION ='partial(1,"XXXXXXX",0)')
Vérification de l'état du masquage
Vérifiez l'état du masquage dynamique des données :
-- Vérification de l'état du masquage dynamique des donnéesEXEC ShowMaskingStatus
La sortie nous montre quelles colonnes ont été masquées avec succès :
Affichage de la colonne Client en tant que DataUser
Affichez le tableau en tant qu'utilisateur test DataUser qui doit voir les données masquées :
-- Exécuter SELECT en tant que DataUserEXECUTE AS USER ='DataUser'; -- Affichez les ventes mensuelles en tant que DataUserSELECT s.SaleId, s.SellingDate, s.Customer, s.Email, s.Product, s.Product from dbo.MonthlySale s-- Rétablir l'utilisateur à quel utilisateur il était avantREVERT ;Le résultat est le suivant :
Mettre en œuvre le masquage aléatoire des données
Le masquage aléatoire des données masque une colonne de manière aléatoire à un utilisateur non autorisé en couvrant une colonne en fonction d'une plage de valeurs, ce qui rend très difficile la devinette du contenu de la colonne. N'oubliez pas que le type de masquage des données aléatoires ne s'applique qu'aux colonnes qui ne stockent que des nombres et qu'il peut être spécifié en fournissant une plage de randomisation.
Exigence commerciale
Vous recevez une exigence commerciale indiquant que le prix du produit doit être masqué par une plage de chiffres aléatoire afin que les utilisateurs disposant de faibles privilèges ne connaissent pas les prix exacts du produit pour des raisons de confidentialité. La meilleure façon de respecter cette spécification commerciale consiste à masquer la colonne TotalPrice à l'aide d'un masquage dynamique aléatoire des données.
Masquage aléatoire des données de la colonne TotalPrice
Modifiez la table MonthlySale pour masquer TotalPrice de manière aléatoire comme suit :
--Masquage aléatoire des données dynamiques de la colonne TotalPrice ALTER TABLE MonthlySaleALTER COLUMN [TotalPrice] decimal(10,2) MASKED WITH (FUNCTION ='random(1, 12)')Vérification de l'état du masquage
Veuillez vérifier l'état du masquage dynamique des données en exécutant la procédure stockée suivante :
-- Vérification de l'état du masquage dynamique des donnéesEXEC ShowMaskingStatusLa sortie nous montre quelles colonnes ont été masquées avec succès :
Affichage de la colonne TotalPrice en tant que DataUser
Afficher la table en tant que DataUser maintenant :
-- Exécuter SELECT en tant que DataUserEXECUTE AS USER ='DataUser'; -- Afficher les ventes mensuelles SELECT s.SaleId, s.SellingDate, s.Customer, s.Email, s.Product, s.TotalPrice from dbo.MonthlySale s-- Rétablir l'utilisateur à quel utilisateur il était avantREVERT ;Le résultat est le suivant :
N'oubliez pas que le résultat peut différer pour la colonne Random Data Masked en raison de la génération de nombres aléatoires.
Mettre en œuvre le masquage de données de chaîne personnalisé
Le masquage de données de chaîne personnalisé, comme son nom l'indique, ajoute un caractère personnalisé pour masquer une colonne en rendant très difficile de deviner son contenu. N'oubliez pas que le masquage personnalisé des données de chaîne est utilisé conjointement avec le masquage partiel des données en personnalisant le caractère pour masquer les valeurs réelles de la colonne. En d'autres termes, le masquage personnalisé des données de chaîne est une forme améliorée de masquage partiel des données.
Exigence commerciale
Envisagez une exigence commerciale pour afficher uniquement le premier et le dernier caractère de la colonne Produit tandis que le reste des caractères doit être masqué ou masqué par des traits d'union (-). La meilleure façon de respecter cette spécification commerciale consiste à masquer la colonne Produit à l'aide du masquage dynamique partiel des données avec la chaîne personnalisée requise.
Masquage des données de chaîne client des données de vente
Modifiez la table MonthlySale pour masquer la colonne Product comme suit :
--Masquage dynamique des données de chaîne personnalisée de la colonne Product ALTER TABLE MonthlySaleALTER COLUMN [Product] ADD MASKED WITH (FUNCTION ='partial(1,"---",1)')Vérification de l'état du masquage
Il est utile de vérifier l'état du masquage dynamique des données à ce stade à l'aide du script suivant :
-- Vérification de l'état du masquage dynamique des donnéesEXEC ShowMaskingStatusLa sortie affiche toutes les colonnes sur lesquelles le masquage dynamique des données a été appliqué avec succès, comme indiqué ci-dessous :
Affichage de la colonne Produit en tant que DataUser
Afficher la table en tant que DataUser maintenant :
-- Exécuter SELECT en tant que DataUserEXECUTE AS USER ='DataUser'; -- Afficher les ventes mensuelles SELECT s.SaleId, s.SellingDate, s.Customer, s.Email, s.Product, s.TotalPrice from dbo.MonthlySale s-- Rétablir l'utilisateur à quel utilisateur il était avantREVERT ;Le résultat est le suivant :
Toutes nos félicitations! Vous avez implémenté avec succès les quatre techniques de masquage.
Veuillez vous référer à l'article Masquage de données dans SQL Server pour les débutants afin de supprimer les types de masquage de données appliqués.Meilleures pratiques
N'oubliez pas les points suivants :
1. Le masquage dynamique des données ne protège ni ne chiffre les données de la colonne, il ne doit donc pas être utilisé à cette fin.
2. L'utilisateur potentiel qui est censé voir les données masquées doit avoir un accès très limité pour voir les données et ne doit en aucun cas recevoir l'autorisation de mise à jour pour exploiter les données.
3. L'utilisateur potentiel, même avec l'autorisation SELECT uniquement, peut exécuter des requêtes exhaustives pour deviner la valeur correcte, veuillez donc vous en méfier.
4. Vous pouvez également utiliser ALTER COLUMN Email ADD MASKED WITH (FUNCTION ='email()') pour masquer les colonnes d'e-mail plutôt que d'utiliser le masquage dynamique par défaut.
5. Vous pouvez utiliser le masquage de données de chaîne personnalisé pour masquer un numéro de carte de débit dans un rapport de transaction en n'affichant que les deux ou quatre derniers chiffres, comme vous avez pu le voir sur les reçus d'achat.Choses à faire
Maintenant que vous pouvez implémenter les quatre types de masquage, essayez les choses suivantes pour améliorer vos compétences :
1. Veuillez créer un exemple de base de données en suivant la procédure pas à pas de l'article Développement de rapports SSRS en termes simples, puis en développant un rapport SSRS qui n'affiche que le premier caractère des noms d'auteur en masquant le reste à l'aide du masquage partiel des données.
2. Veuillez essayer de créer un exemple de base de données référencé dans l'article Création et déploiement de plusieurs versions de base de données via des instantanés de schéma, puis créez un utilisateur de test appelé Étudiant et appliquez un masquage de données dynamique approprié pour masquer les notes de tous les étudiants pour cet utilisateur de test.
3. Veuillez essayer de créer et de supprimer le masquage dynamique des données pour vous assurer que vous pouvez ajouter et supprimer avec succès le masquage dynamique des données sur une table SQL.