使用安全 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

    使用 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 的数据库,请将“证明协议”设置为“无”

    使用 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

后续步骤

另请参阅