Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Masquage dynamique des données dans SQL Server pour les débutants

L'article présente les bases du masquage dynamique des données (DDM) dans SQL Server, ainsi que sa vue d'ensemble prise en charge par un exemple simple d'implémentation du masquage des données. De plus, les lecteurs vont se familiariser avec les avantages du masquage dynamique des données. Cet article souligne également l'importance du masquage des données dans les tâches quotidiennes de développement de bases de données lorsque certains champs doivent être masqués en raison de leur nature sensible afin de se conformer aux pratiques standard.

À propos du masquage des données

Passons en revue les concepts de base du masquage des données et la disponibilité de cette fonctionnalité dans SQL Server.

Définition simple

Le masquage des données est une méthode de masquage complet ou partiel des données, ce qui rend difficile la reconnaissance ou la compréhension des données après l'application du masquage.

Définition Microsoft

Selon la documentation de Microsoft, le masquage dynamique des données (DDM) limite l'exposition des données sensibles en les masquant aux utilisateurs non privilégiés.

Qu'est-ce que les données sensibles ?

Par données sensibles, nous entendons toutes les données contenant des informations privées, personnellement identifiables, financières ou de sécurité qui, si elles sont révélées, peuvent être utilisées à mauvais escient ou nuire à la réputation d'une organisation.

Exemple de données sensibles

Un bon exemple de données sensibles est un numéro de carte de débit stocké dans une base de données qui doit être protégée contre toute utilisation non autorisée. Un autre bon exemple de données sensibles est l'adresse e-mail personnelle qui permet d'identifier facilement une personne.

Utilisateurs non privilégiés

Tout utilisateur de la base de données qui n'est pas autorisé à voir les données sensibles est considéré comme un utilisateur non privilégié.

Masquage dynamique des données (DDM)

La fonctionnalité de masquage des données prise en charge par SQL Server est connue sous le nom de masquage dynamique des données, également référencée sous le nom de DDM dans la documentation Microsoft. En d'autres termes, Microsoft fait référence au masquage des données en tant que masquage dynamique des données dans SQL Server.

Compatibilité

Selon la documentation Microsoft, la fonctionnalité de masquage dynamique des données est prise en charge par les versions suivantes de SQL Server :
1. SQL Server 2016 et versions ultérieures
2. Base de données SQL Azure
3. Azure SQL Data Warehouse
Donc, si vous n'avez pas encore commencé à utiliser la ou les bases de données Azure SQL, vous avez besoin d'au moins SQL Server 2016 pour utiliser la fonctionnalité de masquage dynamique des données.

Configuration du masquage dynamique des données

Le masquage dynamique des données peut être configuré en utilisant simplement les commandes T-SQL.
La mise en œuvre du masquage dynamique des données est effectuée via des scripts T-SQL pour empêcher les utilisateurs non autorisés de visualiser les données sensibles.

Avantages du masquage dynamique des données

Enfin, passons en revue certains avantages clés du masquage dynamique des données, mais avant cela, je voudrais demander aux débutants SQL et non aux professionnels SQL, quels sont les avantages des contraintes d'intégrité ?
Considérons un exemple d'un contrainte de clé qui garantit que la colonne sur laquelle elle est appliquée a des valeurs distinctes (pas de doublons). Si je peux appliquer des valeurs de colonne distinctes au moment de la saisie des données dans mon application frontale, pourquoi devrais-je prendre la peine de l'appliquer via une base de données en appliquant une contrainte de clé unique ?
La réponse est de s'assurer que les règles (contraintes d'intégrité ) restent cohérents et sont contrôlés de manière centralisée. Je dois le faire au niveau de la base de données, sinon je devrai peut-être écrire le code pour appliquer des valeurs uniques dans toutes les applications présentes et à venir qui accèdent à la base de données.
Il en va de même pour le masquage dynamique des données puisqu'il définit le masque sur une colonne au niveau de la base de données afin qu'il ne soit pas nécessaire d'effectuer un masquage supplémentaire (code) par les applications accédant à la base de données.

Le masquage dynamique des données présente les avantages suivants par rapport aux approches traditionnelles :
1. Le masquage dynamique des données met en œuvre la politique centralisée de masquage ou de modification des données sensibles dans une base de données dont hérite toute application souhaitant accéder aux données.
2. Le masquage dynamique des données dans SQL Server peut aider à gérer les utilisateurs disposant de privilèges pour voir les données sensibles et les utilisateurs qui ne sont pas autorisés à les voir.
3. Il a une implémentation simple sous la forme d'un script T-SQL.

Mise en œuvre du masquage dynamique des données

Avant d'implémenter le masquage dynamique des données, nous devons comprendre les types de masquage dynamique des données qui peuvent être appliqués à une colonne dans une table d'une base de données SQL ou Azure SQL.

Types de masques de données

Il existe quatre types de masques de données que nous pouvons appliquer à une colonne :
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 personnalisé(s)
Dans cet article, nous allons nous concentrer sur le type de masquage de données par défaut.

Application de masques de données dynamiques

Les masques de données dynamiques peuvent être appliqués à une colonne d'une table des manières suivantes :
1. Lors de la création d'une nouvelle table
2. Modification d'un tableau déjà créé pour appliquer le masquage des données à sa ou ses colonnes

Configurer une base de données exemple

Créons un exemple de base de données nommé SQLDevBlogV5 en exécutant le script T-SQL suivant :

-- Create sample database (SQLDevBlogV5)
CREATE DATABASE SQLDevBlogV5;
GO


USE SQLDevBlogV5;

-- (1) Create Article table in the sample database
CREATE TABLE Article (
  ArticleId INT PRIMARY KEY IDENTITY (1, 1)
 ,Category	VARCHAR(50)
 ,Author VARCHAR(50)
 ,Title VARCHAR(150)
 ,Published DATETIME2
 ,Notes VARCHAR(400)  
)

GO

-- (2) Populating Article table
SET IDENTITY_INSERT [dbo].[Article] ON
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (1, N'Development', N'Atif', N'Introduction to T-SQL Programming ', N'2017-01-01 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (2, N'Testing', N'Peter', N'Database Unit Testing Fundamentals', N'2017-01-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (3, N'DLM', N'Sadaf', N'Database Lifecycle Management for beginners', N'2017-01-20 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (4, N'Development', N'Peter', N'Common Table Expressions (CTE)', N'2017-02-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (5, N'Testing', N'Sadaf', N'Manual Testing vs. Automated Testing', N'2017-03-20 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (6, N'Testing', N'Atif', N'Beyond Database Unit Testing', N'2017-11-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (7, N'Testing', N'Sadaf', N'Cross Database Unit Testing', N'2017-12-20 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (8, N'Development', N'Peter', N'SQLCMD - A Handy Utitliy for Developers', N'2018-01-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (9, N'Testing', N'Sadaf', N'Scripting and Testing Database for beginners ', N'2018-02-15 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (10, N'Development', N'Atif', N'Advanced Database Development Methods', N'2018-07-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (11, N'Testing', N'Sadaf', N'How to Write Unit Tests for your Database', N'2018-11-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (12, N'Development', N'Peter', N'Database Development using Modern Tools', N'2018-12-10 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (13, N'DLM', N'Atif', N'Designing, Developing and Deploying Database ', N'2019-01-01 00:00:00', NULL)
INSERT INTO [dbo].[Article] ([ArticleId], [Category], [Author], [Title], [Published], [Notes]) VALUES (14, N'DLM', N'Peter', N'How to Apply Database Lifecycle Management  ', N'2019-02-10 00:00:00', NULL)
SET IDENTITY_INSERT [dbo].[Article] OFF

Utilisez la requête suivante pour afficher les articles :

-- View articles 
SELECT
  [a].[ArticleId]
 ,[a].[Category]
 ,[a].[Author]
 ,[a].[Title]
 ,[a].[Published]
 ,[a].[Notes]
FROM dbo.Article A

Exigence commerciale de masquer les noms des auteurs

Supposons maintenant que vous receviez une exigence commerciale indiquant que les noms d'auteurs doivent être masqués en raison de la sensibilité de ces informations. La meilleure façon de répondre à cette exigence commerciale consiste à masquer la colonne Nom à l'aide de DDM.

Masquage des noms d'auteurs

Nous allons modifier le tableau afin d'ajouter la fonction de masquage des données comme suit :

-- Masking Author column
ALTER TABLE Article
ALTER COLUMN [Author] varchar(50) MASKED WITH (FUNCTION = 'default()');

Vérification de l'état du masquage

Vous pouvez vérifier l'état du masquage dynamique des données à tout moment en utilisant le script T-SQL suivant fourni dans la documentation Microsoft :

-- Checking dynamic data masking status
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;

La sortie nous montre quelles colonnes ont été masquées avec succès :

Vérification des données

Vérifiez maintenant les données en interrogeant les 5 premiers enregistrements de la table où nous avons appliqué le masquage :

-- View top 5 artices records
SELECT TOP 5
  [a].[ArticleId]
 ,[a].[Category]
 ,[a].[Author]
 ,[a].[Title]
 ,[a].[Published]
 ,[a].[Notes]
FROM dbo.Article A
ORDER BY a.ArticleId

La sortie ne semble pas nous montrer le résultat attendu :

Comme vous pouvez le voir, malgré le fait que nous ayons masqué la colonne Auteur, elle affiche toujours ses valeurs réelles. La raison de ce comportement est que le compte que nous avons utilisé pour appliquer le masquage dynamique des données a des privilèges élevés et c'est pourquoi les données masquées sont visibles dans leur forme d'origine lorsque nous interrogeons la table à l'aide du compte actuel.
La solution est pour créer un nouvel utilisateur avec l'autorisation de sélection.

Création d'un utilisateur avec l'autorisation Sélectionner sur la table

Créons maintenant un nouvel utilisateur de base de données sans connexion ayant uniquement la permission Select sur la table Article comme suit :

-- Create ArticleUser to have Select access to Article table
CREATE USER ArticleUser WITHOUT LOGIN;  
GRANT SELECT ON Article TO ArticleUser;

Affichage des 5 meilleurs articles en tant qu'utilisateur d'article

Ensuite, exécutez l'instruction Select pour obtenir les 5 meilleurs articles à l'aide de l'utilisateur ArticleUser nouvellement créé avec l'autorisation de sélection uniquement :

-- Execute SELECT Article as ArtilceUser
EXECUTE AS USER = 'ArticleUser';  

-- View artices 
SELECT TOP 5
  [a].[ArticleId]
 ,[a].[Category]
 ,[a].[Author]
 ,[a].[Title]
 ,[a].[Published]
 FROM dbo.Article A
ORDER BY a.ArticleId

-- Revert the User back to what user it was before
REVERT;

Toutes nos félicitations! Vous avez réussi à masquer la colonne Auteur conformément aux exigences.

Suppression d'une colonne masquée

Vous pouvez supprimer le masquage dynamique des données sur la colonne que vous avez déjà appliquée en exécutant simplement la commande T-SQL suivante :

-- Removing dynamic data masking on Author column
ALTER TABLE Article   
ALTER COLUMN Author DROP MASKED;

Veuillez rester en contact car une utilisation plus avancée du masquage dynamique des données est en cours dans le prochain article.

Choses à faire

Maintenant que vous pouvez masquer les colonnes d'une table dans une base de données, essayez les choses suivantes pour améliorer vos compétences :
1. Veuillez essayer de masquer la colonne Catégorie dans l'exemple de base de données.
2. Veuillez essayer de créer une table Auteur avec les colonnes AuthorId, Name et Email, puis transmettez AuthorId comme clé étrangère dans la table Article, puis appliquez un masquage dynamique des données sur les colonnes Name et Email de la table Author en créant un utilisateur 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