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


Выполнение инструкций Transact-SQL с помощью безопасных анклавов

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

Always Encrypted с безопасными анклавами позволяет некоторым инструкциям Transact-SQL (T-SQL) выполнять конфиденциальные вычисления над зашифрованными столбцами базы данных в безопасном анклаве на стороне сервера.

Инструкции, использующие безопасные анклавы

Безопасные анклавы используются следующими типами инструкций T-SQL.

Инструкции DDL, использующие безопасные анклавы

Безопасные анклавы требуются для выполнения следующих типов инструкций языка описания данных (DDL).

Инструкции DML, использующие безопасные анклавы

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

Примечание.

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

Уровень совместимости базы данных следует установить на SQL Server 2022 (160) или более поздней версии.

В базе данных SQL Azure и SQL Server 2022 (16.x) конфиденциальные запросы, использующие анклавы в столбце символьной строки (char, nchar), требуют, чтобы столбец использовал сортировку с бинарной точкой (_BIN2) или кодировку UTF-8. В SQL Server 2019 (15.x) необходима сортировка a_BIN2.

Команды DBCC, использующие безопасные анклавы

Административные команды DBCC, связанные с проверкой целостности индексов, также могут требовать безопасных анклавов, если база данных содержит индексы для столбцов с поддержкой анклавов с использованием случайного шифрования. Например, DBCC CHECKDB и DBCC CHECKTABLE.

Необходимые условия для выполнения инструкций, использующих безопасные анклавы

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

  • Ваш экземпляр SQL Server или сервер базы данных в базе данных Azure SQL должен быть правильно настроен для поддержки анклавов и аттестации, если это применимо/необходимо. Дополнительные сведения см. в статье Настройка безопасного анклава и аттестации.

  • При подключении к базе данных из приложения или средства (например, SQL Server Management Studio) обязательно выполните следующие действия.

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

      • Сведения о клиентских драйверах, поддерживающих Always Encrypted с безопасными анклавами, см. в статье "Разработка приложений с помощью Always Encrypted с безопасными анклавами".
      • Дополнительные сведения о средствах поддержки Always Encrypted с безопасными анклавами см. в следующих разделах.
    • Включите Always Encrypted для подключения к базе данных.

    • Укажите протокол аттестации, который определяет, должно ли приложение или средство проверить анклав перед отправкой запросов анклава и какую службу аттестации она должна использовать. Большинство средств и драйверов поддерживают следующие протоколы аттестации:

      • Аттестация Microsoft Azure — обеспечивает аттестацию с помощью Microsoft Azure Attestation.
      • Служба защиты узлов — применяет аттестацию с помощью Службы защиты узлов.
      • Нет — позволяет использовать анклавы без аттестации.

      В следующей таблице указаны протоколы аттестации, допустимые для определенных продуктов SQL и анклавных технологий:

      Продукт Технология анклава Поддерживаемые протоколы аттестации
      SQL Server 2019 (15.x) и более поздних версий Анклавы VBS Служба управления защитой хоста, отсутствует
      База данных SQL Azure Анклавы SGX (в базах данных серии DC) Аттестация Microsoft Azure
      База данных SQL Azure Анклавы VBS нет
  • Укажите URL-адрес, допустимый в вашей среде, если вы используете подтверждение подлинности.

Необходимые условия для выполнения инструкций T-SQL, использующих анклавы, в SSMS

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

Убедитесь, что вы запускаете инструкции из окна запроса, использующего подключение с правильно настроенными параметрами Always Encrypted и аттестации.

  1. В диалоговом окне Соединение с сервером укажите имя сервера, выберите метод аутентификации и введите учетные данные.

  2. Выберите "Параметры >> " и выберите вкладку "Свойства подключения". Укажите имя базы данных.

  3. Выберите вкладку Always Encrypted.

  4. Выберите Включить Always Encrypted (шифрование столбцов).

  5. Выберите "Включить безопасные анклавы".

  6. Задайте для протокола следующее:

    1. Служба охраны хоста, если вы используете SQL Server.
    2. Аттестация Microsoft Azure, если вы используете СУБД Azure SQL с анклавами Intel SGX.
    3. Нет, если вы используете База данных SQL Azure с анклавами VBS.
  7. Укажите URL-адрес подтверждения анклава. Неприменимо, если для протокола задано значение None. Например, https://hgs.bastion.local/Attestation или https://contososqlattestation.uks.attest.azure.net/attest/SgxEnclave.

    Снимок экрана: подключение к серверу с аттестацией с помощью SSMS.

  8. Нажмите Подключиться.

  9. Если отобразится запрос на включение параметризации для запросов Always Encrypted, нажмите кнопку Включить.

Дополнительные сведения см. в разделе "Включение и отключение Always Encrypted" для подключения к базе данных.

Примеры

В этом разделе приводятся примеры запросов DML, использующих анклавы.

В примерах используется приведенная ниже схема.

CREATE SCHEMA [HR];
GO

CREATE TABLE [HR].[Jobs](
 [JobID] [int] IDENTITY(1,1) PRIMARY KEY,
 [JobTitle] [nvarchar](50) NOT NULL,
 [MinSalary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
 [MaxSalary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
);
GO

CREATE TABLE [HR].[Employees](
 [EmployeeID] [int] IDENTITY(1,1) PRIMARY KEY,
 [SSN] [char](11) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
 [FirstName] [nvarchar](50) NOT NULL,
 [LastName] [nvarchar](50) NOT NULL,
 [Salary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
 [JobID] [int] NULL,
 FOREIGN KEY (JobID) REFERENCES [HR].[Jobs] (JobID)
);

Приведенный ниже запрос выполняет поиск точного совпадения в зашифрованном строковом столбце SSN.

DECLARE @SSN AS CHAR (11) = '795-73-9838';

SELECT *
FROM [HR].[Employees]
WHERE [SSN] = @SSN;

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

DECLARE @SSN AS CHAR (11) = '795-73-9838';

SELECT *
FROM [HR].[Employees]
WHERE [SSN] = @SSN;

Сравнение диапазонов

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

DECLARE @MinSalary AS MONEY = 40000;
DECLARE @MaxSalary AS MONEY = 45000;

SELECT *
FROM [HR].[Employees]
WHERE [Salary] > @MinSalary
      AND [Salary] < @MaxSalary;

Объединения

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

SELECT *
FROM [HR].[Employees] AS e
     INNER JOIN [HR].[Jobs] AS j
         ON e.[JobID] = j.[JobID]
        AND e.[Salary] > j.[MaxSalary]
        OR e.[Salary] < j.[MinSalary];

Сортировка

В приведенном ниже запросе сортируются записи сотрудников на основе зашифрованного столбца Salary и выводятся 10 сотрудников с самыми высокими окладами.

Примечание.

Сортировка зашифрованных столбцов поддерживается в SQL Server 2022 (16.x) и База данных SQL Azure, но не в SQL Server 2019 (15.x).

SELECT TOP (10) *
FROM [HR].[Employees]
ORDER BY [Salary] DESC;

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