教程:在 SQL Server 中开始使用具有安全 enclave 的 Always Encrypted

适用于: SQL Server 2019 (15.x) 及更高版本 - 仅限 Windows

本教程介绍如何在 SQL Server 中开始使用具有安全 enclave 的 Always Encrypted。 它将介绍:

  • 如何创建基本环境,以便在未为 enclave 配置证明的情况下,测试和评估具有安全 enclave 的 Always Encrypted。
  • 如何使用 SQL Server Management Studio (SSMS) 就地加密数据并就加密列发出各种机密查询。

若要了解如何使用主机保护者服务,设置具有安全 enclave 的 Always Encrypted 以提供 enclave 证明,请参阅教程:使用 HGS,在 SQL Server 中使用具有安全 enclave 的 Always Encrypted 入门

先决条件

托管 SQL Server 实例的计算机(称为 SQL Server 计算机)必须满足以下要求:

  • SQL Server 2019 (15.x) 或更高版本。
  • 使用 Windows 10 或更高版本、Windows Server 2019 或更高版本。
  • 针对虚拟化技术的 CPU 支持:
    • 具有扩展页表的 Intel VT-x。
    • 具有快速虚拟化索引的 AMD-V。
    • 如果你在 VM 中运行 SQL Server,请执行以下操作:
      • 在 Azure 中,使用第 2 代 VM 大小(建议)或使用启用了嵌套虚拟化的第 1 代 VM 大小。 查看单个 VM 大小文档,确定哪些第 1 代 VM 大小支持嵌套虚拟化。
      • 在 Hyper-V 2016 或更高版本中(Azure 之外),请确保 VM 是第 2 代 VM(建议),或者是启用了嵌套虚拟化的第 1 代 VM。 有关详细信息,请参阅是否应在 Hyper-V 中创建第 1 代或第 2 代虚拟机?配置嵌套虚拟化
      • 在 VMware vSphere 6.7 或更高版本中,为 VM 启用基于虚拟化的安全支持,如 VMware 文档中所述。
      • 其他虚拟机监控程序和公有云可能支持嵌套虚拟化功能,这些功能也实现具有 VBS Enclave 的 Always Encrypted。 有关兼容性和配置说明,请查看虚拟化解决方案的文档。
  • 最新版本的 SQL Server Management Studio (SSMS)。 或者,可在另一台计算机上安装 SSMS。

警告

在生产环境中,在 SQL Server 计算机上运行 SSMS 或其他密钥管理工具可能会降低使用 Always Encrypted 的安全优势。 通常,建议在不同的计算机上运行此类工具。 有关详细信息,请参阅 密钥管理的安全注意事项

步骤 1:确保基于虚拟化的安全性 (VBS) 已启用

  1. 以管理员身份登录 SQL Server 计算机,并打开提升的 Windows PowerShell 控制台,运行 msinfo32.exe。 检查 VBS 是否正在运行。 如果 VBS 正在运行,请跳过本部分的剩余步骤,并转到下一部分。

    Screenshot of the System Information virtualization-based security details.

  2. 通过在 PowerShell 会话中运行以下 cmdlet 来启用 VBS。

    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard -Name EnableVirtualizationBasedSecurity -Value 1
    
  3. 如果 SQL Server 计算机是虚拟机、不支持 UEFI 安全启动的物理计算机或未配备 IOMMU 的物理计算机,则需要删除平台安全功能的 VBS 要求。 通过在提升的 PowerShell 控制台中的 SQL Server 计算机上运行以下命令,删除对安全启动和 IOMMU 的要求:

    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard -Name RequirePlatformSecurityFeatures -Value 0
    
  4. 再次重启 SQL Server 计算机,让 VBS 联机。

    Restart-Computer
    
  5. 重复步骤 1 以检查 VBS 是否正在运行。

步骤 2:在 SQL Server 中启用具有安全 enclave 的 Always Encrypted

在此步骤中,你将在 SQL Server 实例中启用使用 enclave 的 Always Encrypted 功能。

  1. 以 sysadmin 身份使用 SSMS 连接到 SQL Server 实例,无需为数据库连接启用 Always Encrypted。

    1. 启动 SSMS。

    2. 在“连接到服务器”对话框中,指定服务器名称,选择身份验证方法,并指定凭据。

    3. 选择“选项 >>”,并选择“Always Encrypted”选项卡

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

      Screenshot of the SSMS connection option for Always Encrypted disabled.

    5. 选择“连接”。

  2. 打开新查询窗口,并执行下面的语句,将安全 enclave 类型设置为基于虚拟化的安全性 (VBS)。

    EXEC sys.sp_configure 'column encryption enclave type', 1;
    RECONFIGURE;
    
  3. 重启 SQL Server 实例,前述更改才会生效。 可在“对象资源管理器”中右键单击实例并选择“重启”,从而在 SSMS 中重启实例。 重启实例后,请重新连接到它。

  4. 通过运行以下查询确认现已加载安全 enclave:

    SELECT [name], [value], [value_in_use] FROM sys.configurations
    WHERE [name] = 'column encryption enclave type';
    

    该查询应返回以下结果:

    name value value_in_use
    列加密 enclave 类型 1 1

步骤 3:创建示例数据库

在此步骤中,你将创建包含一些示例数据的数据库,稍后将对它进行加密。

  1. 使用上一步中的 SSMS 实例在查询窗口中执行下面的语句,以新建名为“ContosoHR”的数据库。

    CREATE DATABASE [ContosoHR];
    
  2. 新建名为“Employees”的表。

    USE [ContosoHR];
    GO
    
    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];
    
  3. 向“Employees”表添加一些员工记录。

    USE [ContosoHR];
    GO
    
    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. 请确保选择“Windows 证书存储(当前用户或本地计算机)”或“Azure Key Vault”

    4. 选择“允许 enclave 计算”

    5. 如果选择了 Azure Key Vault,请登录到 Azure 并选择密钥保管库。 若要深入了解如何创建 Always Encrypted 的密钥保管库,请参阅 Manage your key vaults from Azure portal(从 Azure 门户管理密钥保管库)。

    6. 选择证书或 Azure Key Value 密钥(如果已存在),或选择“生成证书”按钮以创建新证书

    7. 选择“确定”

      Screenshot of the allow enclave computations selection in SSMS when creating a new column master key.

  3. 创建已启用 enclave 的新列加密密钥:

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

步骤 5:就地加密部分列

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

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

    1. 启动新 SSMS 实例。

    2. 在“连接到服务器”对话框中,指定服务器名称,选择身份验证方法,并指定凭据。

    3. 选择“选项 >>”,并选择“Always Encrypted”选项卡

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

    5. 选择“启用安全 enclave”。

    6. 将“协议”设置为“无”。

      Screenshot of the connect to server Always Encrypted tab without attestation using SSMS.

    7. 选择“连接”。

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

  2. 使用相同的 SSMS 实例(已启用 Always Encrypted)打开新查询窗口,并通过运行以下查询来加密“SSN”和“Salary”列。

    USE [ContosoHR];
    GO
    
    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 实例中重试同一查询,并记下发生的故障。

后续步骤

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

另请参阅