Článek představuje základy dynamického maskování dat (DDM) v SQL Server spolu s jeho přehledem podpořeným jednoduchým příkladem implementace maskování dat. Kromě toho se čtenáři seznámí s výhodami dynamického maskování dat. Tento dokument také zdůrazňuje důležitost maskování dat v každodenních úlohách vývoje databází, kdy některá pole musí být maskována kvůli jejich citlivé povaze, aby byla v souladu se standardními postupy.
O maskování dat
Pojďme si projít základní koncepty maskování dat a dostupnost této funkce v SQL Server.
Jednoduchá definice
Maskování dat je metoda úplného nebo částečného skrytí dat, což ztěžuje rozpoznání nebo pochopení dat po použití maskování.
Definice společnosti Microsoft
Podle dokumentace společnosti Microsoft omezuje dynamické maskování dat (DDM) vystavení citlivým datům jejich maskováním pro neprivilegované uživatele.
Co jsou to citlivá data
Citlivými údaji rozumíme jakákoli data, která obsahují soukromé, osobně identifikovatelné, finanční nebo bezpečnostní informace, které v případě odhalení mohou být zneužity nebo poškodit pověst organizace.
Příklad citlivých dat
Dobrým příkladem citlivých údajů je číslo debetní karty uložené v databázi, která musí být chráněna před jakýmkoli neoprávněným použitím. Dalším dobrým příkladem citlivých údajů je osobní e-mailová adresa, která může snadno identifikovat osobu.
Neprivilegovaní uživatelé
Každý uživatel databáze, který nemá povoleno vidět citlivá data, je považován za neprivilegovaného uživatele.
Dynamické maskování dat (DDM)
Funkce maskování dat podporovaná serverem SQL je známá jako dynamické maskování dat v dokumentaci společnosti Microsoft také označováno jako DDM. Jinými slovy, Microsoft označuje maskování dat jako dynamické maskování dat v SQL Server.
Kompatibilita
Podle dokumentace společnosti Microsoft je funkce dynamického maskování dat podporována následujícími verzemi serveru SQL Server:
1. SQL Server 2016 a novější verze
2. Azure SQL Database
3. Azure SQL Data Warehouse
Pokud jste tedy ještě nezačali používat Azure SQL databáze, pak k použití funkce dynamického maskování dat potřebujete minimálně SQL Server 2016.
Konfigurace dynamického maskování dat
Dynamické maskování dat lze konfigurovat jednoduše pomocí příkazů T-SQL.
Implementace dynamického maskování dat se provádí pomocí skriptování T-SQL, aby se zabránilo neoprávněným uživatelům v prohlížení citlivých dat.
Výhody dynamického maskování dat
Nakonec si projdeme některé klíčové výhody dynamického maskování dat, ale předtím bych se rád zeptal začátečníků SQL, nikoli profesionálů SQL, jaké jsou výhody omezení integrity?
Podívejme se na příklad jedinečného klíčové omezení, které zajišťuje, že sloupec, na který je aplikován, má odlišné (žádné duplicitní) hodnoty. Pokud mohu vynutit odlišné hodnoty sloupců v okamžiku zadávání dat v mé front-endové aplikaci, proč bych se měl obtěžovat vynucovat to prostřednictvím databáze použitím jedinečného omezení klíče?
Odpovědí je zajistit pravidla (omezení integrity ) zůstávají konzistentní a jsou řízeny centrálně. Musím to udělat na úrovni databáze, jinak možná budu muset napsat kód pro vynucení jedinečných hodnot ve všech současných a všech nadcházejících aplikacích, které přistupují k databázi.
Totéž platí pro dynamické maskování dat, protože definuje maska na sloupec na úrovni databáze, takže není potřeba provádět žádné další maskování (kód) aplikacemi přistupujícími k databázi.
Dynamické maskování dat má oproti tradičním přístupům následující výhody:
1. Dynamické maskování dat implementuje centralizovanou politiku skrývání nebo změny citlivých dat v databázi, kterou zdědí jakákoli aplikace, která si přeje k datům přistupovat.
2. Dynamické maskování dat na serveru SQL Server může pomoci spravovat uživatele s oprávněními vidět citlivá data a uživatele, kteří k tomu nemají oprávnění.
3. Má jednoduchou implementaci ve formě T-SQL skriptu.
Implementace dynamického maskování dat
Než implementujeme dynamické maskování dat, musíme porozumět typům dynamického maskování dat, které lze použít na sloupec v tabulce SQL nebo Azure SQL Database.
Typy datových masek
Existují čtyři typy datových masek, které můžeme použít na sloupec:
1. Výchozí datové masky
2. Částečné datové masky
3. Náhodné datové masky
4. Vlastní masky dat
V tomto článku se zaměříme na výchozí typ maskování dat.
Použití dynamických datových masek
Dynamické datové masky lze aplikovat na sloupec tabulky následujícími způsoby:
1. Při vytváření nové tabulky
2. Úprava již vytvořené tabulky za účelem použití maskování dat na její sloupce (sloupce)
Nastavení ukázkové databáze
Vytvořme ukázkovou databázi s názvem SQLDevBlogV5 spuštěním následujícího skriptu T-SQL:
-- 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
K zobrazení článků použijte následující dotaz:
-- View articles SELECT [a].[ArticleId] ,[a].[Category] ,[a].[Author] ,[a].[Title] ,[a].[Published] ,[a].[Notes] FROM dbo.Article A
Obchodní požadavek na maskování jmen autorů
Nyní předpokládejme, že obdržíte obchodní požadavek, který uvádí, že jména autorů by měla být maskována kvůli citlivosti těchto informací. Nejlepším způsobem, jak splnit tento obchodní požadavek, je maskovat sloupec Název pomocí DDM.
Maskování jmen autorů
Změníme tabulku, abychom přidali funkci maskování dat následovně:
-- Masking Author column ALTER TABLE Article ALTER COLUMN [Author] varchar(50) MASKED WITH (FUNCTION = 'default()');
Kontrola stavu maskování
Stav maskování dynamických dat můžete kdykoli zkontrolovat pomocí následujícího skriptu T-SQL uvedeného v dokumentaci společnosti 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;
Výstup nám ukazuje, které sloupce byly úspěšně maskovány:
Kontrola dat
Nyní zkontrolujte data dotazem na prvních 5 záznamů tabulky, kde jsme použili maskování:
-- 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
Zdá se, že výstup nám neukazuje očekávaný výsledek:
Jak můžete vidět, přestože jsme sloupec Autor zamaskovali, stále zobrazuje své skutečné hodnoty. Důvodem tohoto chování je, že účet, který jsme použili k aplikaci dynamického maskování dat, má zvýšená oprávnění, a proto jsou maskovaná data viditelná ve své původní podobě, když se dotazujeme na tabulku pomocí aktuálního účtu.
Řešení je pro vytvoření nového uživatele s oprávněním Vybrat.
Vytvoření uživatele s oprávněním Vybrat v tabulce
Nyní vytvoříme nového uživatele databáze bez přihlášení, který bude mít pouze oprávnění Vybrat v tabulce Článek následovně:
-- Create ArticleUser to have Select access to Article table CREATE USER ArticleUser WITHOUT LOGIN; GRANT SELECT ON Article TO ArticleUser;
Zobrazení 5 nejlepších článků jako uživatel článku
Dále spusťte příkaz Select, abyste získali 5 nejlepších článků pomocí nově vytvořeného uživatele ArticleUser pouze s oprávněním vybrat:
-- 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;
Gratulujeme! Úspěšně jste zamaskovali sloupec Autor podle požadavku.
Vypuštění maskovaného sloupce
Dynamické maskování dat můžete vypustit na sloupec, který jste použili dříve, jednoduše zadáním následujícího příkazu T-SQL:
-- Removing dynamic data masking on Author column ALTER TABLE Article ALTER COLUMN Author DROP MASKED;
Zůstaňte prosím v kontaktu, protože pokročilejší použití dynamického maskování dat je na cestě v příštím článku.
Co dělat
Nyní, když můžete maskovat sloupce tabulky v databázi, vyzkoušejte následující věci, abyste své dovednosti dále zlepšili:
1. Zkuste prosím maskovat sloupec Kategorie ve vzorové databázi.
2. Zkuste prosím vytvořit tabulku Author se sloupci AuthorId, Name a Email a poté předejte AuthorId jako cizí klíč v tabulce Article a poté použijte dynamické maskování dat na sloupce Name a Email v tabulce Author vytvořením testovacího uživatele
3. Zkuste prosím vytvořit a zrušit dynamické maskování dat, abyste zajistili, že můžete úspěšně přidávat a odstraňovat dynamické maskování dat v tabulce SQL