Zalecane, kiedy należy używać funkcji Always Encrypted usługi Azure SQL Database
Funkcja Always Encrypted to funkcja przeznaczona do ochrony poufnych danych, takich jak numery kart kredytowych lub numery identyfikacyjne krajowe/regionalne (na przykład numery ubezpieczenia społecznego w STANACH Zjednoczonych), przechowywane w bazach danych usługi Azure SQL Database, azure SQL Managed Instance i sql Server. Funkcja Always Encrypted umożliwia klientom szyfrowanie poufnych danych wewnątrz aplikacji klienckich i nigdy nie ujawnia kluczy szyfrowania aparatowi bazy danych. Zapewnia to separację między tymi, którzy są właścicielami danych i mogą je wyświetlać, a tymi, którzy zarządzają danymi, ale nie powinni mieć dostępu — lokalnych administratorów baz danych, operatorów baz danych w chmurze lub innych nieautoryzowanych użytkowników z wysokim poziomem uprawnień. W związku z tym funkcja Always Encrypted umożliwia klientom pewnie przechowywanie poufnych danych w chmurze oraz zmniejszenie prawdopodobieństwa kradzieży danych przez złośliwych testerów.
Funkcję Always Encrypted można skonfigurować do obsługi ograniczonych poufnych zapytań dotyczących zaszyfrowanych danych, zapytań obejmujących porównania równości. Na przykład wyszukiwanie punktów lub sprzężenia równości. Takie zapytania korzystają z szyfrowania deterministycznego.
Uwaga
Bezpieczne enklawy rozszerzają możliwości poufnego przetwarzania funkcji Always Encrypted przy użyciu dopasowywania wzorców, innych operatorów porównania i szyfrowania w miejscu.
Funkcja Always Encrypted sprawia, że szyfrowanie jest niewidoczne dla aplikacji. Sterownik z włączoną funkcją Always Encrypted zainstalowany na komputerze klienckim osiąga to przez automatyczne szyfrowanie i odszyfrowywanie poufnych danych w aplikacji klienckiej. Sterownik szyfruje dane w kolumnach poufnych przed przekazaniem danych do aparatu bazy danych i automatycznie zapisuje ponownie zapytania, aby semantyka aplikacji została zachowana. Podobnie sterownik w sposób przezroczysty odszyfrowuje dane przechowywane w zaszyfrowanych kolumnach bazy danych zawartych w wynikach zapytania.
Konfigurowanie funkcji Always Encrypted
Aby skonfigurować funkcję Always Encrypted w bazie danych, musisz:
Aprowizuj klucze kryptograficzne w celu ochrony danych. Funkcja Always Encrypted używa dwóch typów kluczy:
- Klucze szyfrowania kolumn.
- Klucze wzorca kolumny.
Klucz szyfrowania kolumny służy do szyfrowania danych w zaszyfrowanej kolumnie. Klucz główny kolumny to klucz chroniący klucz, który szyfruje co najmniej jeden klucz szyfrowania kolumny.
Klucze główne kolumn należy przechowywać w zaufanym magazynie kluczy poza systemem bazy danych, takim jak usługa Azure Key Vault, magazyn certyfikatów systemu Windows lub sprzętowy moduł zabezpieczeń.
Następnie należy aprowizować klucze szyfrowania kolumn i szyfrować je przy użyciu klucza głównego kolumny.
Na koniec należy przechowywać metadane dotyczące kluczy w bazie danych.
- Metadane klucza głównego kolumny przechwytują lokalizację klucza głównego kolumny.
- Metadane klucza szyfrowania kolumny zawierają zaszyfrowaną wartość klucza szyfrowania kolumny. Aparat bazy danych nigdy nie przechowuje ani nie używa kluczy dowolnego typu w postaci zwykłego tekstu.
- Klucze szyfrowania kolumn.
Skonfiguruj szyfrowanie dla wybranych kolumn bazy danych zawierających poufne dane, które mają być chronione. Może to obejmować tworzenie nowych tabel z zaszyfrowanymi kolumnami lub szyfrowanie istniejących kolumn bazy danych i istniejących danych. Podczas konfigurowania szyfrowania dla kolumny należy określić informacje o algorytmie szyfrowania, kluczu szyfrowania kolumny w celu ochrony danych w kolumnie i typie szyfrowania. Funkcja Always Encrypted obsługuje dwa typy szyfrowania:
- Szyfrowanie deterministyczne zawsze generuje tę samą zaszyfrowaną wartość dla danej wartości zwykłego tekstu. Użycie szyfrowania deterministycznego umożliwia wyszukiwanie punktów, sprzężenia równości, grupowanie i indeksowanie zaszyfrowanych kolumn. Jednak może również zezwolić nieautoryzowanym użytkownikom na odgadnięcie informacji o zaszyfrowanych wartościach, sprawdzając wzorce w zaszyfrowanej kolumnie, zwłaszcza jeśli istnieje niewielki zestaw możliwych zaszyfrowanych wartości, takich jak Prawda/Fałsz lub Region Północny/Południowy/Południowy/Wschód/Zachód.
- Szyfrowanie losowe używa metody, która szyfruje dane w mniej przewidywalny sposób. Szyfrowanie losowe jest bezpieczniejsze, ale zapobiega wyszukiwaniu, grupowaniu, indeksowaniu i dołączaniu do zaszyfrowanych kolumn.
Użyj szyfrowania deterministycznego dla kolumn, które będą używane jako parametry wyszukiwania lub grupowania. Na przykład numer identyfikatora rządu. Użyj szyfrowania losowego dla danych, takich jak poufne komentarze do badania, które nie są grupowane z innymi rekordami i nie są używane do łączenia tabel.
Aby uzyskać szczegółowe informacje na temat algorytmów kryptograficznych Always Encrypted, zobacz Szyfrowanie Always Encrypted.
Powyższe kroki można wykonać przy użyciu narzędzi SQL:
- SQL Server Management Studio (SSMS)
- SQL Server PowerShell
- sqlpackage — który automatyzuje proces instalacji
Aby zapewnić, że klucze Always Encrypted i chronione poufne dane nigdy nie są ujawniane w postaci zwykłego tekstu w środowisku bazy danych, aparat bazy danych nie może być zaangażowany w operacje aprowizacji kluczy i szyfrowania danych ani odszyfrowywania. W związku z tym język Transact-SQL (T-SQL) nie obsługuje aprowizacji kluczy ani operacji kryptograficznych. Z tego samego powodu należy zaszyfrować istniejące dane lub ponownie zaszyfrować je (przy użyciu innego typu szyfrowania lub klucza szyfrowania kolumny) poza bazą danych (narzędzia SQL mogą to zautomatyzować).
Uwaga
Funkcja Always Encrypted z bezpiecznymi enklawami podnosi niektóre z powyższych ograniczeń, zezwalając na operacje kryptograficzne na istniejących danych przy użyciu języka T-SQL i eliminuje konieczność przenoszenia danych poza bazę danych.
- Szyfrowanie deterministyczne zawsze generuje tę samą zaszyfrowaną wartość dla danej wartości zwykłego tekstu. Użycie szyfrowania deterministycznego umożliwia wyszukiwanie punktów, sprzężenia równości, grupowanie i indeksowanie zaszyfrowanych kolumn. Jednak może również zezwolić nieautoryzowanym użytkownikom na odgadnięcie informacji o zaszyfrowanych wartościach, sprawdzając wzorce w zaszyfrowanej kolumnie, zwłaszcza jeśli istnieje niewielki zestaw możliwych zaszyfrowanych wartości, takich jak Prawda/Fałsz lub Region Północny/Południowy/Południowy/Wschód/Zachód.
Jak działają zapytania względem zaszyfrowanych kolumn
Aby uruchomić zapytanie dotyczące zaszyfrowanych kolumn bazy danych, wstawić dane do zaszyfrowanych kolumn, pobrać wartości zwykłego tekstu z zaszyfrowanych kolumn lub wykonać obsługiwane operacje (na przykład wyszukiwanie punktów) w kolumnach przy użyciu szyfrowania deterministycznego, użytkownik lub aplikacja wykonująca zapytanie musi spełniać następujące wymagania wstępne:
- Mieć dostęp do klucza głównego kolumny chroniącego dane. Dostęp do klucza jest wymagany oprócz uprawnień na poziomie bazy danych, takich jak
SELECT
w tabeli zawierającej dane. - Połączenie do bazy danych z włączoną funkcją Always Encrypted w połączeniu z bazą danych. Większość narzędzi SQL i sterowników klienta SQL obsługuje włączanie funkcji Always Encrypted dla połączeń z bazą danych.
Uwaga
Jeśli użytkownik ma wymagane uprawnienia bazy danych do odczytu danych, ale nie ma dostępu do kluczy chronionych, użytkownik nadal może pobrać dane szyfrowane (zaszyfrowane) przez nawiązanie połączenia z bazą danych bez włączania funkcji Always Encrypted w połączeniu z bazą danych.
Oto jak działają zapytania dotyczące zaszyfrowanych kolumn:
Gdy aplikacja wystawia zapytanie sparametryzowane, sterownik klienta SQL w aplikacji w sposób niewidoczny kontaktuje się z aparatem bazy danych (wywołując sp_describe_parameter_encryption (Transact-SQL), aby określić, które parametry dotyczą zaszyfrowanych kolumn i powinny być szyfrowane. Dla każdego parametru, który musi być zaszyfrowany, sterownik otrzymuje algorytm szyfrowania, typ szyfrowania i metadane klucza, w tym zaszyfrowany klucz szyfrowania kolumny i lokalizację odpowiedniego klucza głównego kolumny.
Sterownik wywołuje magazyn kluczy zawierający klucze główne kolumny w celu odszyfrowania zaszyfrowanych wartości klucza szyfrowania kolumny. Wynikowe klucze szyfrowania kolumn w postaci zwykłego tekstu są buforowane w celu zmniejszenia liczby rund do magazynu kluczy w kolejnych zastosowaniach tych samych kluczy szyfrowania kolumn.
Sterownik używa uzyskanych kluczy szyfrowania kolumn w postaci zwykłego tekstu do szyfrowania parametrów zapytania odpowiadających zaszyfrowanym kolumnom.
Sterownik zastępuje wartości zwykłego tekstu parametrów przeznaczonych dla zaszyfrowanych kolumn za pomocą ich zaszyfrowanych wartości i wysyła zapytanie do aparatu bazy danych do przetwarzania.
Aparat bazy danych wykonuje zapytanie, które może obejmować porównania równości kolumn przy użyciu szyfrowania deterministycznego.
Jeśli wyniki zapytania obejmują dane z zaszyfrowanych kolumn, aparat bazy danych dołącza metadane szyfrowania dla każdej kolumny, w tym informacje o algorytmie szyfrowania, typie szyfrowania i metadanych klucza do zestawu wyników.
Aparat bazy danych wysyła zestaw wyników do aplikacji klienckiej.
Dla każdej zaszyfrowanej kolumny w odebranym zestawie wyników sterownik najpierw próbuje znaleźć klucz szyfrowania kolumny w postaci zwykłego tekstu w lokalnej pamięci podręcznej i wykonuje tylko zaokrąglenie do magazynu kluczy przechowującego klucz główny kolumny, jeśli nie może znaleźć klucza w pamięci podręcznej.
Sterownik odszyfrowuje wyniki i zwraca wartości zwykłego tekstu do aplikacji.
Sterownik klienta współdziała z magazynem kluczy zawierającym klucz główny kolumny przy użyciu dostawcy magazynu kluczy głównego kolumny, który jest składnikiem oprogramowania po stronie klienta, który hermetyzuje magazyn kluczy zawierający klucz główny kolumny. Dostawcy typowych typów magazynów kluczy są dostępni w bibliotekach sterowników po stronie klienta firmy Microsoft lub jako pliki do pobrania autonomicznego. Możesz również zaimplementować własnego dostawcę. Funkcje always Encrypted, w tym wbudowane dostawcy magazynu kluczy głównych kolumn różnią się w zależności od biblioteki sterowników i jej wersji.
Zobacz Tworzenie aplikacji przy użyciu funkcji Always Encrypted, aby uzyskać listę sterowników klientów obsługujących funkcję Always Encrypted i uzyskać informacje na temat tworzenia aplikacji, które wysyłają zapytania o zaszyfrowane kolumny.
Możesz również wykonywać zapytania dotyczące zaszyfrowanych kolumn przy użyciu narzędzi SQL, na przykład Azure Data Studio lub SSMS.
Ograniczenia
Następujące ograniczenia dotyczą zapytań dotyczących zaszyfrowanych kolumn:
- Szyfrowanie deterministyczne obsługuje następujące operacje obejmujące porównania równości — żadne inne operacje nie są dozwolone.
- = (Równa się) w wyszukiwaniu punktów.
- IN.
- SELECT — GRUPUJ WEDŁUG.
- DISTINCT.
- = (Równa się) w wyszukiwaniu punktów.
- Nie są dozwolone żadne obliczenia dotyczące kolumn zaszyfrowanych przy użyciu szyfrowania losowego.
Uwaga
Funkcja Always Encrypted z bezpiecznymi enklawami zrelaksuje powyższe ograniczenie, umożliwiając dopasowywanie wzorców, operatory porównania, sortowanie i indeksowanie kolumn przy użyciu szyfrowania losowego.
- Instrukcje zapytań wyzwalające obliczenia obejmujące zarówno zwykły tekst, jak i zaszyfrowane dane nie są dozwolone. Na przykład: .
- Porównywanie zaszyfrowanej kolumny z kolumną zwykłego tekstu lub literałem.
- Kopiowanie danych z kolumny zwykłego tekstu do zaszyfrowanej kolumny (lub odwrotnie) UPDATE, BULK INSERT, SELECT INTO lub INSERT. WYBIERZ.
- Wstawianie literałów do zaszyfrowanych kolumn.
- Porównywanie zaszyfrowanej kolumny z kolumną zwykłego tekstu lub literałem.
Takie instrukcje powodują błędy starcia operandu w następujący sposób:
Output
Msg 206, Level 16, State 2, Line 89
Operand type clash: char(11) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_1', column_encryption_key_database_name = 'ssn') collation_name = 'Latin1_General_BIN2' is incompatible with char
Aplikacje muszą używać parametrów zapytania do przekazywania wartości odpowiadających zaszyfrowanym kolumnom. Na przykład podczas wstawiania danych do zaszyfrowanych kolumn lub filtrowania według zaszyfrowanych kolumn (podczas korzystania z szyfrowania deterministycznego). Przekazywanie literałów lub zmiennych T-SQL odpowiadających zaszyfrowanym kolumnom nie jest obsługiwane. Aby uzyskać więcej informacji specyficznych dla używanego sterownika klienta, zobacz Tworzenie aplikacji przy użyciu funkcji Always Encrypted.
Aby wysyłać zapytania przekazujące wartości odpowiadające zaszyfrowanym kolumnom w tych narzędziach, należy użyć parametryzacji dla zmiennych Always Encrypted w narzędziu Azure Data Studio lub SSMS . Na przykład podczas wstawiania danych do zaszyfrowanych kolumn lub filtrowania według zaszyfrowanych kolumn (podczas korzystania z szyfrowania deterministycznego).
Parametry wartości tabeli przeznaczone dla zaszyfrowanych kolumn nie są obsługiwane.
Zapytania korzystające z następujących klauzul nie są obsługiwane:
Po zmianie definicji zaszyfrowanej kolumny wykonaj sp_refresh_parameter_encryption , aby zaktualizować metadane Always Encrypted dla obiektu.
Funkcja Always Encrypted nie jest obsługiwana w przypadku kolumn o poniższych cechach:
- Kolumny używające jednego z następujących typów danych: xml, timestamp, rowversion, image, ntext, text, sql_variant, hierarchyid, geography, geometry, alias, typy zdefiniowane przez użytkownika.
- Kolumny FILESTREAM
- Kolumny z właściwością IDENTITY .
- Kolumny z właściwością ROWGUIDCOL .
- Kolumny ciągów (varchar, char itp.) z sortowaniami innymi niż sortowanie punktów kodu binarnego (_BIN2) podczas korzystania z szyfrowania deterministycznego.
- Kolumny, które są kluczami dla indeksów klastrowanych i nieklastrowanych podczas korzystania z szyfrowania losowego (obsługiwane są indeksy kolumn używające szyfrowania deterministycznego).
- Kolumny zawarte w indeksach pełnotekstowych (funkcja Always Encrypted nie obsługuje wyszukiwania pełnotekstowego).
- Obliczone kolumny.
- Kolumny przywoływane przez obliczone kolumny (gdy wyrażenie wykonuje nieobsługiwane operacje dla funkcji Always Encrypted).
- Zestaw kolumn rozrzedzona.
- Kolumny, do których odwołuje się statystyka podczas korzystania z szyfrowania losowego (obsługiwane jest szyfrowanie deterministyczne).
- Partycjonowanie kolumn.
- Kolumny z domyślnymi ograniczeniami.
- Kolumny przywoływane przez unikatowe ograniczenia podczas korzystania z szyfrowania losowego (obsługiwane jest szyfrowanie deterministyczne).
- Kolumny klucza podstawowego podczas korzystania z szyfrowania losowego (obsługiwane jest szyfrowanie deterministyczne).
- Odwoływanie się do kolumn w ograniczeniach klucza obcego podczas korzystania z szyfrowania losowego lub w przypadku używania szyfrowania deterministycznego, jeśli przywoływanych kolumn i odwołujące się do nich używają różnych kluczy lub algorytmów.
- Kolumny, do których odwołuje się ograniczenia sprawdzania.
- Przechwycone/śledzone kolumny przy użyciu przechwytywania danych zmian.
- Kolumny klucza podstawowego w tabelach, które mają śledzenie zmian.
- Kolumny, które są maskowane (przy użyciu dynamicznego maskowania danych).
- Kolumny w tabelach bazy danych stretch. (Tabele z kolumnami zaszyfrowanymi za pomocą funkcji Always Encrypted można włączyć dla funkcji Stretch).
-
Ważne
Baza danych Stretch jest przestarzała w programie SQL Server 2022 (16.x) i usłudze Azure SQL Database. Ta funkcja zostanie usunięta w przyszłej wersji aparatu bazy danych. Unikaj używania tej funkcji w nowych pracach deweloperskich i zaplanuj zmodyfikowanie aplikacji, które używają jej obecnie.
Następujące funkcje nie działają w przypadku zaszyfrowanych kolumn:
- Replikacja programu SQL Server (transakcyjna, scalona lub replikacja migawki). Obsługiwane są funkcje replikacji fizycznej, w tym Zawsze.
- Zapytania rozproszone (połączone serwery, OPENROWSET (Transact-SQL), OPENDATASOURCE (Transact-SQL)).
- Zapytania obejmujące wiele baz danych, które wykonują sprzężenia w kolumnach (przy użyciu szyfrowania deterministycznego) z różnych baz danych.
Dokumentacja języka Transact-SQL always Encrypted
Funkcja Always Encrypted używa następujących instrukcji Języka Transact-SQL, widoków katalogu systemu, procedur składowanych i uprawnień systemowych.
Zestawienia
- TWORZENIE KLUCZA GŁÓWNEGO KOLUMNY (Transact-SQL)
- DROP COLUMN MASTER KEY (Transact-SQL)
- CREATE COLUMN ENCRYPTION KEY (Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY (Transact-SQL)
- DROP COLUMN ENCRYPTION KEY (Transact-SQL)
- CREATE TABLE (ENCRYPTED WITH)
Widoki wykazu systemu i procedury składowane
- sys.column_encryption_keys (Transact-SQL)
- sys.column_encryption_key_values (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sp_refresh_parameter_encryption (Transact-SQL)
- sp_describe_parameter_encryption (Transact-SQL)
Zobacz również artykuł sys.columns (Transact-SQL), aby uzyskać informacje na temat metadanych szyfrowania przechowywanych dla każdej kolumny.
Uprawnienia bazy danych
Istnieją cztery uprawnienia bazy danych dla funkcji Always Encrypted:
- ALTER ANY COLUMN MASTER KEY —wymagane do utworzenia i usunięcia metadanych klucza głównego kolumny.
- ZMIEŃ DOWOLNY KLUCZ SZYFROWANIA KOLUMNY — wymagane do utworzenia i usunięcia metadanych klucza szyfrowania kolumny.
- WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA GŁÓWNEGO KOLUMNY — wymagana do uzyskania dostępu do metadanych klucza głównego kolumny i odczytu, która jest wymagana do wykonywania zapytań dotyczących zaszyfrowanych kolumn.
- WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA SZYFROWANIA KOLUMNY — wymagana do uzyskania dostępu do metadanych klucza głównego kolumny i odczytu, która jest wymagana do wykonywania zapytań dotyczących zaszyfrowanych kolumn.
Poniższa tabela zawiera podsumowanie uprawnień wymaganych do typowych akcji.
Scenariusz | ZMIENIANIE DOWOLNEGO KLUCZA GŁÓWNEGO KOLUMNY | ZMIENIANIE DOWOLNEGO KLUCZA SZYFROWANIA KOLUMNY | WYŚWIETLANIE DOWOLNEJ DEFINICJI KLUCZA GŁÓWNEGO KOLUMNY | WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA SZYFROWANIA KOLUMNY |
---|---|---|---|---|
Zarządzanie kluczami (tworzenie/zmienianie/przeglądanie metadanych klucza w bazie danych) | X | X | X | X |
Wykonywanie zapytań dotyczących zaszyfrowanych kolumn | X | X |
Ważne uwagi
- Podczas wybierania zaszyfrowanych kolumn wymagane są uprawnienia WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA SZYFROWANIA KOLUMNY, nawet jeśli użytkownik nie ma uprawnień do kluczy głównych kolumn (w ich magazynach kluczy), ochrony kolumn i nie uzyskuje dostępu do próby w postaci zwykłego tekstu.
- W programie SQL Server zarówno UPRAWNIENIA WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA GŁÓWNEGO KOLUMNY, jak i WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA SZYFROWANIA KOLUMNY są domyślnie przyznawane publicznie stałej roli bazy danych. Administrator bazy danych może zdecydować się na odwołanie (lub odmowę) uprawnień do roli publicznej i przyznanie im określonych ról lub użytkowników w celu zaimplementowania bardziej ograniczonej kontroli.
- W usłudze SQL Database UPRAWNIENIA WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA GŁÓWNEGO KOLUMNY i WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA SZYFROWANIA KOLUMNY nie są domyślnie przyznawane publicznie stałej roli bazy danych. Umożliwia to prawidłowe działanie niektórych istniejących starszych narzędzi (przy użyciu starszych wersji narzędzia DacFx). Aby pracować z zaszyfrowanymi kolumnami (nawet jeśli ich nie odszyfrowywanie), administrator bazy danych musi jawnie przyznać UPRAWNIENIA WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA GŁÓWNEGO KOLUMNY i WYŚWIETLIĆ DOWOLNĄ DEFINICJĘ KLUCZA SZYFROWANIA KOLUMNY.