Tento článek poskytuje vysokou úroveň porozumění dynamickému maskování dat na serveru SQL Server spolu s jeho případy použití, osvědčenými postupy a bezpečnostními důsledky pro pokročilé uživatele SQL (včetně vývojářů a testerů). Čtenáři tohoto článku se navíc seznámí s aplikací různých typů dynamického maskování dat. Článek také zdůrazňuje důležitost použití maskování dat na pokročilé úrovni v každodenních úlohách vývoje a testování databází.
Předpoklady
Nejprve si projdeme předpoklady pro tento článek.
Znalost T-SQL
Tento článek předpokládá, že čtenáři jsou dobře obeznámeni se skripty T-SQL a mohou pohodlně psát a spouštět dotazy SQL pro prohlížení a manipulaci s databázemi SQL.
Základy dynamického maskování dat
Tento článek také předpokládá, že čtenáři znají základní koncepty dynamického maskování dat v SQL Server. Pokud jste to ještě neudělali, přečtěte si článek Maskování dat v SQL Server pro začátečníky, abyste se seznámili se základy dynamického maskování dat.
Kompatibilita databáze Azure SQL nebo SQL Server 2016
Funkce dynamického maskování dat je k dispozici v SQL Server 2016 až SQL Server 2019, takže důrazně doporučujeme mít jednu z následujících možností:
1. Azure SQL databáze
2. SQL Server 2016 nainstalovaný lokálně nebo vzdáleně.
Nastavení ukázkové databáze
Nezapomeňte prosím vytvořit ukázkovou databázi pomocí následujícího skriptu T-SQL kompatibilního s SQL Server 2016 nebo jako Azure SQL Database, pokud chcete postupovat podle návodu v tomto článku:
-- Vytvořit ukázkovou databázi ITSalesV2CREATE DATABASE ITSalesV2;GOUSE [ITSalesV2]-- (2) Vytvořit tabulku měsíčního prodejeCREATE TABLE [dbo].[MonthlySale]( [SaleId] [int] IDENTITY(1,1) NENÍ NULL PRIMÁRNÍ KLÍČ, [Datum prodeje] [datetime2](7) NULL, [Zákazník] [varchar](50) NULL, [E-mail] [varchar] (200) NULL, [Produkt] [varchar](150) NULL, [Cena celkem] [desítkové] (10, 2) NULL,)-- (2) Vyplnit tabulku měsíčního prodejeSET IDENTITY_INSERT [dbo].[MonthlySale] ONINSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Zákazník],[E-mail] , [Produkt], [TotalPrice]) VALUES (1, N'2019-05-01 00:00:00', N'Asif', N'[email protected]', N'Dell Laptop', CAST(300,00 JAKO Desetinné číslo(10, 2)))VLOŽTE DO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[E-mail], [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],[E-mail], [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 ], [Datum prodeje], [Zákazník],[E-mail], [Produkt], [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],[E-mail], [Produkt ], [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)))VLOŽTE DO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[E-mail], [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],[E-mail], [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] , [Zákazník], [E-mail], [Produkt], [TotalPrice]) VALUES (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],[E-mail], [Produkt], [TotalPrice]) VALUES (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],[E-mail], [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
Kontrola dat
Zkontrolujte nově vytvořenou a naplněnou ukázkovou databázi ITSalesV2 spuštěním následujícího skriptu:
-- Zobrazení údajů o měsíčním prodejiSELECT s.SaleId ,s.SellingDate ,s.Customer ,s.Email ,s.Product ,s.TotalPriceFROM dbo.MonthlySale s
Výstup je následující:
Vytvoření neprivilegovaného uživatele
Vytvořte prosím neprivilegovaného uživatele bez přihlášení s pouze oprávněním SELECT v tabulce MonthlySale, který uvidí maskovaná data jako nezbytnou podmínku tohoto článku. K tomu použijte následující skript:
-- Vytvořit DataUser pro výběr přístupu k tabulce MonthlySaleCREATE USER DataUser BEZ PŘIHLÁŠENÍ; UDĚLEJTE VÝBĚR měsíčního prodeje uživateli DataUser;
Vytvoření procedury pro kontrolu stavu maskování
Tento článek také předpokládá, že ve vzorové databázi je uložená procedura, která nám ukazuje stav dynamického maskování dat sloupců v tabulkách databáze:
-- Uložená procedura pro kontrolu stavu dynamického maskování datCREATE PROC ShowMaskingStatusASBEGINSET NOCOUNT ON SELECT c.name, tbl.name jako table_name, c.is_masked, c.masking_function FROM sys.masked_columns AS c JOIN sys.tables AS tbl ON c. [id_objektu] =tbl.[id_objektu] WHERE is_masked =1;END
Typy dynamického maskování dat
Na serveru SQL Server existují čtyři běžné typy dynamického maskování dat:
1. Výchozí datové masky
2. Částečné datové masky
3. Náhodné datové masky
4. Vlastní maska(y) dat řetězce
Nyní implementujeme všechny čtyři běžné typy dynamického maskování dat.
Implementace výchozího maskování dat
Výchozí maskování dat zcela skryje sloupec před neoprávněným uživatelem tím, že zakryje všechny hodnoty sloupce speciálním znakem, takže je velmi obtížné uhodnout obsah sloupce.
Obchodní požadavky
Nyní předpokládejme, že jste obdrželi obchodní požadavek, který uvádí, že e-mailové adresy zákazníků by měly být zcela skryty (maskovány) kvůli citlivosti těchto informací.
Nejlepším způsobem, jak splnit tento obchodní požadavek, je zamaskovat sloupec Email pomocí dynamického maskování dat (DDM).
Výchozí maskování dat e-mailové adresy
Změníme tabulku pro maskování e-mailových adres následovně:
--Výchozí dynamické maskování dat sloupce E-mail ALTER TABLE Měsíční prodejALTER COLUMN Email varchar(200) MASKED WITH (FUNCTION ='default()');
Kontrola stavu maskování
Zkontrolujte stav dynamického maskování dat pomocí následující uložené procedury založené na skriptu T-SQL, na který odkazuje dokumentace společnosti Microsoft:
-- Kontrola stavu maskování dynamických datEXEC ShowMaskingStatus
Výstup nám ukazuje, které sloupce byly úspěšně maskovány:
Zobrazení sloupce e-mailů jako uživatel dat
Dále spusťte příkaz Select a prohlédněte si měsíční tržby (tabulku) jako uživatel s nízkým oprávněním s názvem DataUser, který má v tabulce pouze oprávnění k výběru následovně:
-- Proveď SELECT jako DataUserEXECUTE AS USER ='DataUser'; -- Zobrazení měsíčního prodeje SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product od dbo.MonthlySale s-- Vraťte uživatele zpět na uživatele, kterým byl před REVERT;
Výstup je následující:
Implementace maskování částečných dat
Částečné maskování dat, jak název napovídá, částečně skryje sloupec před zobrazením neoprávněným uživatelem a zakryje určitou část hodnot sloupce speciálními znaky, díky čemuž je obsah sloupce poněkud čitelný, ale přesto je obtížné jej uhodnout.
Obchodní požadavky
Nyní si vzpomeňte na obchodní požadavek, ve kterém jste byli požádáni, abyste částečně skryli jména zákazníků takovým způsobem, že zůstane viditelný pouze první znak jména. Nejlepším způsobem, jak splnit tento obchodní požadavek, je maskovat sloupec Zákazník pomocí částečného dynamického maskování dat.
Částečné maskování jmen zákazníků
Změníme tabulku tak, aby částečně maskovala sloupec Zákazník takto:
-- Částečné maskování dat jmen zákazníkůALTER TABLE MěsíčníprodejALTER SLOUPEC [Zákazník] PŘIDAT MASKOVANÉ S (FUNCTION ='partial(1,"XXXXXXX",0)')
Kontrola stavu maskování
Zkontrolujte stav maskování dynamických dat:
-- Kontrola stavu maskování dynamických datEXEC ShowMaskingStatus
Výstup nám ukazuje, které sloupce byly úspěšně maskovány:
Zobrazení sloupce Zákazník jako uživatel dat
Zobrazte tabulku jako testovací uživatel DataUser, který musí vidět maskovaná data:
-- Proveď SELECT jako DataUserEXECUTE AS USER ='DataUser'; -- Zobrazit měsíční tržby jako DataUserSELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product od dbo.MonthlySale s-- Vraťte uživatele zpět na uživatele, kterým byl před REVERT;Výstup je následující:
Implementace náhodného maskování dat
Náhodné maskování dat skryje sloupec náhodně před neoprávněným uživatelem tím, že zakryje sloupec na základě rozsahu hodnot, takže je velmi obtížné uhodnout obsah sloupce. Pamatujte, že náhodný typ maskování dat je použitelný pouze pro sloupce, které ukládají pouze čísla, a lze jej specifikovat poskytnutím rozsahu pro randomizaci.
Obchodní požadavky
Obdržíte obchodní požadavek, který uvádí, že cena produktu by měla být maskována náhodným rozsahem čísel, takže uživatelé s nízkými oprávněními nesmějí znát přesné ceny produktu z důvodu ochrany soukromí. Nejlepší způsob, jak splnit tuto obchodní specifikaci, je maskovat sloupec TotalPrice pomocí náhodného dynamického maskování dat.
Náhodné maskování dat ve sloupci TotalPrice
Změňte tabulku Měsíční prodej tak, aby maskovala TotalPrice náhodně takto:
--Náhodné dynamické maskování dat sloupce TotalPrice ALTER TABLE Měsíční prodejALTER SLOUPEC [TotalPrice] desítkové(10,2) MASKOVANÉ S (FUNCTION ='random(1, 12)')Kontrola stavu maskování
Zkontrolujte stav maskování dynamických dat spuštěním následující uložené procedury:
-- Kontrola stavu maskování dynamických datEXEC ShowMaskingStatusVýstup nám ukazuje, které sloupce byly úspěšně maskovány:
Zobrazení sloupce TotalPrice jako uživatele dat
Zobrazit tabulku jako DataUser nyní:
-- Proveď SELECT jako DataUserEXECUTE AS USER ='DataUser'; -- Zobrazení měsíčního prodeje SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice od dbo.MonthlySale s-- Vraťte uživatele zpět na uživatele, kterým byl před REVERT;Výstup je následující:
Upozorňujeme, že výstup se může u sloupce Maskovaná náhodná data lišit kvůli generování náhodných čísel.
Implementace maskování dat vlastního řetězce
Vlastní maskování dat řetězce, jak naznačuje jeho název, přidává vlastní znak ke skrytí sloupce tím, že je velmi obtížné uhodnout jeho obsah. Pamatujte, že vlastní maskování dat řetězce se používá ve spojení s částečným maskováním dat přizpůsobením znaku tak, aby maskoval skutečné hodnoty sloupce. Jinými slovy, vlastní maskování dat řetězců je vylepšená forma částečného maskování dat.
Obchodní požadavky
Zvažte obchodní požadavek, aby se ve sloupci Produkt zobrazoval pouze první a poslední znak, zatímco ostatní znaky by měly být skryté nebo maskované pomlčkami (-). Nejlepší způsob, jak splnit tuto obchodní specifikaci, je maskovat sloupec Produkt pomocí částečného dynamického maskování dat požadovaným vlastním řetězcem.
Maskování prodejních dat pomocí řetězce zákazníků
Změňte tabulku Měsíční prodej tak, aby maskovala sloupec Produkt takto:
--Vlastní řetězcové dynamické maskování dat sloupce Produkt ALTER TABLE Měsíční prodejALTER SLOUPEC [Produkt] PŘIDAT MASKOVANÉ S (FUNCTION ='partial(1,"---",1)')Kontrola stavu maskování
V tomto okamžiku se vyplatí zkontrolovat stav dynamického maskování dat pomocí následujícího skriptu:
-- Kontrola stavu maskování dynamických datEXEC ShowMaskingStatusVýstup zobrazuje všechny sloupce, na které bylo úspěšně aplikováno dynamické maskování dat, jak je znázorněno níže:
Zobrazení sloupce produktu jako uživatel dat
Zobrazit tabulku jako DataUser nyní:
-- Proveď SELECT jako DataUserEXECUTE AS USER ='DataUser'; -- Zobrazení měsíčního prodeje SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice od dbo.MonthlySale s-- Vraťte uživatele zpět na uživatele, kterým byl před REVERT;Výstup je následující:
Gratulujeme! Úspěšně jste implementovali všechny čtyři maskovací techniky.
Prostudujte si článek Maskování dat v SQL Server pro začátečníky, kde najdete informace o použití typů maskování dat.Doporučené postupy
Pamatujte prosím na následující věci:
1. Dynamické maskování dat nechrání ani nešifruje data sloupce, takže by se k tomuto účelu nemělo používat.
2. Potenciální uživatel, který má vidět maskovaná data, musí mít velmi omezený přístup k zobrazení dat a vůbec by neměl dostat povolení k aktualizaci k využívání dat.
3. Potenciální uživatel, i když má pouze oprávnění SELECT, může spouštět vyčerpávající dotazy k uhodnutí správné hodnoty, takže si na to dejte pozor.
4. Můžete také použít ALTER COLUMN E-mail ADD MASKED WITH (FUNCTION ='email()') k maskování sloupců e-mailů namísto použití výchozího dynamického maskování.
5. Pomocí maskování dat vlastního řetězce můžete v přehledu transakcí skrýt číslo debetní karty tím, že zobrazíte pouze poslední dvě nebo čtyři číslice, jak jste mohli vidět na nákupních účtenkách.Co dělat
Nyní, když můžete implementovat všechny čtyři typy maskování, vyzkoušejte následující věci, abyste své dovednosti dále zlepšili:
1. Vytvořte prosím vzorovou databázi podle návodu v článku Vývoj přehledů SSRS v jednoduchých termínech a poté vytvořte zprávu SSRS, která zobrazuje pouze první znak jmen autorů tím, že zbytek skryje pomocí částečného maskování dat.
2. Zkuste prosím vytvořit ukázkovou databázi uvedenou v článku Vytváření a nasazení více verzí databáze prostřednictvím snímků schématu a poté vytvořte testovacího uživatele s názvem Student a použijte vhodné dynamické maskování dat, abyste skryli známky všech studentů pro tohoto testovacího uživatele.
3. Zkuste prosím vytvořit a odstranit dynamické maskování dat, abyste zajistili, že můžete úspěšně přidávat a odstraňovat dynamické maskování dat v tabulce SQL.