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

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

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

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

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

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

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

Примечание

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

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

  1. Закройте все экземпляры 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 (шифрование столбцов) и укажите URL-адрес аттестации анклава (например, http://hgs.bastion.local/Attestation или https://MyAttestationProvider.us.attest.azure.net/attest/SgxEnclave).
    5. Щелкните Подключить.
    6. Если отобразится запрос на включение параметризации для запросов 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 в кэш в анклаве.

    Примечание

    Если вы не перезапустили экземпляр SQL Server после шага 2 (создание и тестирование индекса без разделения ролей) , этот шаг выполнять не нужно, так как 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. На вкладке Статистика динамических запросов (в нижней части окна запроса) убедитесь, что запрос использует индекс.

Дальнейшие действия

См. также раздел