Тази статия дава разбиране на високо ниво за динамичното маскиране на данни в SQL Server, заедно с неговите случаи на употреба, най-добри практики и последици за сигурността за напреднали потребители на SQL (включително разработчици и тестери). Освен това, читателите на тази статия ще се запознаят с прилагането на различни видове динамично маскиране на данни. Статията също така подчертава значението на използването на разширено ниво на маскиране на данни в ежедневните задачи за разработване и тестване на бази данни.
Предварителни условия
Нека първо преминем през предпоставките за тази статия.
Познаване на T-SQL
Тази статия предполага, че читателите са добре запознати с T-SQL скриптовете и могат удобно да пишат и изпълняват SQL заявки, за да преглеждат и манипулират SQL базите данни.
Основи на динамичното маскиране на данни
Тази статия също предполага, че читателите познават основните концепции за динамично маскиране на данни в SQL Server. Моля, вижте статията Маскиране на данни в SQL Server за начинаещи, за да се запознаете с основите на динамичното маскиране на данни, ако все още не сте го направили.
Съвместимост на база данни на Azure SQL или SQL Server 2016
Функцията за динамично маскиране на данни е налична в SQL Server 2016 до SQL Server 2019, така че силно се препоръчва да имате едно от следните:
1. Azure SQL база данни
2. SQL Server 2016, инсталиран локално или отдалечено.
Настройване на примерна база данни
Моля, не забравяйте да създадете примерна база данни, като използвате следния T-SQL скрипт, съвместим със SQL Server 2016 или като Azure SQL база данни, ако искате да следвате инструкциите в тази статия:
-- Създаване на примерна база данни ITSalesV2CREATE DATABASE ITSalesV2;GOUSE [ITSalesV2]-- (2) Създаване на таблица MonthlySaleCREATE TABLE [dbo].[MonthlySale]( [SaleId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, [Дата на продажба] [datetime2](7) NULL, [Клиент] [varchar](50) NULL, [Имейл] [varchar] (200) NULL, [Продукт] [varchar](150) NULL, [Обща цена] [десетична] (10, 2) NULL,)-- (2) Попълване на месечна таблица за продажбаSET IDENTITY_INSERT [dbo].[MonthlySale] ONINSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer], [Email] , [Продукт], [Обща цена]) VALUES (1, N'2019-05-01 00:00:00', N'Asif', N'[email protected]', N'Dell Laptop', CAST(300,00 КАТО десетичен(10, 2)))ВМЕСЕТЕ В [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) СТОЙНОСТИ (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].[ Месечна разпродажба] ([SaleId], [SellingDate], [Клиент], [Имейл], [Продукт], [Обща цена]) СТОЙНОСТИ (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]) STONYS (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]) , [Клиент],[Имейл], [Продукт], [Обща цена]) СТОЙНОСТИ (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]) СТОЙНОСТИ (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]) STONYS (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
Проверка на данни
Проверете новосъздадената и попълнена примерна база данни ITSalesV2, като изпълните следния скрипт:
-- Преглед на месечните данни за продажби SELECT s.SaleId ,s.SellingDate ,s.Customer ,s.Email ,s.Product ,s.TotalPriceFROM dbo.MonthlySale s
Резултатът е както следва:
Създаване на непривилегирован потребител
Моля, създайте непривилегирован потребител, без да влизате, имайки само разрешение SELECT в таблицата MonthlySale, който ще вижда маскираните данни като предварително условие за тази статия. Използвайте следния скрипт, за да направите това:
-- Създайте DataUser, за да имате избор на достъп до таблицата MonthlySaleCREATE USER DataUser БЕЗ ВХОД; ПРЕДОСТАВЯ ИЗБОР НА МЕСЕЧНА ПРОДАЖБА НА DataUser;
Създаване на процедура за проверка на състоянието на маскиране
Тази статия също предполага, че има съхранена процедура в примерната база данни, която ни показва състоянието на динамично маскиране на данни на колоните в таблиците на базата данни:
-- Съхранена процедура за проверка на състоянието на динамично маскиране на данниCREATE PROC ShowMaskingStatusASBEGINSET NOCOUNT ON SELECT c.name, tbl.name като 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
Динамични типове маскиране на данни
Има четири често срещани типа динамично маскиране на данни в SQL Server:
1. Маска(и) за данни по подразбиране
2. Частична маска(и) на данни
3. Маска(и) на произволни данни
4. Персонализирана(и) маска(и) на низови данни
Сега ще внедрим всичките четири често срещани типа маскиране на динамични данни.
Внедряване на маскиране на данни по подразбиране
Маскирането на данни по подразбиране скрива колона напълно от неоторизиран потребител, като покрива всички стойности на колоните със специален знак, което прави много трудно отгатването на съдържанието на колоната.
Бизнес изискване
Сега да предположим, че получавате бизнес изискване, което гласи, че имейл адресите на клиентите трябва да бъдат напълно скрити (маскирани) поради чувствителността на тази информация.
Най-добрият начин да изпълните това бизнес изискване е да маскирате колоната Имейл използвайки динамично маскиране на данни (DDM).
Маскиране на данни по подразбиране на имейл адрес
Ще променим таблицата, за да маскираме имейл адресите, както следва:
--Динамично маскиране на данни по подразбиране на колоната Email ALTER TABLE MonthlySaleALTER COLUMN Email varchar(200) MASKED WITH (FUNCTION ='default()');
Проверка на състоянието на маскиране
Проверете състоянието на маскиране на динамични данни, като използвате следната съхранена процедура въз основа на T-SQL скрипт, посочен в документацията на Microsoft:
-- Проверка на състоянието на маскиране на динамични данни EXEC ShowMaskingStatus
Резултатът ни показва кои колони са маскирани успешно:
Преглед на колоната на имейл като потребител на данни
След това изпълнете оператор Select, за да видите месечните продажби (таблица) като потребител с ниски привилегии, наречен DataUser, който има само разрешение за избор на таблицата, както следва:
-- Изпълнете SELECT като DataUserEXECUTE AS USER ='DataUser'; -- Преглед на месечните продажби ИЗБЕРЕТЕ s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product от dbo.MonthlySale s-- Върнете потребителя към какъв потребител е бил преди REVERT;
Резултатът е както следва:
Внедряване на частично маскиране на данни
Частичното маскиране на данни, както подсказва името, частично скрива колона от преглеждането й от неоторизиран потребител, покривайки част от стойностите на колоните със специални знаци, което прави съдържанието на колоната донякъде четливо, но все пак трудно за отгатване.
Бизнес изискване
Сега помислете за бизнес изискване, в което сте били помолени да скриете частично името на клиентите по такъв начин, че да остане видим само първият знак от името. Най-добрият начин да изпълните това бизнес изискване е да маскирате колоната „Клиент“ с помощта на Частично динамично маскиране на данни.
Частично маскиране на данни на имена на клиенти
Ще променим таблицата, за да маскира частично колоната Клиент, както следва:
-- Частично маскиране на данни на имената на клиенти ALTER TABLE MonthlySaleALTER КОЛОНА [Клиент] ДОБАВЯНЕ, МАСКИРАН С (FUNCTION ='partial(1,"XXXXXXX",0)')
Проверка на състоянието на маскиране
Проверете състоянието на маскиране на динамични данни:
-- Проверка на състоянието на маскиране на динамични данни EXEC ShowMaskingStatus
Резултатът ни показва кои колони са маскирани успешно:
Преглед на клиентската колона като потребител на данни
Вижте таблицата като тестов потребител DataUser, който трябва да види маскираните данни:
-- Изпълнете SELECT като DataUserEXECUTE AS USER ='DataUser'; -- Преглеждайте месечните продажби като DataUserSELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product от dbo.MonthlySale s-- Връщане на потребителя към потребителя, който е бил преди REVERT;предварително>Резултатът е както следва:
Внедряване на произволно маскиране на данни
Случайното маскиране на данни скрива колона произволно от неоторизиран потребител, като покрива колона въз основа на диапазон от стойности, което прави много трудно отгатването на съдържанието на колоната. Моля, не забравяйте, че типът за маскиране на произволни данни е приложим само за колоните, които съхраняват само числа и може да бъде посочен чрез предоставяне на диапазон за рандомизиране.
Бизнес изискване
Получавате бизнес изискване, което гласи, че цената на продукта трябва да бъде маскирана с произволен диапазон от числа, така че потребителите с ниски привилегии да не трябва да знаят точните цени на продукта от съображения за поверителност. Най-добрият начин да изпълните тази бизнес спецификация е да маскирате колоната TotalPrice, като използвате произволно маскиране на динамични данни.
Маскиране на произволни данни на колоната TotalPrice
Променете таблицата MonthlySale, за да маскирате TotalPrice произволно, както следва:
--Случайно маскиране на динамични данни на колона TotalPrice ALTER TABLE MonthlySaleALTER COLUMN [TotalPrice] decimal(10,2) МАСКИРАНО С (FUNCTION ='random(1, 12)')Проверка на състоянието на маскиране
Моля, проверете състоянието на маскиране на динамични данни, като изпълните следната съхранена процедура:
-- Проверка на състоянието на маскиране на динамични данни EXEC ShowMaskingStatusРезултатът ни показва кои колони са били маскирани успешно:
Преглед на колоната TotalPrice като потребител на данни
Вижте таблицата като потребител на данни сега:
-- Изпълнете SELECT като DataUserEXECUTE AS USER ='DataUser'; -- Преглед на месечните продажби SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice от dbo.MonthlySale s-- Върнете потребителя обратно към потребителя, който е бил преди REVERT;Резултатът е както следва:
Моля, не забравяйте, че изходът може да се различава за колоната „Маскирани произволни данни“ поради генерирането на произволни числа.
Внедряване на персонализирано маскиране на низови данни
Персонализираното маскиране на низови данни, както подсказва името му, добавя персонализиран символ за скриване на колона, като прави много трудно отгатването на съдържанието му. Моля, не забравяйте, че маскирането на данни от потребителски низ се използва във връзка с частичното маскиране на данни чрез персонализиране на знака, за да маскира действителните стойности на колоните. С други думи, маскирането на данни от потребителски низ е подобрена форма на частично маскиране на данни.
Бизнес изискване
Помислете за бизнес изискване да показвате само първия и последния знак от колоната Продукт, докато останалите знаци трябва да бъдат скрити или маскирани с тирета (-). Най-добрият начин да изпълните тази бизнес спецификация е да маскирате колоната Продукт, като използвате Частично динамично маскиране на данни с необходимия персонализиран низ.
Маскиране на данни от клиентски низ на данни за продажба
Променете таблицата MonthlySale, за да маскирате колоната Продукт, както следва:
--Персонализиран низ за динамично маскиране на данни на колоната на Продукта ALTER TABLE MonthlySaleALTER COLUMN [Продукт] ДОБАВЯНЕ НА МАСКИРАНО С (FUNCTION ='partial(1,"---",1)')Проверка на състоянието на маскиране
Струва си да проверите състоянието на маскиране на динамични данни в този момент, като използвате следния скрипт:
-- Проверка на състоянието на маскиране на динамични данни EXEC ShowMaskingStatusРезултатът показва всички колони, върху които е приложено успешно динамично маскиране на данни, както е показано по-долу:
Преглед на колоната на продукта като потребител на данни
Вижте таблицата като потребител на данни сега:
-- Изпълнете SELECT като DataUserEXECUTE AS USER ='DataUser'; -- Преглед на месечните продажби SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice от dbo.MonthlySale s-- Върнете потребителя обратно към потребителя, който е бил преди REVERT;Резултатът е както следва:
Честито! Успешно приложихте и четирите техники за маскиране.
Моля, вижте статията Маскиране на данни в SQL Server за начинаещи да махнат приложените типове маскиране на данни.Най-добри практики
Моля, запомнете следните неща:
1. Динамичното маскиране на данни не защитава или криптира данните в колоната, така че не трябва да се използва за тази цел.
2. Потенциалният потребител, който трябва да види маскираните данни, трябва да има много ограничен достъп за преглед на данните и изобщо не трябва да му се дава разрешение за актуализиране, за да използва данните.
3. Потенциалният потребител дори с разрешение само SELECT може да изпълнява изчерпателни заявки, за да отгатне правилната стойност, така че, моля, внимавайте за това.
4. Можете също да използвате ALTER COLUMN Email ADD MASKED WITH (FUNCTION =’email()’), за да маскирате колоните на имейлите, вместо да използвате динамично маскиране по подразбиране.
5. Можете да използвате маскиране на данни за персонализиран низ, за да скриете номер на дебитна карта в отчет за транзакциите, като покажете само последните две или четири цифри, както може би сте виждали в разписките за пазаруване.Неща за правене
Сега, когато можете да приложите и четирите типа маскиране, моля, опитайте следните неща, за да подобрите допълнително уменията си:
1. Моля, създайте примерна база данни, като следвате инструкциите в статията Разработване на SSRS отчети с прости термини, последвано от разработване на SSRS отчет, който показва само първия знак от имената на автора, като скриете останалите чрез частично маскиране на данни.
2. Моля, опитайте да създадете примерна база данни, посочена в статията Създаване и внедряване на множество версии на база данни чрез моментни снимки на схема и след това създайте тестов потребител, наречен Student, и приложете подходящо динамично маскиране на данни, за да скриете оценките на всички ученици за този тестов потребител.
3. Моля, опитайте да създадете и премахнете динамично маскиране на данни, за да сте сигурни, че можете успешно да добавяте и премахвате динамично маскиране на данни в SQL таблица.