sql >> Databáze >  >> RDS >> Sqlserver

Dynamické maskování dat v SQL Server pro začátečníky

Č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


  1. Nelze jednoduše použít název tabulky PostgreSQL (vztah neexistuje)

  2. Oracle:Aktualizace sloupce tabulky pomocí ROWNUM ve spojení s klauzulí ORDER BY

  3. SQLite ALTER TABLE

  4. Bezpečnostní přístupy v datovém modelování. Část 4