Zalecane, kiedy należy używać funkcji Always Encrypted usługi Azure SQL Database

Zakończone

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. Funkcja Always Encrypted zapewnia 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 — lokalni administratorzy baz danych, operatorzy baz danych w chmurze lub inni nieautoryzowani użytkownicy z wysokimi uprawnieniami. W związku z tym funkcja Always Encrypted umożliwia klientom bezpieczne przechowywanie poufnych danych w chmurze oraz zmniejsza prawdopodobieństwo kradzieży danych przez złośliwych insideró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 wyszukiwania punktowe lub łączenia przez równość. Takie zapytania używają szyfrowania deterministycznego.

Diagram przedstawiający przykład zawsze zaszyfrowanej bazy danych.

Uwaga / Notatka

Bezpieczne enklawy rozszerzają możliwości poufnego przetwarzania w ramach funkcji Always Encrypted z dopasowywaniem wzorców, innymi operatorami porównania i szyfrowaniem w miejscu.

Funkcja Always Encrypted sprawia, że szyfrowanie jest niewidoczne dla aplikacji. Sterownik z obsługą funkcji Always Encrypted zainstalowany na komputerze klienckim automatycznie szyfruje i odszyfrowuje poufne dane w aplikacji klienckiej. Sterownik szyfruje dane w kolumnach poufnych przed przekazaniem danych do silnika bazy danych. Następnie sterownik automatycznie ponownie zapisuje 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:

  1. Wdrażanie kluczy kryptograficznych 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 kolumny należy przechowywać poza systemem bazy danych w zaufanym magazynie kluczy. Najbardziej typowe lokalizacje magazynu to Usługa Azure Key Vault, magazyn certyfikatów systemu Windows lub sprzętowy moduł zabezpieczeń. Następnie należy wdrożyć klucze szyfrowania kolumn i zaszyfrować 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 zawierają informacje o lokalizacji 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.
  2. Skonfiguruj szyfrowanie dla wybranych kolumn bazy danych zawierających poufne dane, które mają być chronione. Możesz tworzyć nowe tabele z zaszyfrowanymi kolumnami lub szyfrować istniejące kolumny bazy danych i istniejące dane. 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/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 używanych 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:

    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ługują 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ć).

Jak działają zapytania względem zaszyfrowanych kolumn

Należy spełnić zestaw wymagań wstępnych, jeśli użytkownik musi wykonać dowolną z następujących akcji:

  • Uruchamianie zapytania w zaszyfrowanych kolumnach bazy danych
  • Wstawianie danych do zaszyfrowanych kolumn
  • Pobieranie wartości zwykłego tekstu z zaszyfrowanych kolumn
  • Wykonywanie obsługiwanych operacji (na przykład wyszukiwania 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łącz się z bazą 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 / Notatka

Jeśli użytkownik ma wymagane uprawnienia w bazie danych do odczytu danych, ale nie ma dostępu do kluczy chroniących je, działania są możliwe. Użytkownik może pobrać dane szyfrujące (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:

  1. Gdy aplikacja wystawia zapytanie sparametryzowane, sterownik klienta SQL w aplikacji w sposób niewidoczny kontaktuje się z silnikiem bazy danych (wywołując sp_describe_parameter_encryption (Transact-SQL) w celu określenia, które parametry dotyczą zaszyfrowanych kolumn i należy zaszyfrować. 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.
  2. Sterownik wywołuje magazyn kluczy zawierający klucze główne kolumn w celu odszyfrowania wartości klucza szyfrowania kolumn zaszyfrowanych. Wynikowe klucze szyfrowania kolumn w postaci zwykłego tekstu są buforowane w celu zmniejszenia liczby żądań do magazynu kluczy przy kolejnych użyciach tych samych kluczy.
  3. Sterownik używa uzyskanych kluczy szyfrowania kolumn w postaci zwykłego tekstu do szyfrowania parametrów zapytania odpowiadających zaszyfrowanym kolumnom.
  4. 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.
  5. Aparat bazy danych wykonuje zapytanie, które może obejmować porównania równości kolumn przy użyciu szyfrowania deterministycznego.
  6. 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.
  7. Aparat bazy danych wysyła zestaw wyników do aplikacji klienckiej.
  8. Dla każdej zaszyfrowanej kolumny w odebranym zestawie wyników sterownik najpierw próbuje znaleźć klucz deszyfrowania kolumny w lokalnej pamięci podręcznej, a do magazynu kluczy przechowującego klucz główny udaje się tylko wtedy, gdy nie może znaleźć klucza w pamięci podręcznej.
  9. 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.

  • Nie są dozwolone żadne obliczenia dotyczące kolumn zaszyfrowanych przy użyciu szyfrowania losowego.

Uwaga / Notatka

Funkcja Always Encrypted z bezpiecznymi enklawami ogranicza 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. 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..SELECT.
    • Wstawianie literałów do zaszyfrowanych kolumn.

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 atrybutem ROWGUIDCOL.
    • Kolumny ciągu (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 rzadki.
    • Kolumny przywoływane przez 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 szyfrowania deterministycznego, jeśli kolumny referencyjne i odwołujące się używają różnych kluczy lub algorytmów.
    • Kolumny, do których odwołują się ograniczenia sprawdzające .
    • Kolumny przechwycone/śledzone za pomocą przechwytywania zmian danych.
    • Kolumny dla klucza podstawowego w tabelach z włączonym śledzeniem 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. 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.

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

Widoki katalogu systemowego i procedury przechowywane

Aby uzyskać informacje na temat metadanych szyfrowania przechowywanych dla każdej kolumny, zobacz artykuł sys.columns (Transact-SQL).

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.
  • ZMIANA DOWOLNEGO KLUCZA SZYFROWANIA KOLUMN — jest wymagana do tworzenia i usuwania metadanych klucza szyfrowania kolumny.
  • WYŚWIETLENIE DOWOLNEJ DEFINICJI KLUCZA GŁÓWNEGO KOLUMN — wymagane do uzyskania dostępu do metadanych klucza głównego kolumn i ich odczytu, co jest konieczne do wykonywania zapytań dotyczących zaszyfrowanych kolumn.
  • PRZEGLĄDAJ DOWOLNĄ DEFINICJĘ KLUCZA SZYFROWANIA KOLUMNY - Aby uzyskać dostęp do metadanych klucza głównego kolumny, które są potrzebne do wykonywania zapytań do zaszyfrowanych kolumn.

Poniższa tabela zawiera podsumowanie uprawnień wymaganych do typowych akcji.

Scenariusz ZMIANA DOWOLNEGO KLUCZA GŁÓWNEGO KOLUMNY ZMIANA 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 do WYŚWIETLENIA DOWOLNEJ DEFINICJI KLUCZA GŁÓWNEGO KOLUMNY oraz WYŚWIETLENIA DOWOLNEJ DEFINICJI KLUCZA SZYFROWANIA KOLUMNY, nawet jeśli użytkownik nie ma uprawnień do głównych kluczy kolumn (w ich magazynach kluczy), chroniąc kolumny i nie uzyskując dostępu do danych 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 stałej roli publicznej 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 stałej publicznej 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 odszyfrowujemy), administrator bazy danych musi wyraźnie przyznać uprawnienia do wyświetlania definicji klucza głównego dowolnej kolumny i definicji klucza szyfrowania dowolnej kolumny.