你当前正在访问 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) 就地加密数据并就加密列发出各种机密查询。

先决条件

工具要求

本教程需要用到 SQL Server Management Studio (SSMS)。 可以选择使用 PowerShell 或 Azure CLI 来启用 VBS enclave。

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

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

在此步骤中,你将创建新的 Azure SQL 数据库逻辑服务器和新数据库。

转到快速入门:创建单一数据库 - Azure SQL 数据库,并按照创建单一数据库部分中的说明创建新的 Azure SQL 数据库逻辑服务器和新数据库。

重要

请确保创建采用名称 ContosoHR 的空数据库(而非示例数据库)。

步骤 2:启用 VBS enclave

在此步骤中,你将在数据库中启用 VBS enclave,这是具有安全 enclave 的 Always Encrypted 所必需的。 要在数据库中启用 VBS enclave,需要将 preferredEnclaveType 数据库属性设置为 VBS

  1. 打开 Azure 门户并查找要为其启用安全 enclave 的数据库。

  2. 在“安全”设置中,选择“数据加密”

  3. 在“数据加密”菜单中,选择“Always Encrypted”选项卡。

  4. 将“启用安全 enclave”设置为“开启”。 如果已设置为“开启”,请继续执行下一步。

    Azure 门户中为现有数据库启用安全 enclave 的屏幕截图。

  5. 若要保存 Always Encrypted 配置,请选择“保存”

步骤 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”。

    7. 将“协议”设置为“无”。 请参阅以下屏幕截图。

      “SSMS 连接到服务器”对话框 Always Encrypted 选项卡的屏幕截图,其中证明协议设置为“无”。

    8. 选择“连接”。

    9. 如果系统提示启用 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 实例中重试同一查询。 应该会发生故障。

后续步骤

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

另请参阅