Planowanie i implementowanie maski dynamicznej
Usługi Azure SQL Database, Azure SQL Managed Instance i Azure Synapse Analytics obsługują dynamiczne maskowanie danych. Dynamiczne maskowanie danych ogranicza ujawnianie danych poufnych, maskując je w przypadku użytkowników bez uprawnień.
Dynamiczne maskowanie danych pomaga zapobiegać nieautoryzowanemu dostępowi do poufnych danych, umożliwiając klientom wyznaczenie ilości poufnych danych do ujawnienia przy minimalnym wpływie na warstwę aplikacji. Jest to funkcja zabezpieczeń oparta na zasadach, która ukrywa poufne dane w zestawie wyników zapytania względem wyznaczonych pól bazy danych, podczas gdy dane w bazie danych nie są zmieniane.
Na przykład przedstawiciel usługi w centrum obsługi może zidentyfikować rozmówcę, potwierdzając kilka znaków swojego adresu e-mail, ale pełny adres e-mail nie powinien być ujawniany przedstawicielowi usługi. Regułę maskowania można zdefiniować, która maskuje wszystkie adresy e-mail w zestawie wyników dowolnego zapytania. W innym przykładzie można zdefiniować odpowiednią maskę danych w celu ochrony danych osobowych, aby deweloper mógł wysyłać zapytania do środowisk produkcyjnych w celu rozwiązywania problemów bez naruszania przepisów dotyczących zgodności.
Podstawy dynamicznego maskowania danych
Zasady dynamicznego maskowania danych można skonfigurować w witrynie Azure Portal, wybierając blok Dynamiczne maskowanie danych w obszarze Zabezpieczenia w okienku konfiguracji usługi SQL Database.
Zasady dynamicznego maskowania danych
- Użytkownicy SQL wykluczeni z maskowania — zestaw tożsamości użytkowników SQL lub identyfikatorów Entra firmy Microsoft, które pobierają niemaskowane dane w wynikach zapytania SQL. Użytkownicy z uprawnieniami administratora są zawsze wykluczani z maskowania i wyświetlają oryginalne dane bez żadnej maski.
- Reguły maskowania — zestaw reguł, które definiują wyznaczone pola do maskowania i używaną funkcję maskowania. Wyznaczone pola można zdefiniować przy użyciu nazwy schematu bazy danych, nazwy tabeli i nazwy kolumny.
- Funkcje maskowania — zestaw metod kontrolujących narażenie danych na różne scenariusze.
Funkcja | Opis | Przykłady |
---|---|---|
Wartość domyślna | Pełne maskowanie zgodnie z typami danych wyznaczonych pól. W przypadku typów danych ciągów użyj xxxx (lub mniej), jeśli rozmiar pola jest mniejszy niż 4 znaki (char, nchar, varchar, nvarchar, text, ntext). W przypadku typów danych liczbowych użyj wartości zerowej (bigint, bit, dziesiętny, int, pieniądze, liczbowe, smallint, smallmoney, tinyint, float, real). W przypadku typów danych daty i godziny użyj wartości 1900-01-01 00:00:00.0000000 (data, data/godzina2, data/godzina, datetime, datetimeoffset, smalldatetime, godzina). W przypadku typów danych binarnych użyj pojedynczego bajtu wartości ASCII 0 (binarne, varbinary, image). |
Przykładowa składnia definicji kolumny: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL Przykład składni zmiany: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()') |
Metoda maskowania, która uwidacznia pierwszą literę adresu e-mail i stały sufiks ".com", w postaci adresu e-mail. aXXX@XXXX.com. | Przykładowa składnia definicji: E-mail varchar(100) MASKED WITH (FUNCTION = 'email()') NULL Przykład składni zmiany: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()') |
|
Losowe | Funkcja maskowania losowego do użycia w dowolnym typie liczbowym do maskowania oryginalnej wartości z losową wartością w określonym zakresie. | Przykładowa składnia definicji: Account_Number bigint MASKED WITH (FUNKCJA = "random([zakres początkowy], [zakres końcowy])") Przykład składni zmiany: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)') |
Ciąg niestandardowy | Metoda maskowania, która uwidacznia pierwsze i ostatnie litery i dodaje niestandardowy ciąg dopełniania w środku. prefiks,[dopełnienie],sufiks Jeśli oryginalna wartość jest zbyt krótka, aby ukończyć całą maskę, część prefiksu lub sufiksu nie jest widoczna. |
Przykładowa składnia definicji: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],sufiks)') NULL Przykład składni zmiany: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)") Spowoduje to zmianę numeru telefonu, takiego jak 555.123.1234 na 5XXXXXXX. Dodatkowy przykład: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(5,"XXXXXXX",0)") Spowoduje to zmianę numeru telefonu, takiego jak 555.123.1234 na 555.1XXXXXXX. |
Datetime | Dotyczy: SQL Server 2022 (16.x) Metoda maskowania dla kolumny zdefiniowanej przy użyciu typu danych datetime, datetime2, date, time, datetimeoffset, smalldatetime. Pomaga maskowanie roku => datetime("Y"), month=> datetime("M") , day=>datetime("D"), hour=>datetime("h"), minute=>datetime("m"), lub seconds=>datetime("s") części dnia. |
Przykład maskowania roku wartości daty/godziny: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("Y")) Przykład sposobu maskowania miesiąca wartości daty/godziny: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("M")') Przykład sposobu maskowania minuty wartości daty/godziny: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("m")') |
Funkcja maskowania | Logika maskowania |
---|---|
Wartość domyślna | Pełne maskowanie zgodnie z typami danych wyznaczonych pól * Użyj xxxx (lub mniej), jeśli rozmiar pola jest mniejszy niż 4 znaki dla typów danych ciągów (nchar, ntext, nvarchar). * Użyj wartości zerowej dla typów danych liczbowych (bigint, bit, dziesiętny, int, pieniądze, liczbowe, smallint, smallmoney, tinyint, float, real). * Użyj 1900-01-01 dla typów danych daty/godziny (date, datetime2, datetime, datetimeoffset, smalldatetime, time). * Dla sql_variant jest używana wartość domyślna bieżącego typu. * W przypadku kodu XML używany jest dokument <maskowany /> . * Użyj pustej wartości dla specjalnych typów danych (sygnatura czasowa, tabela, HierarchyID, uniqueidentifier, binarny, obraz, varbinary i typy przestrzenne). |
Karta kredytowa | Metoda maskowania, która uwidacznia ostatnie cztery cyfry wyznaczonych pól i dodaje ciąg stały jako prefiks w postaci karty kredytowej. XXXX-XXXX-XXXX-1234 |
Metoda maskowania, która uwidacznia pierwszą literę i zastępuje domenę XXX.com przy użyciu stałego prefiksu ciągu w postaci adresu e-mail. aXX@XXXX.com |
|
Liczba losowa | Metoda maskowania, która generuje liczbę losową zgodnie z wybranymi granicami i rzeczywistymi typami danych. Jeśli wyznaczone granice są równe, funkcja maskowania jest liczbą stałą.![]() |
Tekst niestandardowy | Metoda maskowania, która uwidacznia pierwsze i ostatnie znaki i dodaje niestandardowy ciąg dopełniania w środku. Jeśli oryginalny ciąg jest krótszy niż uwidoczniony prefiks i sufiks, używany jest tylko ciąg wypełnienia. prefiks[dopełnienie]sufiks ![]() |
Zalecane pola do maskowania
Aparat rekomendacji DDM flaguje niektóre pola z bazy danych jako potencjalnie poufne pola, które mogą być dobrymi kandydatami do maskowania. W okienku Dynamiczne maskowanie danych w portalu zobaczysz zalecane kolumny dla bazy danych. Wybierz pozycję Dodaj maskę dla co najmniej jednej kolumny, a następnie wybierz odpowiednią funkcję maskowania i wybierz pozycję Zapisz, aby zastosować maskę dla tych pól.
Zarządzanie dynamicznym maskowaniem danych przy użyciu języka T-SQL
- Aby utworzyć dynamiczną maskę danych, zobacz Tworzenie dynamicznej maski danych.
- Aby dodać lub edytować maskę w istniejącej kolumnie, zobacz Dodawanie lub edytowanie maski w istniejącej kolumnie.
- Aby udzielić uprawnień do wyświetlania niemaskowanych danych, zobacz Udzielanie uprawnień do wyświetlania niemaskowanych danych.
- Aby usunąć dynamiczną maskę danych, zobacz Upuszczanie dynamicznej maski danych.
Konfigurowanie dynamicznego maskowania danych dla bazy danych przy użyciu poleceń cmdlet programu PowerShell
Zasady maskowania danych
Reguły maskowania danych
- Get-AzSqlDatabaseDataMaskingRule
- New-AzSqlDatabaseDataMaskingRule
- Remove-AzSqlDatabaseDataMaskingRule
- Set-AzSqlDatabaseDataMaskingRule
Konfigurowanie dynamicznego maskowania danych dla bazy danych przy użyciu interfejsu API REST
Interfejs API REST umożliwia programowe zarządzanie zasadami i regułami maskowania danych. Opublikowany interfejs API REST obsługuje następujące operacje:
Zasady maskowania danych
- Tworzenie lub aktualizowanie: tworzy lub aktualizuje zasady maskowania danych bazy danych.
- Pobierz: pobiera zasady maskowania danych bazy danych.
Reguły maskowania danych
- Tworzenie lub aktualizowanie: tworzy lub aktualizuje regułę maskowania danych bazy danych.
- Lista według bazy danych: pobiera listę reguł maskowania danych bazy danych.
Uprawnienia
Są to wbudowane role do konfigurowania dynamicznego maskowania danych:
Są to akcje wymagane do korzystania z dynamicznego maskowania danych:
Odczyt/zapis:
Microsoft.Sql/servers/databases/dataMaskingPolicies/*
Odczyt:
Microsoft.Sql/servers/databases/dataMaskingPolicies/read
Pisać:
Microsoft.Sql/servers/databases/dataMaskingPolicies/write
Aby dowiedzieć się więcej o uprawnieniach podczas korzystania z dynamicznego maskowania danych za pomocą polecenia T-SQL, zobacz Uprawnienia
Przykład szczegółowych uprawnień
Zapobiegaj nieautoryzowanemu dostępowi do poufnych danych i przejmij kontrolę, maskując go nieautoryzowanemu użytkownikowi na różnych poziomach bazy danych. Możesz przyznać lub odwołać uprawnienia UNMASK na poziomie bazy danych, na poziomie schematu, na poziomie tabeli lub na poziomie kolumny do dowolnego użytkownika lub roli bazy danych. W połączeniu z uwierzytelnianiem entra firmy Microsoft uprawnienia UNMASK można zarządzać dla użytkowników, grup i aplikacji przechowywanych w środowisku platformy Azure. Uprawnienie UNMASK zapewnia szczegółowy sposób kontrolowania i ograniczania nieautoryzowanego dostępu do danych przechowywanych w bazie danych oraz ulepszania zarządzania zabezpieczeniami danych.
Utwórz schemat zawierający tabele użytkowników:
CREATE SCHEMA Data; GO
Utwórz tabelę z zamaskowanych kolumn:
CREATE TABLE Data.Membership ( MemberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED, FirstName VARCHAR(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL, LastName VARCHAR(100) NOT NULL, Phone VARCHAR(12) MASKED WITH (FUNCTION = 'default()') NULL, Email VARCHAR(100) MASKED WITH (FUNCTION = 'email()') NOT NULL, DiscountCode SMALLINT MASKED WITH (FUNCTION = 'random(1, 100)') NULL, BirthDay DATETIME MASKED WITH (FUNCTION = 'default()') NULL );
Wstaw przykładowe dane:
INSERT INTO Data.Membership (FirstName, LastName, Phone, Email, DiscountCode, BirthDay) VALUES ('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com', 10, '1985-01-25 03:25:05'), ('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 5, '1990-05-14 11:30:00'), ('Shakti', 'Menon', '555.123.4570', 'SMenon@contoso.net', 50, '2004-02-29 14:20:10'), ('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 40, '1990-03-01 06:00:00');
Utwórz schemat zawierający tabele usług:
CREATE SCHEMA Service; GO
Utwórz tabelę usług z zamaskowanych kolumn:
CREATE TABLE Service.Feedback ( MemberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED, Feedback VARCHAR(100) MASKED WITH (FUNCTION = 'default()') NULL, Rating INT MASKED WITH (FUNCTION = 'default()'), Received_On DATETIME );
Wstaw przykładowe dane:
INSERT INTO Service.Feedback (Feedback, Rating, Received_On) VALUES ('Good', 4, '2022-01-25 11:25:05'), ('Excellent', 5, '2021-12-22 08:10:07'), ('Average', 3, '2021-09-15 09:00:00');
Utwórz różnych użytkowników w bazie danych:
CREATE USER ServiceAttendant WITHOUT LOGIN; GO CREATE USER ServiceLead WITHOUT LOGIN; GO CREATE USER ServiceManager WITHOUT LOGIN; GO CREATE USER ServiceHead WITHOUT LOGIN; GO
Udziel uprawnień do odczytu użytkownikom w bazie danych:
ALTER ROLE db_datareader ADD MEMBER ServiceAttendant; ALTER ROLE db_datareader ADD MEMBER ServiceLead; ALTER ROLE db_datareader ADD MEMBER ServiceManager; ALTER ROLE db_datareader ADD MEMBER ServiceHead;
Udziel innym użytkownikom uprawnień UNMASK:
--Grant column level UNMASK permission to ServiceAttendant GRANT UNMASK ON Data.Membership(FirstName) TO ServiceAttendant;
-- Grant table level UNMASK permission to ServiceLead GRANT UNMASK ON Data.Membership TO ServiceLead;
-- Grant schema level UNMASK permission to ServiceManager GRANT UNMASK ON SCHEMA::Data TO ServiceManager; GRANT UNMASK ON SCHEMA::Service TO ServiceManager;
--Grant database level UNMASK permission to ServiceHead; GRANT UNMASK TO ServiceHead;
Wykonaj zapytanie o dane w kontekście użytkownika
ServiceAttendant
:EXECUTE AS USER = 'ServiceAttendant'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
Wykonaj zapytanie o dane w kontekście użytkownika
ServiceLead
:EXECUTE AS USER = 'ServiceLead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
Wykonaj zapytanie o dane w kontekście użytkownika
ServiceManager
:EXECUTE AS USER = 'ServiceManager'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
Wykonaj zapytanie o dane w kontekście użytkownika
ServiceHead
:EXECUTE AS USER = 'ServiceHead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
Aby odwołać uprawnienia UNMASK, użyj następujących instrukcji języka T-SQL:
REVOKE UNMASK ON Data.Membership(FirstName) FROM ServiceAttendant; REVOKE UNMASK ON Data.Membership FROM ServiceLead; REVOKE UNMASK ON SCHEMA::Data FROM ServiceManager; REVOKE UNMASK ON SCHEMA::Service FROM ServiceManager; REVOKE UNMASK FROM ServiceHead;