Поделиться через


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

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

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

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

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

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

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

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

Примечание.

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

Microsoft настоятельно рекомендует включить 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 Attestation), и заполните 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.

      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. В статистике динамических запросов обратите внимание, что запрос использует индекс.

Следующие шаги

См. также