Udostępnij za pośrednictwem


Samouczek: tworzenie i używanie indeksów w kolumnach z obsługą enklawy przy użyciu szyfrowania losowego

Dotyczy: SQL Server 2019 (15.x) i nowszych — tylko dla Windows Azure SQL Database

W tym samouczku przedstawiono sposób tworzenia i używania indeksów w kolumnach z włączoną obsługą enklaw przy użyciu losowego szyfrowania obsługiwanego w usłudze Always Encrypted z użyciem bezpiecznych enklaw. Pokaże ci:

  • Jak utworzyć indeks, gdy masz dostęp do kluczy (klucza głównego kolumny i klucza szyfrowania kolumny) chroniących kolumnę.
  • Jak utworzyć indeks, gdy nie masz dostępu do kluczy chroniących kolumnę.

Warunki wstępne

Pobierz najnowszą wersję programu SQL Server Management Studio (SSMS).

Upewnij się, że ukończono jeden z samouczków Wprowadzenie do korzystania z funkcji Always Encrypted z bezpiecznymi enklawami, zanim przystąpisz do wykonania poniższych kroków w tym samouczku.

Krok 1. Włączanie przyspieszonego odzyskiwania bazy danych (ADR) w bazie danych

Notatka

Ten krok dotyczy tylko programu SQL Server. Jeśli używasz usługi Azure SQL Database lub azure SQL Managed Instance, pomiń ten krok. Reguły ADR są zawsze włączone w usługach Azure SQL Database i Azure SQL Managed Instance.

Microsoft zdecydowanie zaleca włączenie funkcji ADR w bazie danych przed utworzeniem pierwszego indeksu na kolumnie obsługującej enklawę, używając szyfrowania losowego. Zobacz sekcję odzyskiwania bazy danych w Always Encrypted z bezpiecznymi enklawami.

  1. Zamknij wszystkie wystąpienia programu SSMS używane w poprzednim samouczku. Zamknięcie programu SSMS spowoduje zamknięcie otwartych połączeń z bazą danych, co jest wymagane do włączenia funkcji ADR.

  2. Otwórz nowe wystąpienie programu SSMS i połącz się z wystąpieniem programu SQL Server jako sysadmin , nie włączając funkcji "Always Encrypted" dla połączenia z bazą danych.

    1. Uruchom program SSMS.
    2. W oknie dialogowym Połącz z serwerem określ nazwę serwera, wybierz metodę uwierzytelniania i określ poświadczenia.
    3. Wybierz Opcje >> i kartę Always Encrypted.
    4. Upewnij się, że pole wyboru Włącz funkcję Always Encrypted (szyfrowanie kolumn) nie jest zaznaczone .
    5. Wybierz Connect.
  3. Otwórz nowe okno zapytania i wykonaj poniższą instrukcję, aby włączyć reguły ADR.

    ALTER DATABASE ContosoHR SET ACCELERATED_DATABASE_RECOVERY = ON;
    

Krok 2. Tworzenie i testowanie indeksu bez separacji ról

W tym kroku utworzysz i przetestujesz indeks w zaszyfrowanej kolumnie. Będziesz działać jako jeden użytkownik, który przyjmuje role zarówno administratora bazy danych, który zarządza bazą danych, jak i właściciel danych, który ma dostęp do kluczy, chroniąc dane.

  1. Otwórz nowe wystąpienie programu SSMS i połącz się z twoim wystąpieniem programu SQL Server , używając opcji z włączoną funkcją Always Encrypted dla połączenia z bazą danych.

    1. Uruchom nowe wystąpienie programu SSMS.
    2. W oknie dialogowym Połącz z serwerem określ nazwę serwera, wybierz metodę uwierzytelniania i określ poświadczenia.
    3. Wybierz Opcje >> i kartę Always Encrypted.
    4. Zaznacz pola wyboru Włącz funkcję Always Encrypted (szyfrowanie kolumn) i Włącz bezpieczne enklawy
    5. Jeśli używasz zaświadczania dla bazy danych, wybierz wartość protokołu zaświadczania enklawy, która reprezentuje twoją usługę zaświadczania (Host Guardian Service lub Microsoft Azure Attestation) i podaj adres URL zaświadczania enklawy. W przeciwnym razie wybierz pozycję Brak.
    6. Wybierz Connect.
    7. Jeśli zostanie wyświetlony monit o włączenie parametryzacji zapytań Always Encrypted, wybierz pozycję Włącz.
  2. Jeśli nie zostanie wyświetlony monit o włączenie parametryzacji dla funkcji Always Encrypted, sprawdź, czy jest on włączony.

    1. Wybierz pozycję Tools z menu głównego programu SSMS.
    2. Wybierz Opcje....
    3. Przejdź do Wykonywanie zapytań>programu SQL Server>Advanced.
    4. Upewnij się, że zaznaczono Włącz parametryzację dla Always Encrypted.
    5. Wybierz pozycję OK.
  3. Otwórz okno zapytania i wykonaj poniższe instrukcje, aby zaszyfrować kolumnę LastName w tabeli Employees. Utworzysz i użyjesz indeksu w tej kolumnie w kolejnych krokach.

    ALTER TABLE [HR].[Employees]
    ALTER COLUMN [LastName] [nvarchar](50) COLLATE Latin1_General_BIN2 
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL;
    GO   
    ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
    GO
    
  4. Utwórz indeks w kolumnie LastName. Ponieważ masz połączenie z bazą danych z włączoną funkcją Always Encrypted, sterownik klienta w programie SSMS w przezroczysty sposób udostępnia CEK1 (klucz szyfrowania kolumny, chroniący kolumnę LastName) do enklawy, co jest konieczne do utworzenia indeksu.

    CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName])
    INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]);
    GO
    
  5. Uruchom zaawansowane zapytanie w kolumnie LastName i sprawdź, czy program SQL Server używa indeksu podczas wykonywania zapytania.

    1. W tym samym lub nowym oknie zapytania upewnij się, że przycisk Uwzględnij statystyki zapytań na żywo na pasku narzędzi jest włączony.

    2. Wykonaj poniższe zapytanie.

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
    3. Na karcie Statystyki zapytań na żywo zwróć uwagę, że zapytanie używa indeksu.

Krok 3. Tworzenie indeksu z separacją ról

W tym kroku utworzysz indeks w zaszyfrowanej kolumnie, udając dwóch różnych użytkowników. Jeden z użytkowników jest administratorem bazy danych, który musi utworzyć indeks, ale nie ma dostępu do kluczy. Inny użytkownik jest właścicielem danych, który ma dostęp do kluczy.

  1. Używając wystąpienia programu SSMS bez włączonego Always Encrypted, wykonaj poniższą instrukcję, aby usunąć indeks z kolumny LastName.

    DROP INDEX IX_LastName ON [HR].[Employees]; 
    GO
    
  2. Działając jako właściciel danych (lub aplikacja, która ma dostęp do kluczy), wypełnij pamięć podręczną wewnątrz enklawy za pomocą CEK1.

    Notatka

    Jeśli nie uruchomiłeś ponownie instancji SQL Server po Krok 2. Tworzenie i testowanie indeksu bez separacji ról, ten krok jest zbędny, ponieważ CEK1 jest już obecny w cache. Dodaliśmy go, aby zademonstrować, jak właściciel danych może podać klucz do enklawy, jeśli nie jest jeszcze obecny w enklawie.

    1. W wystąpieniu programu SSMS , z włączoną funkcją Always Encrypted, w oknie zapytania wykonaj poniższe instrukcje. Instrukcja wysyła wszystkie klucze szyfrowania kolumn obsługujące enklawę do enklawy. Aby uzyskać szczegółowe informacje, zobacz sp_enclave_send_keys.

      EXEC sp_enclave_send_keys;
      GO
      
    2. Alternatywą dla wykonania powyższej procedury składowanej jest uruchomienie zapytania DML, które używa enklawy względem kolumny LastName. Wypełni to enklawę tylko elementami CEK1.

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
  3. Działając jako administrator bazy danych, utwórz indeks.

    1. W instancji SSMS , bez włączonej funkcji Always Encrypted, wykonaj poniższe instrukcje w oknie zapytań.

      CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName])
      INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]);
      GO
      
  4. Jako właściciel danych uruchom zaawansowane zapytanie w kolumnie LastName i sprawdź, czy program SQL Server używa indeksu podczas wykonywania zapytania.

    1. W wystąpieniu programu SSMS z włączoną funkcją Always Encrypted, wybierz istniejące okno zapytania lub otwórz nowe okno zapytania. Upewnij się, że na pasku narzędzi jest włączony przycisk Uwzględnij statystyki zapytań na żywo.

    2. Wykonaj poniższe zapytanie.

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
    3. W statystykach zapytań na żywozauważ, że zapytanie używa indeksu.

Następne kroki

Zobacz też