教程:在使用 HGS 证明的情况下,在 SQL Server 中开始使用具有安全 enclave 的 Always Encrypted

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

本教程介绍了如何使用用于 enclave 证明的主机保护者服务 (HGS),在 SQL Server 中开始使用具有安全 enclave 的 Always Encrypted 证明。 它将介绍:

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

若要了解如何在不使用证明的情况下设置具有安全 enclave 的 Always Encrypted,请参阅教程:在 SQL Server 中开始使用具有安全 enclave 的 Always Encrypted

先决条件

若要开始使用具有安全 enclave 的 Always Encrypted,需要至少两台计算机(可以是虚拟机):

  • SQL Server 计算机,用于承载 SQL Server 和 SSMS。
  • HGS 计算机,用于运行 enclave 证明所需的主机保护者服务。

SQL Server 计算机要求

  • SQL Server 2019 (15.x) 或更高版本。
  • Windows 10 版本 1809 或更高版本 - Enterprise 版本、Windows 11 或更高版本 - Enterprise 版本、Windows Server 2019 或更高版本 - Datacenter 版本。 其他版本的 Windows 10/11 和 Windows Server 不支持通过 HGS 进行证明。
  • 针对虚拟化技术的 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 的安全优势。 通常,建议在不同的计算机上运行此类工具。 有关详细信息,请参阅 密钥管理的安全注意事项

HGS 计算机要求

  • Windows Server 2019 Standard 或 Datacenter 版本
  • 2 个 CPU
  • 8 GB RAM
  • 100 GB 存储

注意

在开始之前,不应将 HGS 计算机加入域。

步骤 1:配置 HGS 计算机

在此步骤中,你将配置 HGS 计算机,以运行支持主机密钥证明的主机保护者服务。

  1. 以管理员身份(本地管理员)登录 HGS 计算机,打开提升的 Windows PowerShell 控制台并运行以下命令,添加主机保护者服务角色:

    Install-WindowsFeature -Name HostGuardianServiceRole -IncludeManagementTools -Restart
    
  2. 重启 HGS 计算机后,再次使用管理员帐户登录,打开提升了权限的 Windows PowerShell 控制台并运行以下命令,安装主机保护者服务并配置它的域。 此处指定的密码仅适用于 Active Directory 的目录服务修复模式密码,而不会更改管理员帐户的登录密码。 可以为 -HgsDomainName 提供所选的任何域名。

    $adminPassword = ConvertTo-SecureString -AsPlainText '<password>' -Force
    Install-HgsServer -HgsDomainName 'bastion.local' -SafeModeAdministratorPassword $adminPassword -Restart
    
  3. 计算机再次重启后,使用你的管理员帐户登录(现在也是域管理员)。 打开提升了权限的 Windows PowerShell 控制台,并为 HGS 实例配置主机密钥证明。

    Initialize-HgsAttestation -HgsServiceName 'hgs' -TrustHostKey  
    
  4. 运行以下命令,找到 HGS 计算机的 IP 地址。 保存此 IP 地址,以供后续步骤使用。

    Get-NetIPAddress  
    

注意

或者,如果想通过 DNS 名称来引用 HGS 计算机,可设置一个转发器,从公司 DNS 服务器指向新的 HGS 域控制器。

步骤 2:将 SQL Server 计算机配置为受保护的主机

在此步骤中,你需要将 SQL Server 计算机配置为受保护的主机,并使用主机密钥证明注册到 HGS。

警告

主机密钥证明被视为一种较弱的证明模式。 对于生产环境,应尽量使用 TPM 证明。 有关详细信息,请参阅证明模式

  1. 以管理员身份登录到 SQL Server 计算机,打开提升的 Windows PowerShell 控制台,并通过访问 computername 变量检索计算机名称。

    $env:computername 
    
  2. 安装受保护的主机功能,这也将安装 Hyper-V(如果尚未安装)。

    Enable-WindowsOptionalFeature -Online -FeatureName HostGuardian -All
    
  3. 系统提示 Hyper-V 安装完成时,请重启 SQL Server 计算机。

  4. 如果 SQL Server 计算机是虚拟机、不支持 UEFI 安全启动的物理计算机或未配备 IOMMU 的物理计算机,则需要删除平台安全功能的 VBS 要求。

    1. 通过在提升的 PowerShell 控制台中的 SQL Server 计算机上运行以下命令,删除对安全启动和 IOMMU 的要求:

      Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard -Name RequirePlatformSecurityFeatures -Value 0
      
    2. 再次重启 SQL Server 计算机,使 VBS 以较低的要求联机。

      Restart-Computer
      
  5. 再次以管理员身份登录 SQL Server 计算机,打开提升的 Windows PowerShell 控制台,生成唯一主机密钥,并将生成的公钥导出到文件。

    Set-HgsClientHostKey 
    Get-HgsClientHostKey -Path $HOME\Desktop\hostkey.cer
    
  6. 将上一步生成的主机密钥文件手动复制到 HGS 计算机。 以下说明假设你的文件名为 hostkey.cer 并且你正在将它复制到 HGS 计算机的桌面。

  7. 在 HGS 计算机上,打开提升的 Windows PowerShell 控制台并向 HGS 注册 SQL Server 计算机的主机密钥:

    Add-HgsAttestationHostKey -Name <your SQL Server computer name> -Path $HOME\Desktop\hostkey.cer
    
  8. 在 SQL Server 计算机上,在提升的 Windows PowerShell 控制台中运行以下命令,告诉 SQL Server 计算机前往何处进行证明。 请确保已指定位于两个地址的 HGS 计算机的 IP 地址或 DNS 名称。

    # use http, and not https
    Set-HgsClientConfiguration -AttestationServerUrl http://<IP address or DNS name>/Attestation -KeyProtectionServerUrl http://<IP address or DNS name>/KeyProtection/  
    

上述命令的结果应显示 AttestationStatus = Passed。

如果出现 HostUnreachable 错误,这意味着 SQL Server 计算机无法与 HGS 通信。 请确保可以连接到 HGS 计算机。

错误 UnauthorizedHost 指示公钥未在 HGS 服务器上注册。 重复步骤 5 和 6 以解决错误。

如果所有其他操作失败,请运行 Remove-HgsClientHostKey 并重复步骤 4-7。

步骤 3:在 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

步骤 4:创建示例数据库

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

  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);
    

步骤 5:预配已启用 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. 选择“确定”

步骤 6:就地加密位部分列

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

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

    1. 启动新 SSMS 实例。

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

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

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

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

    6. 将“协议”设置为“主机保护者服务”。 (此步骤适用于 SSMS 19 或更高版本。)

    7. 指定 enclave 证明 URL(例如 http:// hgs.bastion.local/Attestation)。

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

    8. 选择“连接”。

    9. 如果系统提示启用 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];
    

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

现在,可对加密列运行丰富查询。 部分查询处理将在服务器端 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 实例中重试同一查询,并记下发生的故障。

后续步骤

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

另请参阅