使用安全 enclave 运行 Transact-SQL 语句

适用于: SQL Server 2019 (15.x) 及更高版本 - 仅限 Windows Azure SQL 数据库

具有安全 enclave 的 Always Encrypted 使某些 Transact-SQL (T-SQL) 语句可对服务器端安全 enclave 中的加密数据库列执行机密计算。

使用安全 enclave 的语句

以下类型的 T-SQL 语句利用了安全 enclave。

使用安全 enclave 的 DDL 语句

以下类型的数据定义语言 (DDL) 语句需要使用安全 enclave。

使用安全 enclave 的 DML 语句

以下数据操作语言 (DML) 语句或针对使用随机加密且已启用 enclave 的列的查询需要使用安全 enclave:

注意

只有使用随机加密且已启用 enclave 的列支持对索引的操作和使用 enclave 的机密 DML 查询。 确定性加密不受支持。

数据库的兼容级别必须设置为 SQL Server 2022 (160) 或更高。

在 Azure SQL 数据库和 SQL Server 2022 (16.x) 中,要在字符串列(charnchar)上使用 Enclave 进行机密查询,要求该列使用二进制码位 (_BIN2) 排序规则或 UTF-8 排序规则。 在 SQL Server 2019 (15.x) 中,需要使用 _BIN2 排序规则。

使用安全 enclave 的 DBCC 命令

如果数据库包含使用随机加密且已启用 Enclave 的列的索引,需要检查索引完整性的 DBCC (Transact-SQL) 管理命令也可能需要使用安全 Enclave。 例如 DBCC CHECKDB (Transact-SQL)DBCC CHECKTABLE (Transact-SQL)

运行使用安全 enclave 的语句的先决条件

环境需要满足以下要求才能支持使用安全 enclave 的执行语句。

  • SQL Server 实例或 Azure SQL 数据库中的数据库服务器必须正确配置为支持 Enclave 和证明。 有关详细信息,请参阅设置安全 enclave 和证明

  • 从应用程序或工具(如 SQL Server Management Studio)连接到数据库时,务必要:

    • 使用支持具有安全 Enclave 的 Always Encrypted 的客户端驱动程序版本或工具版本。

    • 为数据库连接启用 Always Encrypted。

    • 指定证明协议,这将决定应用程序或工具在提交 Enclave 查询之前是否必须证明 Enclave,以及应使用哪种证明服务。 大多数工具和驱动程序都支持以下证明协议:

      • Microsoft Azure 证明 - 使用 Microsoft Azure 证明强制实施证明。
      • 主机保护者服务 - 使用主机保护者服务强制实施证明。
      • 无 - 允许在没有证明的情况下使用 Enclave。

      下表指定对特定 SQL 产品和 Enclave 技术有效的证明协议:

      产品 Enclave 技术 支持的证明协议
      SQL Server 2019 (15.x) 及更高版本 VBS enclave 主机保护者服务,无
      Azure SQL 数据库 SGX Enclave(在 DC 系列数据库中) Microsoft Azure 证明
      Azure SQL 数据库 VBS enclave
  • 如果使用证明,则指定对环境有效的证明 URL。

在 SSMS 中运行使用 enclave 的 T-SQL 语句的先决条件

下载最新版 SQL Server Management Studio (SSMS)

务必在查询窗口中运行语句,该查询窗口应使用正确配置了 Always Encrypted 和证明参数的连接。

  1. 在“连接到服务器”对话框中,指定服务器名称,选择身份验证方法,并指定凭据。

  2. 选择“选项”,然后选择“连接属性”选项卡。指定数据库名称>>

  3. 选择“Always Encrypted”选项卡。

  4. 选择“启用 Always Encrypted(列加密)”

  5. 选择“启用安全 enclave”。

  6. 将“协议”设置为:

    1. 如果使用的是 SQL Server,则为“主机保护者服务”
    2. 如果使用的是具有 Intel SGX Enclave 的 Azure SQL 数据库,则为“Microsoft Azure 证明”
    3. 如果使用的是具有 VBS Enclave 的 Azure SQL 数据库,则为“无”
  7. 指定 Enclave 证明 URL。 当协议设置为“无”时不适用。 例如,https://hgs.bastion.local/Attestationhttps://contososqlattestation.uks.attest.azure.net/attest/SgxEnclave

    Connect to server with attestation using SSMS

  8. 选择“连接” 。

  9. 如果系统提示启用 Always Encrypted 参数化查询,请选择“启用”。

有关详细信息,请参阅 为数据库连接启用和禁用 Always Encrypted

在 Azure Data Studio 中运行使用 enclave 的 T-SQL 语句的先决条件

建议至少使用 1.23 版本或更高版本。 确保在查询窗口中运行语句,该查询窗口使用的连接启用了 Always Encrypted 并正确配置了证明协议和证明 URL。

  1. 在“连接”对话框中,选择“高级...”

  2. 若要为连接启用 Always Encrypted,请将“Always Encrypted”字段设置为“启用”

  3. 若要启用安全 Enclave,请将“安全 Enclave”字段设置为“启用”

  4. 指定证明协议和证明 URL。

    • 如果使用的是 SQL Server,请将“证明协议”设置为“主机保护者服务”,然后在“Enclave 证明 URL”字段中输入主机保护者服务证明 URL。
    • 如果使用的是 Azure SQL 数据库中具有 Intel SGX 的 DC 系列数据库,请将“证明协议”设置为“Azure 证明”,然后在“Enclave 证明 URL”字段中输入引用了 Microsoft Azure 证明中策略的证明 URL。
    • 如果使用的是在 Azure SQL 数据库中启用了 VBS Enclave 的数据库,请将“证明协议”设置为“无”

    Connect to server with attestation using Azure Data Studio

  5. 选择“确定”以关闭“高级属性”

有关详细信息,请参阅 为数据库连接启用和禁用 Always Encrypted

如果你计划运行参数化 DML 查询,则还需启用 Always Encrypted 参数化

示例

本部分包含使用 enclave 的 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)
);
GO

以下查询对加密的 SSN 字符串列执行精确匹配搜索。

DECLARE @SSN char(11) = '795-73-9838';
SELECT * FROM [HR].[Employees] WHERE [SSN] = @SSN;
GO

以下查询对加密的 SSN 字符串列执行模式匹配搜索,搜索具有指定社会安全号码后四位的员工。

DECLARE @SSN char(11) = '795-73-9838';
SELECT * FROM [HR].[Employees] WHERE [SSN] = @SSN;
GO

范围比较

以下查询对加密的 Salary 列执行范围比较,搜索薪水处于指定范围内的员工。

DECLARE @MinSalary money = 40000;
DECLARE @MaxSalary money = 45000;
SELECT * FROM [HR].[Employees] WHERE [Salary] > @MinSalary AND [Salary] < @MaxSalary;
GO

联接

以下查询使用加密的 Salary 列在 EmployeesJobs 表之间执行联接。 该查询检索薪水未处于其职位薪水范围内的员工。

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

排序

以下查询基于加密的 Salary 列对员工记录进行排序,检索薪水前十的员工。

注意

SQL Server 2022 (16.x) 和 Azure SQL 数据库支持加密列排序,但 SQL Server 2019 (15.x) 不支持。

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

后续步骤

另请参阅