Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dynamiczne maskowanie danych w SQL Server dla początkujących

Artykuł przedstawia podstawy dynamicznego maskowania danych (DDM) w SQL Server wraz z jego omówieniem popartym prostym przykładem implementacji maskowania danych. Dodatkowo czytelnicy zapoznają się z zaletami dynamicznego maskowania danych. W niniejszym dokumencie podkreślono również znaczenie maskowania danych w codziennych zadaniach związanych z tworzeniem baz danych, gdy niektóre pola muszą być maskowane ze względu na ich wrażliwy charakter, aby zachować zgodność ze standardowymi praktykami.

Informacje o maskowaniu danych

Przejdźmy przez podstawowe koncepcje maskowania danych i dostępność tej funkcji w SQL Server.

Prosta definicja

Maskowanie danych to metoda całkowitego lub częściowego ukrywania danych, co utrudnia rozpoznanie lub zrozumienie danych po zastosowaniu maskowania.

Definicja Microsoft

Zgodnie z dokumentacją Microsoft, dynamiczne maskowanie danych (DDM) ogranicza narażenie na wrażliwe dane, maskując je dla nieuprzywilejowanych użytkowników.

Co to są dane wrażliwe

Przez dane wrażliwe rozumiemy wszelkie dane, które zawierają informacje prywatne, umożliwiające identyfikację, finansowe lub dotyczące bezpieczeństwa, które w przypadku ujawnienia mogą zostać niewłaściwie wykorzystane lub zaszkodzić reputacji organizacji.

Przykład danych wrażliwych

Dobrym przykładem danych wrażliwych jest numer karty debetowej przechowywany w bazie danych, która musi być chroniona przed nieautoryzowanym użyciem. Innym dobrym przykładem danych wrażliwych jest osobisty adres e-mail, który umożliwia łatwą identyfikację osoby.

Nieuprzywilejowani użytkownicy

Każdy użytkownik bazy danych, który nie ma dostępu do poufnych danych, jest uważany za użytkownika nieuprzywilejowanego.

Maskowanie danych dynamicznych (DDM)

Funkcja maskowania danych obsługiwana przez SQL Server jest znana jako dynamiczne maskowanie danych, które w dokumentacji firmy Microsoft jest również określane jako DDM. Innymi słowy, Microsoft odnosi się do maskowania danych jako dynamicznego maskowania danych w SQL Server.

Kompatybilność

Zgodnie z dokumentacją firmy Microsoft funkcja dynamicznego maskowania danych jest obsługiwana przez następujące wersje programu SQL Server:
1. SQL Server 2016 i nowsze wersje
2. Baza danych Azure SQL
3. Hurtownia danych Azure SQL
Więc jeśli nie zacząłeś jeszcze korzystać z baz danych Azure SQL, potrzebujesz minimum SQL Server 2016, aby korzystać z funkcji dynamicznego maskowania danych.

Konfigurowanie dynamicznego maskowania danych

Dynamiczne maskowanie danych można skonfigurować za pomocą poleceń T-SQL.
Implementacja dynamicznego maskowania danych odbywa się za pomocą skryptów T-SQL, aby uniemożliwić nieautoryzowanym użytkownikom przeglądanie poufnych danych.

Zalety dynamicznego maskowania danych

Na koniec omówimy kilka kluczowych korzyści z dynamicznego maskowania danych, ale wcześniej chciałbym zapytać początkujących SQL, a nie specjalistów SQL, jakie są korzyści z ograniczeń integralności?
Rozważmy przykład unikalnego ograniczenie klucza, które zapewnia, że ​​kolumna, w której jest stosowane, ma różne (bez zduplikowanych) wartości. Jeśli mogę wymusić różne wartości kolumn w momencie wprowadzania danych w mojej aplikacji typu front-end, dlaczego mam zawracać sobie głowę wymuszaniem tego za pośrednictwem bazy danych przez zastosowanie ograniczenia unikatowego klucza?
Odpowiedzią jest zapewnienie reguł (ograniczenia integralności ) pozostają spójne i są kontrolowane centralnie. Muszę to zrobić na poziomie bazy danych, w przeciwnym razie będę musiał napisać kod, aby wymusić unikalne wartości we wszystkich obecnych i przyszłych aplikacjach, które uzyskują dostęp do bazy danych.
To samo dotyczy dynamicznego maskowania danych, ponieważ definiuje ono maska ​​na kolumnie na poziomie bazy danych, dzięki czemu nie ma potrzeby wykonywania żadnego dodatkowego maskowania (kodu) przez aplikacje uzyskujące dostęp do bazy danych.

Dynamiczne maskowanie danych ma następujące zalety w porównaniu z tradycyjnymi podejściami:
1. Dynamiczne maskowanie danych implementuje scentralizowaną politykę ukrywania lub zmieniania poufnych danych w bazie danych, która jest dziedziczona przez dowolną aplikację, która chce uzyskać dostęp do danych.
2. Dynamiczne maskowanie danych w SQL Server może pomóc w zarządzaniu użytkownikami z uprawnieniami do wyświetlania poufnych danych oraz tymi, którzy nie są do nich upoważnieni.
3. Ma prostą implementację w postaci skryptu T-SQL.

Wdrażanie dynamicznego maskowania danych

Zanim zaimplementujemy dynamiczne maskowanie danych, musimy zrozumieć typy dynamicznego maskowania danych, które można zastosować do kolumny w tabeli bazy danych SQL lub Azure SQL.

Rodzaje masek danych

Istnieją cztery rodzaje masek danych, które możemy zastosować do kolumny:
1. Domyślne maski danych
2. Częściowe maski danych
3. Maski danych losowych
4. Niestandardowe maski danych
W tym artykule skupimy się na domyślnym typie maskowania danych.

Stosowanie dynamicznych masek danych

Dynamiczne maski danych można zastosować do kolumny tabeli w następujący sposób:
1. Podczas tworzenia nowej tabeli
2. Zmiana już utworzonej tabeli w celu zastosowania maskowania danych do jej kolumn

Konfiguruj przykładową bazę danych

Stwórzmy przykładową bazę danych o nazwie SQLDevBlogV5 uruchamiając następujący skrypt 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

Użyj następującego zapytania, aby wyświetlić artykuły:

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

Wymaganie biznesowe dotyczące maskowania nazwisk autorów

Załóżmy teraz, że otrzymujesz wymaganie biznesowe, które mówi, że nazwiska autorów powinny być maskowane ze względu na wrażliwość tych informacji. Najlepszym sposobem spełnienia tego wymagania biznesowego jest zamaskowanie kolumny Nazwa za pomocą DDM.

Maskowanie nazwisk autorów

Zmodyfikujemy tabelę, aby dodać funkcję maskowania danych w następujący sposób:

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

Sprawdzanie statusu maskowania

Stan dynamicznego maskowania danych można sprawdzić w dowolnym momencie za pomocą następującego skryptu T-SQL podanego w dokumentacji firmy 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;

Dane wyjściowe pokazują nam, które kolumny zostały pomyślnie zamaskowane:

Sprawdzanie danych

Teraz sprawdź dane, odpytując 5 najlepszych rekordów tabeli, w której zastosowaliśmy maskowanie:

-- 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

Wydaje się, że dane wyjściowe nie pokazują oczekiwanego wyniku:

Jak widać, mimo że zamaskowaliśmy kolumnę Autor, nadal pokazuje jej rzeczywiste wartości. Powodem tego zachowania jest to, że konto, którego użyliśmy do zastosowania dynamicznego maskowania danych, ma podwyższone uprawnienia i dlatego zamaskowane dane są widoczne w swojej oryginalnej formie, gdy wysyłamy zapytanie do tabeli przy użyciu bieżącego konta.
Rozwiązanie to aby utworzyć nowego użytkownika z uprawnieniem Select.

Tworzenie użytkownika z uprawnieniem Wybierz w tabeli

Stwórzmy teraz nowego użytkownika bazy danych bez loginu, który ma tylko uprawnienie Select w tabeli Artykuł w następujący sposób:

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

Wyświetlanie 5 najlepszych artykułów jako użytkownik artykułu

Następnie wykonaj instrukcję Select, aby uzyskać 5 najlepszych artykułów przy użyciu nowo utworzonego użytkownika ArticleUser tylko z uprawnieniem Select:

-- 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;

Gratulacje! Udało Ci się zamaskować kolumnę Autor zgodnie z wymaganiami.

Upuszczanie zamaskowanej kolumny

Możesz usunąć dynamiczne maskowanie danych na kolumnę, którą wcześniej zastosowałeś, po prostu wydając następujące polecenie T-SQL:

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

Prosimy o pozostawanie w kontakcie, ponieważ w następnym artykule wprowadzamy bardziej zaawansowane wykorzystanie dynamicznego maskowania danych.

Rzeczy do zrobienia

Teraz, gdy możesz maskować kolumny tabeli w bazie danych, spróbuj następujących rzeczy, aby jeszcze bardziej poprawić swoje umiejętności:
1. Spróbuj zamaskować kolumnę Kategoria w przykładowej bazie danych.
2. Spróbuj utworzyć tabelę Author z kolumnami AuthorId, Name i Email, a następnie przekaż AuthorId jako klucz obcy w tabeli Article, a następnie zastosuj dynamiczne maskowanie danych w kolumnach Name i Email w tabeli Author, tworząc użytkownika testowego
3. Spróbuj utworzyć i usunąć dynamiczne maskowanie danych, aby zapewnić pomyślne dodawanie i usuwanie dynamicznego maskowania danych w tabeli SQL


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak naprawić komunikat „Serwer nie jest skonfigurowany dla RPC” Msg 7411 przy użyciu T-SQL?

  2. Proaktywne kontrole kondycji programu SQL Server, część 5:Statystyka oczekiwania

  3. Jak odpytywać wartości z węzłów XML?

  4. Jak mogę połączyć się z SQL Server przy użyciu zintegrowanych zabezpieczeń ze sterownikiem JDBC?

  5. Nie można użyć predykatu CONTAINS lub FREETEXT w tabeli lub widoku indeksowanym, ponieważ nie jest indeksowany pełnotekstowo