Руководство. Создание и использование индексов в столбцах с поддержкой анклава с помощью случайного шифрования
Область применения: SQL Server 2019 (15.x) и более поздних версий — Windows только База данных SQL Azure
Из этого руководства вы узнаете, как создавать и использовать индексы в столбцах с поддержкой анклава с помощью случайного шифрования, поддерживаемого в функции Always Encrypted с безопасными анклавами. Буду рассмотрены следующие темы.
- создание индекса, если у вас есть доступ к ключам (главный ключ столбца и ключ шифрования столбца), которые обеспечивают защиту столбца.
- создание индекса, если у вас нет доступа к ключам, которые обеспечивают защиту столбца.
Необходимые компоненты
Скачайте последнюю версию SQL Server Management Studio (SSMS).
Убедитесь, что вы выполнили одно из руководств по началу работы с Always Encrypted с безопасными анклавами , прежде чем выполнить приведенные ниже действия, описанные в этом руководстве.
Шаг 1. Включение ускоренного восстановления базы данных (ADR) в базе данных
Примечание.
Этот шаг применяется только к SQL Server. Если вы используете Базу данных SQL Azure, пропустите этот шаг. ADR в Базе данных SQL Azure включен автоматически, и его отключение не поддерживается.
Мы настоятельно рекомендуем вам включить ADR для базы данных, прежде чем создавать первый индекс в столбце с поддержкой анклава с помощью случайного шифрования. Подробные сведения см. в разделе Восстановление базы данных статьи Always Encrypted с безопасными анклавами.
Закройте все экземпляры SSMS, используемые в предыдущем руководстве. Закрытие SSMS закроет подключения к базе данных открытых, что необходимо для включения ADR.
От имени системного администратора откройте новый экземпляр SSMS и подключитесь к своему экземпляру SQL Server без включенной функции Always Encrypted для подключения к базе данных.
- Запустите SSMS.
- В диалоговом окне Соединение с сервером укажите имя сервера, выберите метод аутентификации и введите учетные данные.
- Нажмите Параметры >> и выберите вкладку Always Encrypted.
- Убедитесь, что флажок Включить Always Encrypted (шифрование столбцов)не установлен.
- Нажмите Подключиться.
Откройте новое окно запроса и выполните инструкцию ниже, чтобы включить ADR.
ALTER DATABASE ContosoHR SET ACCELERATED_DATABASE_RECOVERY = ON;
Шаг 2. Создание и проверка индекса без разделения ролей
На этом шаге вы создадите и протестируете индекс в зашифрованном столбце. Вы будете выступать в качестве отдельного пользователя, который выполняет роли администратора базы данных и владельца данных с доступом к ключам, обеспечивающим защиту данных.
Откройте новый экземпляр SSMS и подключитесь к экземпляру SQL Server с включенной функцией Always Encrypted для подключения к базе данных.
- Создайте новый экземпляр SSMS.
- В диалоговом окне Соединение с сервером укажите имя сервера, выберите метод аутентификации и введите учетные данные.
- Нажмите Параметры >> и выберите вкладку Always Encrypted.
- Установите флажки Включить Always Encrypted (шифрование столбцов) и включить безопасные анклава
- Если вы используете аттестацию для базы данных, выберите значение протокола аттестации Анклава, представляющего службу аттестации (Служба защиты узла или Microsoft Аттестация Azure) и заполните URL-адрес аттестации анклава. В противном случае выберите Нет.
- Нажмите Подключиться.
- Если появится запрос на включение параметризации для запросов Always Encrypted, нажмите кнопку "Включить".
Если отобразится запрос на включение параметризации для Always Encrypted, обязательно включите ее.
- Выберите пункт Инструменты в главном меню SSMS.
- Выберите Параметры.
- Выберите Выполнение запроса>SQL Server>Дополнительно.
- Убедитесь, что установлен флажок Включить параметризацию для Always Encrypted.
- Нажмите ОК.
Откройте окно запроса и выполните инструкции ниже, чтобы зашифровать столбец 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
Создайте индекс в столбце LastName. Так как вы подключены к базе данных с включенной функцией Always Encrypted, драйвер клиента в SSMS прозрачно предоставит CEK1 (ключ шифрования столбца, обеспечивающий защиту столбца LastName) анклаву, что необходимо для создания индекса.
CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName]) INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]); GO
Выполните полнофункциональный запрос к столбцу LastName и убедитесь, что SQL Server использует индекс при выполнении запроса.
В том же или в новом окне запроса убедитесь, что кнопка Включить динамическую статистику запросов на панели инструментов активирована.
Выполните приведенный ниже запрос.
DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%'; SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix; GO
На вкладке "Статистика динамических запросов" обратите внимание, что запрос использует индекс.
Шаг 3. Создание индекса с разделением ролей
На этом шаге вы создадите индекс в зашифрованном столбце от имени двух разных пользователей. Один пользователь — это администратор баз данных, который требуется для создания индекса, но который не имеет доступа к ключам. Другой пользователь — это владелец данных с доступом к ключам.
Используя экземпляр SSMS без включенной функции Always Encrypted, выполните инструкцию ниже, чтобы очистить индекс в столбце LastName.
DROP INDEX IX_LastName ON [HR].[Employees]; GO
От имени владельца данных (или приложения с доступом к ключам) поместите CEK1 в кэш в анклаве.
Примечание.
Если после шага 2 не перезагрузили экземпляр SQL Server: создайте и протестируйте индекс без разделения ролей, этот шаг является избыточным, так как CEK1 уже присутствует в кэше. Мы добавили его, чтобы продемонстрировать, как владелец данных может передать ключ в анклав, если он еще не присутствует в нем.
В экземпляре SSMS с включенной функцией Always Encrypted выполните в окне запроса приведенные ниже инструкции. Эта инструкция отправит все ключи шифрования столбцов с поддержкой анклава в анклав. Подробные сведения см. в статье sp_enclave_send_keys (Transact-SQL).
EXEC sp_enclave_send_keys; GO
В качестве альтернативы для вызова указанной выше хранимой процедуры вы можете выполнить запрос DML, который применяет анклав к столбцу LastName. Таким образом в анклав будет введен только CEK1.
DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%'; SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix; GO
Создайте индекс от имени администратора баз данных.
В экземпляре SSMS без включенной функции Always Encrypted выполните в окне запроса приведенные ниже инструкции.
CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName]) INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]); GO
От имени владельца данных выполните полнофункциональный запрос к столбцу LastName и убедитесь, что SQL Server использует индекс при выполнении запроса.
В экземпляре SSMS с включенной функцией Always Encrypted выберите существующее окно запроса или откройте новое и убедитесь, что кнопка Включить динамическую статистику запросов на панели инструментов активирована.
Выполните приведенный ниже запрос.
DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%'; SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix; GO
В статистике динамических запросов обратите внимание, что запрос использует индекс.
Следующие шаги
- Руководство по разработке приложения .NET с помощью Always Encrypted с безопасными анклавами
- Руководство по разработке приложения .NET Framework с помощью Always Encrypted с безопасными анклавами