Создание и использование индексов в столбцах с помощью Always Encrypted с безопасными анклавами

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

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

Always Encrypted с безопасными анклавами поддерживает следующие типы индексов.

  • Кластеризованные и некластеризованные индексы в столбцах, зашифрованных с использованием детерминированного шифрования и ключей с поддержкой анклава.
    • Такие индексы сортируются на основе значений зашифрованного текста. Специальные рекомендации для них отсутствуют. Ими можно управлять и использовать так же, как индексы в столбцах, зашифрованных с помощью детерминированного шифрования и ключей без поддержки анклава (как в случае с Always Encrypted).
  • Некластеризованные индексы в столбцах, зашифрованных с использованием случайного шифрования и ключей с поддержкой анклава.
    • Значения ключей в структуре данных индекса (сбалансированное дерево) шифруются и сортируются по значениям в формате открытого текста. Дополнительные сведения см. в разделе Индексы в столбцах с поддержкой анклавов.

Примечание.

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

Поскольку индекс столбца, зашифрованного с помощью случайного шифрования и использующего ключ шифрования столбца с поддержкой анклава, содержит зашифрованные данные (зашифрованный текст), отсортированные по значениям в открытом тексте, ядро SQL Server вынуждено использовать анклав для любых операций, подразумевающих создание, обновление или поиск индекса, в том числе:

  • создание или перестроение индекса;
  • Вставка, обновление или удаление строки в таблице (содержащей индексированный и зашифрованный столбец), которое активирует вставку ключа в индекс и (или) удаление ключа из индекса.
  • Выполнение команд DBCC, которые подразумевают проверку целостности индексов, например DBCC CHECKDB (Transact-SQL) или DBCC CHECKTABLE (Transact-SQL).
  • Восстановление базы данных (например, после сбоя и перезапуска SQL Server), если оно включает отмену любых операций с индексом (см. более подробное описание ниже).

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

  • напрямую из клиентского приложения;
  • Из кэша ключей шифрования столбцов.

Вызов операций индексирования с ключами шифрования столбцов, полученными напрямую от клиента

Чтобы операции индексирования работали в такой конфигурации, выполняющее соответствующий запрос приложение (включая средство, такое как SQL Server Management Studio (SSMS)) должно сделать следующее.

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

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

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

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

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

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

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

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

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

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

Этот метод полезен в следующих случаях.

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

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

    DELETE FROM [dbo].[Employees] WHERE [EmployeeID] = 1;
    GO
    

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

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

Совет

sp_enclave_send_keys (Transact-SQL) позволяет легко отправлять все ключи шифрования столбцов с поддержкой анклава, используемые для индексов, в анклав и заполнять кэш ключей.

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

Next Steps

См. также