你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:在 Azure SQL 数据库中开始使用具有 Intel SGX enclave 的 Always Encrypted

适用于:Azure SQL 数据库

本教程介绍如何在 Azure SQL 数据库中开始使用具有安全 enclave 的 Always Encrypted。 你将使用 Intel Software Guard Extensions (Intel SGX) enclave。 它将介绍:

  • 如何创建环境,以便测试和评估具有 Intel SGX enclave 的 Always Encrypted。
  • 如何使用 SQL Server Management Studio (SSMS) 就地加密数据并就加密列发出各种机密查询。

先决条件

PowerShell 要求

注意

仅当你选择使用 PowerShell 来完成本教程中的某些步骤时,本部分列出的先决条件才适用。 如果你打算改用 Azure 门户,则可以跳过本部分。

需要使用 Az PowerShell 模块版本 9.3.0 或更高版本。 有关如何安装 Az PowerShell 模块的详细信息,请参阅安装 Azure Az PowerShell 模块。 若要确定计算机上安装的 Az PowerShell 模块的版本,请在 PowerShell 中运行以下命令。

Get-InstalledModule -Name Az

步骤 1:创建并配置服务器和 DC 系列数据库

此步骤将使用 DC 系列硬件创建新的 Azure SQL 数据库逻辑服务器和新的数据库,这对于具有安全 enclave 的 Always Encrypted 而言是必需的操作。 有关更多信息,请参见 DC 系列

  1. 浏览到“选择 SQL 部署选项”页。

  2. 如果你尚未登录到 Azure 门户,请按提示登录。

  3. 在“SQL 数据库”下将“资源类型”设置保留为“单一数据库”,然后选择“创建” 。

    显示“添加到 Azure SQL 部署”选项的 Azure 门户的屏幕截图。

  4. 在“创建 SQL 数据库”窗体的“基本信息”选项卡上的“项目详细信息”下,选择所需的 Azure订阅 。

  5. 对于“资源组”,请选择“新建”,输入资源组的名称,然后选择“确定” 。

  6. 对于“数据库名称”,请输入 ContosoHR。

  7. 对于“服务器”,选择“新建”,并使用以下值填写“新服务器”窗体 :

    • 服务器名称:输入“mysqlserver”并添加一些字符以实现唯一性。 我们无法提供要使用的确切服务器名称,因为对于 Azure 中的所有服务器,服务器名称必须全局唯一,而不只是在订阅中唯一。 因此,请输入类似于 mysqlserver135 的名称,然后门户会告知你该名称是否可用。
    • 位置:从下拉列表中选择一个位置。

      重要

      需要选择一个既支持 DC 系列硬件,也支持 Microsoft Azure 证明的位置(Azure 区域)。 有关支持 DC 系列的区域列表,请参阅 DC 系列可用性此文档介绍了 Microsoft Azure 证明的区域可用性。

    • 身份验证方法:选择“使用 SQL 身份验证”
    • 服务器管理员登录名:输入管理员登录名,例如 azureuser。
    • 密码:输入符合要求的密码,然后在“确认密码”字段中再次输入该密码。
    • 选择“确定”。
  8. 将“想要使用 SQL 弹性池”设置保留为“否” 。

  9. 在“计算 + 存储”下,选择“配置数据库”,然后选择“更改配置”。

    Azure 门户、硬件配置以及配置数据库的位置的屏幕截图。

  10. 选择“DC 系列”硬件配置,然后选择“确定” 。

    显示“配置 DC 系列数据库”的 Azure 门户的屏幕截图。

  11. 选择“应用”。

  12. 返回“基本信息”选项卡,确认“计算 + 存储”是否设置为“常规用途”和“DC,2 vCore,32 GB 存储” 。

  13. 对于“备份存储冗余”,选择“本地冗余备份存储”。

  14. 在完成时选择“下一步:网络”。

    显示“配置 DC 系列数据库”-“基本信息”的 Azure 门户的屏幕截图。

  15. 在“网络”选项卡上,对于“连接方法”,选择“公共终结点” 。

  16. 对于“防火墙规则”,将“添加当前客户端 IP 地址”设置为“是” 。 将“允许 Azure 服务和资源访问此服务器”设置保留为“否” 。

  17. 对于“连接策略”,请将“连接策略”保留为“默认 - 对源自 Azure 内部的所有客户端连接使用重定向策略,并对源自 Azure 外部的所有客户端连接使用代理”

  18. 对于“加密连接”,请将“最低 TLS 版本”保留为“TLS 1.2”。

  19. 在页面底部选择“查看 + 创建”。

    Azure 门户的“创建 SQL 数据库”页上“网络”选项卡的屏幕截图。

  20. 在“查看 + 创建”页上,查看后选择“创建”。

步骤 2:配置证明提供程序

此步骤将在 Microsoft Azure 证明中创建和配置证明提供程序。 需要执行此步骤才能证明数据库使用的安全领域。

  1. 浏览到“创建证明提供程序”页。

  2. 在“创建证明提供程序”页面上,提供以下输入:

    • 订阅:选择在其中创建了 Azure SQL 逻辑服务器的同一订阅。
    • 资源组:选择在其中创建了 Azure SQL 逻辑服务器的同一资源组。
    • 名称:输入 myattestprovider,并添加一些字符以确保名称唯一。 我们无法提供要使用的确切证明提供程序名称,因为名称必须全局唯一。 因此,请输入类似于 myattestprovider12345 的名称,然后门户会告知你该名称是否可用。
    • 位置:选择与 Azure SQL 逻辑服务器相同的位置。
    • 策略签名者证书文件:将此字段留空,因为你将配置未签名的策略。
  3. 提供所需的输入后,选择“查看 + 创建”。

    Azure 门户的“创建证明提供程序”菜单的屏幕截图。

  4. 选择“创建”。

  5. 创建证明提供程序后,选择“转到资源”。

  6. 在证明提供程序的“概述”选项卡上,将“证明 URI”属性的值复制到剪贴板,并将其保存到某个文件中 。 在后续步骤中需要用到此证明 URL。

    Azure 门户中证明 URL 的屏幕截图。

  7. 在下窗格中或在窗口左侧的“资源”菜单上选择“策略”。

  8. 将“证明类型”设置为“SGX-IntelSDK” 。

  9. 在上侧菜单上选择“配置”。

    在 Azure 门户中配置证明策略的屏幕截图。

  10. 将“策略格式”设置为“文本” 。 将“策略选项”保留设置为“输入策略”。

  11. 在“策略文本”字段中,将默认策略替换为以下策略。 有关以下策略的详细信息,请参阅创建并配置证明提供程序

version= 1.0;
authorizationrules 
{
       [ type=="x-ms-sgx-is-debuggable", value==false ]
        && [ type=="x-ms-sgx-product-id", value==4639 ]
        && [ type=="x-ms-sgx-svn", value>= 2 ]
        && [ type=="x-ms-sgx-mrsigner", value=="e31c9e505f37a58de09335075fc8591254313eb20bb1a27e5443cc450b6e33e5"] 
    => permit();
};

  1. 选择“保存”。

    在 Azure 门户中编辑证明策略的屏幕截图。

  2. 若要查看已配置的策略,请在顶部菜单中选择“刷新”。

步骤 3:填充数据库

此步骤将创建一个表,并使用一些稍后将加密和查询的数据填充该表。

  1. 打开 SSMS 并连接到 Azure SQL 逻辑服务器(在数据库连接中未启用 Always Encrypted 的情况下创建)中的 ContosoHR 数据库 。

    1. 在“连接到服务器”对话框中,指定服务器的完全限定名称(例如 myserver135.database.windows.net),并输入在创建服务器时指定的管理员用户名和密码。

    2. 选择“选项 >>”,然后选择“连接属性”选项卡。确保选择“ContosoHR”数据库(而不是默认的 master 数据库)。

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

    4. 务必取消选中“启用 Always Encrypted (列加密)”复选框。

      在不启用 Always Encrypted 的情况下,使用 SSMS 连接到服务器的屏幕截图。

    5. 选择“连接”。

  2. 新建名为“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
    
  3. 向“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 计算的列主密钥和列加密密钥。

  1. 使用上一步中的 SSMS 实例在“对象资源管理器”中展开数据库,并依次转到“安全性”>“Always Encrypted 密钥”。

  2. 预配已启用 enclave 的新列主密钥:

    1. 右键单击“Always Encrypted 密钥”,然后选择“新列主密钥...” 。
    2. 输入新列主密钥的名称:CMK1。
    3. 验证是否选中了“允许 enclave 计算”。 (如果为数据库启用了安全 enclave,则默认选中此选项。由于数据库使用 DC 系列硬件配置,因此应启用此选项。)
    4. 选择“Azure Key Vault”(建议)或“Windows 证书存储”(“当前用户”或“本地计算机”)。
      • 如果选择“Azure Key Vault”,请登录到 Azure,选择包含要使用的密钥保管库的 Azure 订阅,然后选择你的密钥保管库。 选择“生成密钥”以创建新密钥。
      • 如果选择“Windows 证书存储”,请选择“生成证书”按钮以创建新证书。 创建新的列主密钥时,SSMS 中“允许 enclave 计算”选项的屏幕截图。
    5. 选择“确定”。
  3. 创建已启用 enclave 的新列加密密钥:

    1. 右键单击“Always Encrypted 密钥”,然后选择“新建列加密密钥” 。
    2. 输入新列加密密钥的名称:CEK1。
    3. 在“列主密匙”下拉列表中,选择在上一步骤创建的列主密钥。
    4. 选择“确定”。

步骤 5:就地加密部分列

这一步将在服务器端 enclave 内加密“SSN”和“Salary”列中存储的数据,然后对数据测试 SELECT 查询 。

  1. 打开新的 SSMS 实例并连接到数据库,同时为数据库连接启用 Always Encrypted。

    1. 启动新 SSMS 实例。

    2. 在“连接到服务器”对话框中,指定服务器的完全限定名称(例如 myserver135.database.windows.net),并输入在创建服务器时指定的管理员用户名和密码。

    3. 选择“选项 >>”,然后选择“连接属性”选项卡。确保选择“ContosoHR”数据库(而不是默认的 master 数据库)。

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

    5. 选中“启用 Always Encrypted (列加密)”复选框。

    6. 选择“启用安全 enclave”。 (此步骤适用于 SSMS 19 或更高版本。)

    7. 将“协议”设置为“Microsoft Azure 证明”。 (此步骤适用于 SSMS 19 或更高版本。)

    8. 指定你的 enclave 证明 URL,你可以通过遵循步骤 2:配置证明提供程序中的步骤获得。 请参阅以下屏幕截图。

      “SSMS 连接到服务器”对话框 Always Encrypted 选项卡的屏幕截图,其中启用了证明。

    9. 选择“连接”。

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

  2. 使用相同的 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 语句。 更改表后,需要清除访问该表的所有批处理和存储过程的计划,以刷新参数加密信息。

  3. 若要验证“SSN”和“Salary”列现在是否已加密,请使用没有为数据库连接启用 Always Encrypted 的 SSMS 实例打开新查询窗口,并执行以下语句。 查询窗口应返回“SSN”和“Salary”列中的加密值。 如果使用已启用 Always Encrypted 的 SSMS 实例执行相同查询,应该会看到已解密的数据。

    SELECT * FROM [HR].[Employees];
    

步骤 6:对加密列运行丰富查询

你可以对加密列运行丰富查询。 部分查询处理将在服务器端 enclave 内执行。

  1. 在已启用 Always Encrypted 的SSMS 实例中,请确保也启用了 Always Encrypted 参数化。

    1. 在 SSMS 的主菜单中,选择“工具”。
    2. 选择“选项...”。
    3. 导航到“查询执行”>“SQL Server”>“高级”。
    4. 务必选中“启用 Always Encrypted 参数化”。
    5. 选择“确定”。
  2. 打开一个新的查询窗口,粘贴到下面的查询中,然后执行。 该查询应返回满足指定搜索条件的纯文本值和行。

    DECLARE @SSNPattern [char](11) = '%6818';
    DECLARE @MinSalary [money] = $1000;
    SELECT * FROM [HR].[Employees]
    WHERE SSN LIKE @SSNPattern AND [Salary] >= @MinSalary;
    
  3. 在未启用 Always Encrypted 的 SSMS 实例中重试同一查询。 应该会发生故障。

后续步骤

完成本教程之后,可以继续学习以下教程之一:

另请参阅