Руководство. Создание и использование индексов в столбцах с поддержкой анклава с помощью случайного шифрования

Область применения: SQL Server 2019 (15.x) и более поздних версий — только база данных SQL Azure Для Windows

Из этого руководства вы узнаете, как создавать и использовать индексы в столбцах с поддержкой анклава с помощью случайного шифрования, поддерживаемого в функции Always Encrypted с безопасными анклавами. Буду рассмотрены следующие темы.

  • создание индекса, если у вас есть доступ к ключам (главный ключ столбца и ключ шифрования столбца), которые обеспечивают защиту столбца.
  • создание индекса, если у вас нет доступа к ключам, которые обеспечивают защиту столбца.

Предварительные условия

Скачайте последнюю версию SQL Server Management Studio (SSMS).

Убедитесь, что вы выполнили одно из руководств по началу работы с Always Encrypted с безопасными анклавами , прежде чем выполнить приведенные ниже действия, описанные в этом руководстве.

Шаг 1. Включение ускоренного восстановления базы данных (ADR) в базе данных

Заметка

Этот шаг применяется только к SQL Server. Если вы используете Базу данных SQL Azure, пропустите этот шаг. ADR в Базе данных SQL Azure включен автоматически, и его отключение не поддерживается.

Мы настоятельно рекомендуем вам включить ADR для базы данных, прежде чем создавать первый индекс в столбце с поддержкой анклава с помощью случайного шифрования. Подробные сведения см. в разделе Восстановление базы данных статьи Always Encrypted с безопасными анклавами.

  1. Закройте все экземпляры SSMS, используемые в предыдущем руководстве. Закрытие SSMS закроет открытые подключения к базе данных, что необходимо для включения ADR.

  2. От имени системного администратора откройте новый экземпляр SSMS и подключитесь к своему экземпляру SQL Server без включенной функции Always Encrypted для подключения к базе данных.

    1. Запустите SSMS.
    2. В диалоговом окне Соединение с сервером укажите имя сервера, выберите метод аутентификации и введите учетные данные.
    3. Нажмите Параметры >> и выберите вкладку Always Encrypted.
    4. Убедитесь, что флажок Включить Always Encrypted (шифрование столбцов)не установлен.
    5. Нажмите Подключиться.
  3. Откройте новое окно запроса и выполните инструкцию ниже, чтобы включить ADR.

    ALTER DATABASE ContosoHR SET ACCELERATED_DATABASE_RECOVERY = ON;
    

Шаг 2. Создание и проверка индекса без разделения ролей

На этом шаге вы создадите и протестируете индекс в зашифрованном столбце. Вы будете выступать в качестве отдельного пользователя, который выполняет роли администратора базы данных и владельца данных с доступом к ключам, обеспечивающим защиту данных.

  1. Откройте новый экземпляр SSMS и подключитесь к экземпляру SQL Server с включенной функцией Always Encrypted для подключения к базе данных.

    1. Создайте новый экземпляр SSMS.
    2. В диалоговом окне Соединение с сервером укажите имя сервера, выберите метод аутентификации и введите учетные данные.
    3. Нажмите Параметры >> и выберите вкладку Always Encrypted.
    4. Установите флажки Включить Always Encrypted (шифрование столбцов) и включить безопасные анклава
    5. Если вы используете аттестацию для базы данных, выберите значение протокола аттестации Анклава, представляющего службу аттестации (служба защиты узла или аттестацию Microsoft Azure) и заполните URL-адрес аттестации анклава. В противном случае выберите Нет.
    6. Нажмите Подключиться.
    7. Если появится запрос на включение параметризации для запросов Always Encrypted, нажмите кнопку "Включить".
  2. Если отобразится запрос на включение параметризации для Always Encrypted, обязательно включите ее.

    1. Выберите пункт Инструменты в главном меню SSMS.
    2. Выберите Параметры.
    3. Выберите Выполнение запроса>SQL Server>Дополнительно.
    4. Убедитесь, что установлен флажок Включить параметризацию для Always Encrypted.
    5. Нажмите ОК.
  3. Откройте окно запроса и выполните инструкции ниже, чтобы зашифровать столбец LastName в таблице Employees. Вы создадите и будете использовать индекс в таком столбце на следующих шагах.

    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. Создайте индекс в столбце LastName. Так как вы подключены к базе данных с включенной функцией Always Encrypted, драйвер клиента в SSMS прозрачно предоставит CEK1 (ключ шифрования столбца, обеспечивающий защиту столбца LastName) анклаву, что необходимо для создания индекса.

    CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName])
    INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]);
    GO
    
  5. Выполните полнофункциональный запрос к столбцу LastName и убедитесь, что SQL Server использует индекс при выполнении запроса.

    1. В том же или в новом окне запроса убедитесь, что кнопка Включить динамическую статистику запросов на панели инструментов активирована.

    2. Выполните приведенный ниже запрос.

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
    3. На вкладке "Статистика динамических запросов" обратите внимание, что запрос использует индекс.

Шаг 3. Создание индекса с разделением ролей

На этом шаге вы создадите индекс в зашифрованном столбце от имени двух разных пользователей. Один пользователь — это администратор баз данных, который требуется для создания индекса, но который не имеет доступа к ключам. Другой пользователь — это владелец данных с доступом к ключам.

  1. Используя экземпляр SSMS без включенной функции Always Encrypted, выполните инструкцию ниже, чтобы очистить индекс в столбце LastName.

    DROP INDEX IX_LastName ON [HR].[Employees]; 
    GO
    
  2. От имени владельца данных (или приложения с доступом к ключам) поместите CEK1 в кэш в анклаве.

    Заметка

    Если после шага 2 не перезагрузили экземпляр SQL Server: создайте и протестируйте индекс без разделения ролей, этот шаг является избыточным, так как CEK1 уже присутствует в кэше. Мы добавили его, чтобы продемонстрировать, как владелец данных может передать ключ в анклав, если он еще не присутствует в нем.

    1. В экземпляре SSMS с включенной функцией Always Encrypted выполните в окне запроса приведенные ниже инструкции. Эта инструкция отправит все ключи шифрования столбцов с поддержкой анклава в анклав. Подробные сведения см. в статье sp_enclave_send_keys (Transact-SQL).

      EXEC sp_enclave_send_keys;
      GO
      
    2. В качестве альтернативы для вызова указанной выше хранимой процедуры вы можете выполнить запрос DML, который применяет анклав к столбцу LastName. Таким образом в анклав будет введен только CEK1.

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
  3. Создайте индекс от имени администратора баз данных.

    1. В экземпляре SSMS без включенной функции Always Encrypted выполните в окне запроса приведенные ниже инструкции.

      CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName])
      INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]);
      GO
      
  4. От имени владельца данных выполните полнофункциональный запрос к столбцу LastName и убедитесь, что SQL Server использует индекс при выполнении запроса.

    1. В экземпляре SSMS с включенной функцией Always Encrypted выберите существующее окно запроса или откройте новое и убедитесь, что кнопка Включить динамическую статистику запросов на панели инструментов активирована.

    2. Выполните приведенный ниже запрос.

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
    3. В статистике динамических запросов обратите внимание, что запрос использует индекс.

Далее

См. также