Zawsze Szyfrowane
Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
Funkcja Always Encrypted i Always Encrypted z bezpiecznymi enklawami to funkcje przeznaczone do ochrony poufnych informacji, w tym numerów kart kredytowych i numerów identyfikacyjnych krajowych lub regionalnych (takich jak numery ubezpieczenia społecznego USA), w usłudze Azure SQL Database, usłudze Azure SQL Managed Instance i bazach danych programu SQL Server. Umożliwia klientom szyfrowanie poufnych danych w aplikacjach klienckich, dzięki czemu klucze szyfrowania nigdy nie są widoczne dla aparatu bazy danych. Zapewnia to separację między tymi, którzy są właścicielami danych i mogą je wyświetlać, oraz 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 bezpieczne przechowywanie poufnych danych w chmurze, co zmniejsza ryzyko kradzieży danych przez złośliwych testerów.
Funkcja Always Encrypted ma pewne ograniczenia, takie jak brak możliwości wykonywania operacji na zaszyfrowanych danych, w tym sortowanie, filtrowanie (z wyjątkiem wyszukiwania punktów przy użyciu szyfrowania deterministycznego) itp. Oznacza to, że niektóre zapytania i aplikacje mogą nie być zgodne z funkcją Always Encrypted lub wymagać znaczących zmian logiki aplikacji.
Aby rozwiązać te ograniczenia, Always Encrypted z bezpiecznymi enklawami umożliwia aparatowi bazy danych przetwarzanie zaszyfrowanych danych w chronionym obszarze pamięci nazywanym bezpieczną enklawą. Bezpieczne enklawy zwiększają możliwości poufnego przetwarzania funkcji Always Encrypted, obsługując dopasowywanie wzorców, różne operatory porównania i szyfrowanie w miejscu.
Funkcja Always Encrypted gwarantuje, że szyfrowanie jest bezproblemowe dla aplikacji. Po stronie klienta sterownik z obsługą funkcji Always Encrypted szyfruje poufne dane przed wysłaniem ich do silnika bazy danych i automatycznie przepisuje zapytania w celu zachowania semantyki aplikacji. Ponadto automatycznie odszyfrowuje wyniki zapytania z zaszyfrowanych kolumn bazy danych.
Konfigurowanie funkcji Always Encrypted
Notatka
W przypadku aplikacji, które muszą wykonywać dopasowywanie wzorców oraz używać operatorów porównania, sortowania i indeksowania na zaszyfrowanych kolumnach, należy zaimplementować Always Encrypted z bezpiecznymi enklawami.
Ta sekcja zawiera omówienie konfigurowania funkcji Always Encrypted. Aby uzyskać szczegółowe informacje i rozpocząć pracę, zobacz samouczek : wprowadzenie do usługi Always Encrypted.
Aby skonfigurować funkcję Always Encrypted w bazie danych, wykonaj następujące kroki:
Aprowizuj klucze kryptograficzne w celu ochrony danych. Funkcja Always Encrypted używa dwóch typów kluczy:
- Klucze szyfrowania kolumn.
- Klucze główne kolumn.
Klucz szyfrowania kolumny służy do szyfrowania danych w zaszyfrowanej kolumnie. Klucz główny kolumny jest kluczem ochronnym, 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 azure Key Vault, magazyn certyfikatów systemu Windowslub sprzętowy moduł zabezpieczeń. Następnie należy aprowizować klucze szyfrowania kolumn i szyfrować je przy użyciu klucza głównego kolumny.
Na koniec zapisz metadane dotyczące kluczy w bazie danych. Metadane klucza głównego kolumny zawierają lokalizację klucza głównego kolumny. Metadane klucza szyfrowania kolumny zawierają zaszyfrowaną wartość klucza szyfrowania kolumny. Silnik bazy danych nie przechowuje ani nie używa żadnych kluczy w formie zwykłego tekstu.
Aby uzyskać więcej informacji na temat zarządzania kluczami Always Encrypted, zobacz Omówienie zarządzania kluczami dla usługi Always Encrypted.
Skonfiguruj szyfrowanie dla określonych kolumn bazy danych zawierających poufne informacje w celu zapewnienia ochrony. Może to wymagać utworzenia nowych tabel z zaszyfrowanymi kolumnami lub zaszyfrowania istniejących kolumn i danych. Podczas konfigurowania szyfrowania dla kolumny należy określić szczegóły dotyczące algorytmu szyfrowania, klucza szyfrowania kolumny w celu zabezpieczenia danych oraz typu szyfrowania. Funkcja Always Encrypted obsługuje dwa typy szyfrowania:
szyfrowania deterministycznego 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ż umożliwić nieautoryzowanym użytkownikom odgadnięcie informacji o zaszyfrowanych wartościach przez zbadanie wzorców 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.
szyfrowania losowego używa metody, która szyfruje dane nieprzewidywalnie. Każde identyczne dane wejściowe w postaci zwykłego tekstu powoduje utworzenie odrębnych zaszyfrowanych danych wyjściowych. Zwiększa to bezpieczeństwo losowego szyfrowania.
Aby wykonać dopasowywanie wzorców przy użyciu operatorów porównania, sortowania i indeksowania w zaszyfrowanych kolumnach, należy zastosować Always Encrypted z bezpiecznymi enklawami i zastosować szyfrowanie losowe. Always Encrypted (bez bezpiecznych enklaw) losowe szyfrowanie nie obsługuje wyszukiwania, grupowania, indeksowania ani dołączania do zaszyfrowanych kolumn. Zamiast tego w przypadku kolumn przeznaczonych do wyszukiwania lub grupowania niezbędne jest użycie szyfrowania deterministycznego. Umożliwia to wykonywanie operacji, takich jak wyszukiwanie punktów, sprzężenia równości, grupowanie i indeksowanie zaszyfrowanych kolumn.
Ponieważ system bazy danych nie ma dostępu do kluczy kryptograficznych, każde szyfrowanie kolumn wymaga przenoszenia i szyfrowania danych poza bazą danych. Oznacza to, że ten proces szyfrowania może zająć dużo czasu i jest narażony na przerwy w działaniu sieci. Ponadto, jeśli musisz ponownie zaszyfrować kolumnę później, na przykład podczas rotacji klucza szyfrowania lub zmiany typów szyfrowania, napotkasz te same trudności ponownie. Używanie Always Encrypted z bezpiecznymi enklawami eliminuje konieczność przenoszenia danych z bazy danych. Ponieważ enklawa jest zaufana, sterownik klienta w aplikacji lub narzędzie takie jak Azure Data Studio lub SQL Server Management Studio (SSMS) może bezpiecznie udostępniać klucze enklawie podczas operacji kryptograficznych. Enklawa może następnie szyfrować lub ponownie szyfrować kolumny, co znacznie skraca czas wymagany do wykonania tych akcji.
Aby uzyskać szczegółowe informacje na temat algorytmów kryptograficznych Always Encrypted, zobacz Kryptografia Always Encrypted.
Powyższe kroki można wykonać przy użyciu narzędzi SQL:
- Aprowizuj klucze Always Encrypted przy użyciu programu SQL Server Management Studio
- konfigurowanie funkcji Always Encrypted przy użyciu programu PowerShell
- sqlpackage — które automatyzują 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 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ć).
Po zmianie definicji zaszyfrowanej kolumny wykonaj sp_refresh_parameter_encryption, aby zaktualizować metadane Always Encrypted dla obiektu.
Ograniczenia
Następujące ograniczenia dotyczą zapytań dotyczących zaszyfrowanych kolumn:
Nie są dozwolone żadne obliczenia dotyczące kolumn zaszyfrowanych przy użyciu szyfrowania losowego. Szyfrowanie deterministyczne obsługuje następujące operacje obejmujące porównania równości — żadne inne operacje nie są dozwolone.
- = (Równa się) (Transact-SQL) w przeszukiwaniach punktów.
- IN (Transact-SQL).
- SELECT — GROUP BY- Transact-SQL.
- DISTINCT.
Notatka
W przypadku aplikacji, które muszą wykonywać dopasowywanie wzorców, użyj operatorów porównania, sortowania i indeksu w zaszyfrowanych kolumnach, należy zaimplementować Always Encrypted z bezpiecznymi enklawami.
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 w drugą stronę) UPDATE, BULK INSERT, SELECT INTOlub INSERT..SELECT.
- Wstawianie literałów do zaszyfrowanych kolumn.
Takie instrukcje powodują błędy starcia operandu w następujący sposób:
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 dostarczania wartości dla zaszyfrowanych kolumn. Na przykład w przypadku wstawiania danych do zaszyfrowanych kolumn lub filtrowania ich przy użyciu szyfrowania deterministycznego należy używać parametrów zapytania. Nie jest obsługiwane przekazywanie literałów ani zmiennych języka T-SQL odpowiadających zaszyfrowanym kolumnom. Aby uzyskać więcej informacji specyficznych dla używanego sterownika klienta, zobacz Tworzenie aplikacji przy użyciu funkcji Always Encrypted.
W programie Azure Data Studio lub SSMSnależy zastosować parametryzację zmiennych z Always Encrypted, aby wykonywać zapytania obsługujące wartości związane z zaszyfrowanymi kolumnami. Obejmuje to scenariusze, takie jak wstawianie danych do zaszyfrowanych kolumn lub stosowanie filtrów na nich (w przypadkach, gdy jest używane szyfrowanie deterministyczne).
Parametry typu tabelarycznego dotyczące zaszyfrowanych kolumn nie są obsługiwane.
Zapytania korzystające z następujących klauzul nie są obsługiwane:
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, znacznik czasu , rowversion , obraz , ntext , tekst , sql_variant , hierarchyid , geografia , geometria , alias, typy zdefiniowane przez użytkownika.
- kolumny FILESTREAM
- Kolumny z właściwością IDENTITY.
- Kolumny z właściwością ROWGUIDCOL.
- String (varchar, charitp.) kolumny z sortowaniami innymi niż punkt-kod binarny (_BIN2).
- 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 Full-Text search).
- Określ obliczone kolumny w tabeli.
- Kolumny przywoływane przez obliczone kolumny (gdy wyrażenie wykonuje nieobsługiwane operacje dla funkcji Always Encrypted).
- Użyj rozrzednych kolumn.
- Kolumny, do których odwołują się statystyki podczas korzystania z szyfrowania losowego (obsługiwane jest szyfrowanie deterministyczne).
- partycjonowanie kolumn.
- Kolumny z domyślnymi ograniczeniami .
- Kolumny odwoływane przez unikalne ograniczenia podczas korzystania z szyfrowania losowego (szyfrowanie deterministyczne jest obsługiwane).
- 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 deterministycznego, jeśli przywoływane i odwołujące się kolumny używają różnych kluczy lub algorytmów.
- Kolumny, do których odwołują się ograniczenia sprawdzające .
- Przechwycone/śledzone kolumny za pomocą mechanizmu przechwytywania zmian danych.
- Kolumny klucza podstawowego w tabelach, które posiadają śledzenie zmian.
- Kolumny, które są maskowane (przy użyciu dynamiczne maskowanie danych).
- Kolumny używane w procedurach składowanych kompilowanych natywnie.
- Kolumny w tabelach bazy danych stretch . (Tabele z kolumnami zaszyfrowanymi za pomocą funkcji "Always Encrypted" można włączyć dla funkcji "Stretch").
Ważny
Baza danych Stretch jest przestarzała w programie SQL Server 2022 (16.x) i usłudze Azure SQL Database. W przyszłej wersji silnika bazy danych, ta funkcja zostanie usunięta. Unikaj używania tej funkcji w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie korzystają z tej funkcji.
- Kolumny w tabelach zewnętrznych (PolyBase) (uwaga: używanie tabel zewnętrznych i tabel z zaszyfrowanymi kolumnami w tym samym zapytaniu jest obsługiwane).
Następujące funkcje nie działają w przypadku zaszyfrowanych kolumn:
- Replikacja SQL Server (transakcyjna, scalana lub migawkowa). Obsługiwane są funkcje replikacji fizycznej, w tym zawsze włączonej grupy dostępności.
- Zapytania rozproszone (połączone serwery, OPENROWSET (Transact-SQL), OPENDATASOURCE (Transact-SQL)).
- Zapytania między różnymi bazami danych, które wykonują łączenia w kolumnach zaszyfrowanych z różnych baz danych.
Dokumentacja usługi Always Encrypted Transact-SQL
Funkcja Always Encrypted używa następujących instrukcji Transact-SQL, widoków katalogu systemu, procedur składowanych systemu i uprawnień.
Oświadczenia
instrukcji DDL | Opis |
---|---|
TWORZENIE KLUCZA GŁÓWNEGO KOLUMNY | Tworzy obiekt metadanych klucza głównego dla kolumny w bazie danych |
USUWANIE KLUCZA GŁÓWNEGO KOLUMNY | Odrzuca klucz główny kolumny z bazy danych. |
TWORZENIE KLUCZA SZYFROWANIA KOLUMNY | Tworzy obiekt metadanych klucza szyfrowania kolumny. |
ALTER COLUMN ENCRYPTION KEY | Zmienia klucz szyfrowania kolumny w bazie danych, dodając lub upuszczając zaszyfrowaną wartość. |
USUŃ KLUCZ SZYFROWANIA KOLUMNY | Odrzuca klucz szyfrowania kolumny z bazy danych. |
UTWÓRZ TABELĘ (ZASZYFROWANĄ Z) | Określa szyfrowanie kolumn |
Widoki katalogu systemowego i procedury przechowywane
Widoki katalogu systemu i procedury składowane | Opis |
---|---|
sys.column_encryption_keys | Zwraca informacje o kluczach szyfrowania kolumn (CEKs) |
sys.column_encryption_key_values | Zwraca informacje o zaszyfrowanych wartościach kluczy szyfrowania kolumn (CEKs) |
sys.column_master_keys | Zwraca wiersz dla każdego klucza głównego bazy danych |
sp_refresh_parameter_encryption | Aktualizuje metadane Always Encrypted dla parametrów określonej procedury składowanej bez schematu, funkcji zdefiniowanej przez użytkownika, widoku, wyzwalacza DML, wyzwalacza DDL na poziomie bazy danych lub wyzwalacza DDL na poziomie serwera |
sp_describe_parameter_encryption | Analizuje określoną instrukcję Transact-SQL i jej parametry, aby określić, które parametry odpowiadają kolumnom bazy danych chronionym za pomocą funkcji Always Encrypted. |
Zobacz również sys.columns, aby uzyskać informacje na temat metadanych szyfrowania przechowywanych dla każdej kolumny.
Uprawnienia bazy danych
Istnieją cztery uprawnienia bazy danych dla funkcji Always Encrypted.
widoki katalogu systemowego i procedur składowanych | opis |
---|---|
ZMIENIANIE DOWOLNEGO KLUCZA GŁÓWNEGO KOLUMNY | Wymagane do tworzenia i usuwania metadanych klucza głównego kolumny. |
ZMIENIANIE DOWOLNEGO KLUCZA SZYFROWANIA KOLUMNY | Wymagane do utworzenia i usunięcia metadanych klucza szyfrowania kolumny. |
WYŚWIETLANIE DOWOLNEJ DEFINICJI KLUCZA GŁÓWNEGO KOLUMNY | Wymagane do uzyskiwania dostępu do metadanych klucza głównego kolumny i odczytywania ich, które są wymagane do wykonywania zapytań dotyczących zaszyfrowanych kolumn. |
WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA SZYFROWANIA KOLUMNY | Wymagane do uzyskiwania dostępu do metadanych klucza szyfrowania kolumny i odczytywania ich, które są wymagane do wykonywania zapytań dotyczących zaszyfrowanych kolumn. |
Poniższa tabela zawiera podsumowanie uprawnień wymaganych do typowych akcji.
Scenariusz | ZMIANA DOWOLNEGO GŁÓWNEGO KLUCZA KOLUMNY | ZMIANA DOWOLNEGO KLUCZA SZYFROWANIA KOLUMNY | WYŚWIETL DOWOLNĄ DEFINICJĘ GŁÓWNEGO KLUCZA 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 zagadnienia
WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA GŁÓWNEGO KOLUMNY i WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA SZYFROWANIA KOLUMNY są wymagane podczas wybierania zaszyfrowanych kolumn, nawet jeśli użytkownik nie ma uprawnień do kluczy głównych kolumn (w ich magazynach kluczy). Chroni to kolumny przed nieautoryzowanym dostępem i próbami uzyskania zwykłego tekstu.
W programie SQL Server zarówno WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA GŁÓWNEGO KOLUMNY, jak i WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA SZYFROWANIA KOLUMNY są domyślnie przyznawane stałej roli publicznej bazy danych . Administrator bazy danych może odwołać (lub odmówić) uprawnień do roli publicznej
i przyznać im określone role lub użytkowników w celu zaimplementowania bardziej ograniczonej kontroli. W bazie danych SQL uprawnienia WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA GŁÓWNEGO KOLUMNY oraz WYŚWIETL DOWOLNĄ DEFINICJĘ KLUCZA SZYFROWANIA KOLUMNY nie są domyślnie przyznawane stałej roli bazy danych public. 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 odszyfrowywać), administrator bazy danych musi jawnie przyznać VIEW ANY COLUMN MASTER KEY DEFINITION i VIEW ANY COLUMN ENCRYPTION KEY DEFINITION uprawnienia.