你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程:在 Azure SQL 数据库中开始使用具有 VBS enclave 的 Always Encrypted
适用于:Azure SQL 数据库
本教程介绍如何利用基于虚拟化的安全性 (VBS) enclave 在 Azure SQL 数据库中开始使用具有安全 enclave 的 Always Encrypted。 它将介绍:
- 如何创建环境,以便测试和评估具有 VBS enclave 的 Always Encrypted。
- 如何使用 SQL Server Management Studio (SSMS) 就地加密数据并就加密列发出各种机密查询。
先决条件
- 一个有效的 Azure 订阅。 如果没有帐户,请创建一个免费帐户。 你需要是订阅的参与者角色或所有者角色的成员才能创建资源。
- 可选,但建议用于存储 Always Encrypted 的列主密钥:Azure Key Vault 中的密钥保管库。 有关如何创建密钥保管库的信息,请参阅快速入门:使用 Azure 门户创建密钥保管库。
- 如果密钥保管库使用访问策略权限模型,请确保你在密钥保管库中具有以下密钥权限:
get
、list
、create
、unwrap key
、wrap key
、verify
、sign
。 请参阅分配密钥保管库访问策略。 - 如果使用 Azure 基于角色的访问控制 (RBAC) 权限模型,请确保你是密钥保管库的密钥保管库加密管理人员角色的成员。 请参阅使用 Azure 基于角色的访问控制提供对密钥保管库密钥、证书和机密的访问权限。
- 如果密钥保管库使用访问策略权限模型,请确保你在密钥保管库中具有以下密钥权限:
工具要求
本教程需要用到 SQL Server Management Studio (SSMS)。 可以选择使用 PowerShell 或 Azure CLI 来启用 VBS enclave。
步骤 1:创建并配置服务器和数据库
在此步骤中,你将创建新的 Azure SQL 数据库逻辑服务器和新数据库。
转到快速入门:创建单一数据库 - Azure SQL 数据库,并按照创建单一数据库部分中的说明创建新的 Azure SQL 数据库逻辑服务器和新数据库。
重要
请确保创建采用名称 ContosoHR 的空数据库(而非示例数据库)。
步骤 2:启用 VBS enclave
在此步骤中,你将在数据库中启用 VBS enclave,这是具有安全 enclave 的 Always Encrypted 所必需的。 要在数据库中启用 VBS enclave,需要将 preferredEnclaveType 数据库属性设置为 VBS。
打开 Azure 门户并查找要为其启用安全 enclave 的数据库。
在“安全”设置中,选择“数据加密”。
在“数据加密”菜单中,选择“Always Encrypted”选项卡。
将“启用安全 enclave”设置为“开启”。 如果已设置为“开启”,请继续执行下一步。
若要保存 Always Encrypted 配置,请选择“保存”。
步骤 3:填充数据库
此步骤将创建一个表,并使用一些稍后将加密和查询的数据填充该表。
打开 SSMS 并连接到 Azure SQL 逻辑服务器(在数据库连接中未启用 Always Encrypted 的情况下创建)中的 ContosoHR 数据库 。
在“连接到服务器”对话框中,指定服务器的完全限定名称(例如 myserver135.database.windows.net),并输入在创建服务器时指定的管理员用户名和密码。
选择“选项 >>”,然后选择“连接属性”选项卡。确保选择“ContosoHR”数据库(而不是默认的
master
数据库)。选择“Always Encrypted”选项卡。
务必取消选中“启用 Always Encrypted (列加密)”复选框。
选择“连接”。
新建名为“Employees”的表。
CREATE SCHEMA [HR]; GO CREATE TABLE [HR].[Employees] ( [EmployeeID] [int] IDENTITY(1,1) NOT NULL, [SSN] [char](11) NOT NULL, [FirstName] [nvarchar](50) NOT NULL, [LastName] [nvarchar](50) NOT NULL, [Salary] [money] NOT NULL ) ON [PRIMARY]; GO
向“Employees”表添加一些员工记录。
INSERT INTO [HR].[Employees] ([SSN] ,[FirstName] ,[LastName] ,[Salary]) VALUES ('795-73-9838' , N'Catherine' , N'Abel' , $31692); INSERT INTO [HR].[Employees] ([SSN] ,[FirstName] ,[LastName] ,[Salary]) VALUES ('990-00-6818' , N'Kim' , N'Abercrombie' , $55415);
步骤 4:预配已启用 enclave 的密钥
此步骤将创建允许 enclave 计算的列主密钥和列加密密钥。
使用上一步中的 SSMS 实例在“对象资源管理器”中展开数据库,并依次转到“安全性”>“Always Encrypted 密钥”。
预配已启用 enclave 的新列主密钥:
- 右键单击“Always Encrypted 密钥”,然后选择“新列主密钥...” 。
- 输入新列主密钥的名称:CMK1。
- 验证是否选中了“允许 enclave 计算”。 (如果为数据库启用了安全 enclave,则默认选中此选项 - 由于数据库使用 DC 系列硬件配置,因此应启用此选项。)
- 选择“Azure Key Vault”(建议)或“Windows 证书存储”(“当前用户”或“本地计算机”)。
- 如果选择“Azure Key Vault”,请登录到 Azure,选择包含要使用的密钥保管库的 Azure 订阅,然后选择你的密钥保管库。 选择“生成密钥”以创建新密钥。
- 如果选择“Windows 证书存储”,请选择“生成证书”按钮以创建新证书。
- 选择“确定”。
创建已启用 enclave 的新列加密密钥:
- 右键单击“Always Encrypted 密钥”,然后选择“新建列加密密钥” 。
- 输入新列加密密钥的名称:CEK1。
- 在“列主密匙”下拉列表中,选择在上一步骤创建的列主密钥。
- 选择“确定”。
步骤 5:就地加密部分列
这一步将在服务器端 enclave 内加密“SSN”和“Salary”列中存储的数据,然后对数据测试 SELECT 查询 。
打开新的 SSMS 实例并连接到数据库,同时为数据库连接启用 Always Encrypted。
启动新 SSMS 实例。
在“连接到服务器”对话框中,指定服务器的完全限定名称(例如 myserver135.database.windows.net),并输入在创建服务器时指定的管理员用户名和密码。
选择“选项 >>”,然后选择“连接属性”选项卡。确保选择“ContosoHR”数据库(而不是默认的
master
数据库)。选择“Always Encrypted”选项卡。
选中“启用 Always Encrypted (列加密)”复选框。
选择“启用安全 enclave”。
将“协议”设置为“无”。 请参阅以下屏幕截图。
选择“连接”。
如果系统提示启用 Always Encrypted 参数化查询,请选择“启用”。
使用相同的 SSMS 实例(已启用 Always Encrypted)打开新查询窗口,并通过运行以下语句来加密“SSN”和“Salary”列 。
ALTER TABLE [HR].[Employees] ALTER COLUMN [SSN] [char] (11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL WITH (ONLINE = ON); ALTER TABLE [HR].[Employees] ALTER COLUMN [Salary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL WITH (ONLINE = ON); ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
注意
在上面的脚本中,ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE 语句为数据库清除查询计划缓存。 更改表后,需要清除访问该表的所有批处理和存储过程的计划,以刷新参数加密信息。
若要验证“SSN”和“Salary”列现在是否已加密,请使用没有为数据库连接启用 Always Encrypted 的 SSMS 实例打开新查询窗口,并执行以下语句。 查询窗口应返回“SSN”和“Salary”列中的加密值。 如果使用已启用 Always Encrypted 的 SSMS 实例执行相同查询,应该会看到已解密的数据。
SELECT * FROM [HR].[Employees];
步骤 6:对加密列运行丰富查询
你可以对加密列运行丰富查询。 部分查询处理将在服务器端 enclave 内执行。
在已启用 Always Encrypted 的SSMS 实例中,请确保也启用了 Always Encrypted 参数化。
- 在 SSMS 的主菜单中,选择“工具”。
- 选择“选项...”。
- 导航到“查询执行”>“SQL Server”>“高级”。
- 务必选中“启用 Always Encrypted 参数化”。
- 选择“确定”。
打开一个新的查询窗口,粘贴到下面的查询中,然后执行。 该查询应返回满足指定搜索条件的纯文本值和行。
DECLARE @SSNPattern [char](11) = '%6818'; DECLARE @MinSalary [money] = $1000; SELECT * FROM [HR].[Employees] WHERE SSN LIKE @SSNPattern AND [Salary] >= @MinSalary;
在未启用 Always Encrypted 的 SSMS 实例中重试同一查询。 应该会发生故障。
后续步骤
完成本教程之后,可以继续学习以下教程之一:
- 教程:使用具有安全 enclave 的 Always Encrypted 开发 .NET 应用程序
- 教程:开发使用具有安全 enclave 的 Always Encrypted 的 .NET Framework 应用程序
- 教程:对使用随机加密的启用了 enclave 的列创建和使用索引