使用安全 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 的密钥触发就地加密操作的 ALTER TABLE column_definition (Transact-SQL) 语句。 有关详细信息,请参阅使用具有安全 enclave 的 Always Encrypted 就地配置列加密。
- 使用随机加密创建或更改已启用 enclave 的列上索引的 CREATE INDEX (Transact-SQL) 和 ALTER INDEX (Transact-SQL) 语句。 有关详细信息,请参阅对使用具有安全 enclave 的 Always Encrypted 的列创建和使用索引。
使用安全 enclave 的 DML 语句
以下数据操作语言 (DML) 语句或针对使用随机加密且已启用 enclave 的列的查询需要使用安全 enclave:
- 使用下面的一个或多个 Transact-SQL 运算符(受安全 Enclave 支持)的查询:
- 比较运算符
- BETWEEN (Transact-SQL)
- IN (Transact-SQL)
- LIKE (Transact-SQL)
- DISTINCT
- 联接 - SQL Server 2019 (15.x) 仅支持嵌套循环联接。 SQL Server 2022 (16.x) 和 Azure SQL 数据库支持嵌套循环、哈希和合并联接
- SELECT - ORDER BY 子句 (Transact-SQL)。 在 SQL Server 2022 (16.x) 和 Azure SQL 数据库中受支持。 在 SQL Server 2019 (15.x) 中不支持
- SELECT - GROUP BY 子句 (Transact-SQL)。 在 SQL Server 2022 (16.x) 和 Azure SQL 数据库中受支持。 在 SQL Server 2019 (15.x) 中不支持
- 可插入、更新或删除行的查询,而这些查询会触发向/从已启用 enclave 的列的索引插入和/或删除索引键。 有关详细信息,请参阅 为使用具有安全 Enclave 的 Always Encrypted 的列创建和使用索引
注意
只有使用随机加密且已启用 enclave 的列支持对索引的操作和使用 enclave 的机密 DML 查询。 确定性加密不受支持。
数据库的兼容级别必须设置为 SQL Server 2022 (160) 或更高。
在 Azure SQL 数据库和 SQL Server 2022 (16.x) 中,要在字符串列(char
、nchar
)上使用 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 的客户端驱动程序版本或工具版本。
- 有关支持具有安全 Enclave 的 Always Encrypted 的客户端驱动程序详细信息,请参阅 使用具有安全 Enclave 的 Always Encrypted 开发应用程序。
- 有关支持具有安全 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。
- 如果使用的是 SQL Server 和主机保护者服务 (HGS),请参阅确定并共享 HGS 证明 URL。
- 如果使用的是具有 Intel SGX Enclave 的 Azure SQL 数据库 和 Microsoft Azure 证明,请参阅 确定证明策略的证明 URL。
在 SSMS 中运行使用 enclave 的 T-SQL 语句的先决条件
下载最新版 SQL Server Management Studio (SSMS)。
务必在查询窗口中运行语句,该查询窗口应使用正确配置了 Always Encrypted 和证明参数的连接。
在“连接到服务器”对话框中,指定服务器名称,选择身份验证方法,并指定凭据。
选择“选项”,然后选择“连接属性”选项卡。指定数据库名称>>。
选择“Always Encrypted”选项卡。
选择“启用 Always Encrypted(列加密)”。
选择“启用安全 enclave”。
将“协议”设置为:
- 如果使用的是 SQL Server,则为“主机保护者服务”。
- 如果使用的是具有 Intel SGX Enclave 的 Azure SQL 数据库,则为“Microsoft Azure 证明”。
- 如果使用的是具有 VBS Enclave 的 Azure SQL 数据库,则为“无”。
指定 Enclave 证明 URL。 当协议设置为“无”时不适用。 例如,
https://hgs.bastion.local/Attestation
或https://contososqlattestation.uks.attest.azure.net/attest/SgxEnclave
。选择“连接” 。
如果系统提示启用 Always Encrypted 参数化查询,请选择“启用”。
有关详细信息,请参阅 为数据库连接启用和禁用 Always Encrypted。
在 Azure Data Studio 中运行使用 enclave 的 T-SQL 语句的先决条件
建议至少使用 1.23 版本或更高版本。 确保在查询窗口中运行语句,该查询窗口使用的连接启用了 Always Encrypted 并正确配置了证明协议和证明 URL。
在“连接”对话框中,选择“高级...”。
若要为连接启用 Always Encrypted,请将“Always Encrypted”字段设置为“启用”。
若要启用安全 Enclave,请将“安全 Enclave”字段设置为“启用”。
指定证明协议和证明 URL。
- 如果使用的是 SQL Server,请将“证明协议”设置为“主机保护者服务”,然后在“Enclave 证明 URL”字段中输入主机保护者服务证明 URL。
- 如果使用的是 Azure SQL 数据库中具有 Intel SGX 的 DC 系列数据库,请将“证明协议”设置为“Azure 证明”,然后在“Enclave 证明 URL”字段中输入引用了 Microsoft Azure 证明中策略的证明 URL。
- 如果使用的是在 Azure SQL 数据库中启用了 VBS Enclave 的数据库,请将“证明协议”设置为“无”。
选择“确定”以关闭“高级属性”。
有关详细信息,请参阅 为数据库连接启用和禁用 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
列在 Employees
和 Jobs
表之间执行联接。 该查询检索薪水未处于其职位薪水范围内的员工。
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