教學課程:在使用 HGS 進行證明的 SQL Server 中開始使用具有安全記憶體保護區的 Always Encrypted

適用於:SQL Server 2019 (15.x) 和更新版本 - 僅適用於 Windows

本教學課程會教導您如何在使用主機守護者服務 (HGS) 進行證明的 SQL Server 中開始使用具有安全記憶體保護區的 Always Encrypted。 它會顯示:

  • 如何建立基本環境,以便在設定了 HGS 以進行記憶體保護區證明的情況下,測試及評估具有安全記憶體保護區的 Always Encrypted。
  • 如何就地加密資料,以及使用 SQL Server Management Studio (SSMS) 針對加密資料行發出豐富的機密查詢。

如果您想要了解如何在沒有證明的情況下設定具有安全記憶體保護區的 Always Encrypted,請參閱教學課程:在 SQL Server 中開始使用具有安全記憶體保護區的 Always Encrypted

必要條件

若要開始使用具有安全記憶體保護區的 Always Encrypted,您需要至少兩部電腦 (它們可以是虛擬機器):

  • SQL Server 電腦以裝載 SQL Server 和 SSMS。
  • HGS 電腦以執行主機守護者服務,這是記憶體保護區證明所需。

SQL Server 電腦需求

  • SQL Server 2019 (15.x) 或更新版本。
  • Windows 10 1809 版或更新版本 - Enterprise Edition、Windows 11 或更新版本 - Enterprise Edition、Windows Server 2019 或更新版本 - Datacenter Edition。 其他版本的 Windows 10/11 和 Windows Server 不支援使用 HGS 進行證明。
  • 虛擬化技術的 CPU 支援:
    • 搭載延伸分頁表的 Intel VT-x。
    • 搭載快速虛擬化索引處理的 AMD-V。
    • 如果在 VM 中執行 SQL Server:
  • 最新版本的 SQL Server Management Studio (SSMS)。 或者,您也可以在另一部電腦上安裝 SSMS。

警告

在實際執行環境中,於 SQL Server 電腦上執行 SSMS 或其他金鑰管理工具,可能會降低使用 Always Encrypted 所帶來的安全性效益。 一般而言,我們會建議您在不同的電腦上執行這類工具。 如需詳細資訊,請參閱 金鑰管理的安全性考量

HGS 電腦需求

  • Windows Server 2019 Standard 或 Datacenter Edition
  • 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. 提示時重新啟動 SQL Server 電腦,以完成安裝 Hyper-V。

  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 通訊。 請確定您可以 ping HGS 電腦。

UnauthorizedHost 錯誤表示尚未向 HGS 伺服器註冊公開金鑰。 請重複步驟 5 和 6 來解決錯誤。

如果其他部分都失敗,則請執行 Remove-HgsClientHostKey 並重複步驟 4 到步驟 7。

步驟 3:在 SQL Server 啟用具有安全記憶體保護區的 Always Encrypted

在此步驟中,您將在 SQL Server 執行個體中使用記憶體保護區啟用 Always Encrypted 的功能。

  1. 使用 SSMS,以 sysadmin 身分連線到針對資料庫連接啟用 Always Encrypted 的 SQL Server 執行個體。

    1. 啟動 SSMS。

    2. 在 [連線到伺服器] 對話方塊中,指定您的伺服器名稱,然後選取驗證方法並指定認證。

    3. 選取 [選項 >>],然後選取 [Always Encrypted] 索引標籤。

    4. 請確定選取 [啟用 Always Encrypted (資料行加密)] 核取方塊。

      Screenshot of the SSMS connection option for Always Encrypted disabled.

    5. 選取 [連線]。

  2. 開啟新的查詢視窗,並執行以下陳述式,將安全記憶體保護區類型設成虛擬化型安全性 (VBS)。

    EXEC sys.sp_configure 'column encryption enclave type', 1;
    RECONFIGURE;
    
  3. 重新啟動您的 SQL Server 執行個體,先前的變更才會生效。 您可以在 SSMS 中重新啟動執行個體,方法是在 [物件總管] 中以滑鼠右鍵按一下它,然後選取 [重新啟動]。 執行個體重新啟動之後,請與它重新連線。

  4. 執行下列查詢,確認現在已載入安全記憶體保護區:

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

    查詢應該會傳回下列結果:

    NAME value value_in_use
    資料行加密記憶體保護區類型 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:佈建已啟用記憶體保護區的金鑰

在此步驟中,您將建立會允許記憶體保護區計算的資料行主要金鑰和資料行加密金鑰。

  1. 使用上個步驟中的 SSMS 執行個體,在物件總管中展開您的資料庫,然後巡覽至 [安全性]>[Always Encrypted 金鑰]。

  2. 佈建已啟用記憶體保護區的新資料行主要金鑰:

    1. 以滑鼠右鍵按一下 [Always Encrypted 金鑰],然後選取 [新增資料行主要金鑰]。

    2. 選取您的資料行主要金鑰名稱:CMK1

    3. 請確定您選取 [Windows 憑證存放區 (目前的使用者或本機電腦)] 或 [Azure Key Vault]。

    4. 選取 [允許記憶體保護區運算]。

    5. 如果您已選取 Azure Key Vault,請登入 Azure,然後選取您的金鑰保存庫。 如需如何建立 Always Encrypted 金鑰保存庫的詳細資訊,請參閱 Manage your key vaults from Azure portal (從 Azure 入口網站管理金鑰保存庫)。

    6. 選取您的憑證或 Azure Key Vault 金鑰 (如果已有),或選取 [產生憑證] 按鈕來建立一個新的憑證。

    7. 選取 [確定]。

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

  3. 建立已啟用記憶體保護區的新資料行加密金鑰:

    1. 以滑鼠右鍵按一下 [Always Encrypted 金鑰],然後選取 [新增資料行加密金鑰]。
    2. 輸入新資料行加密金鑰的名稱:CEK1
    3. 在 [資料行主要金鑰] 下拉式清單中,選取您在先前步驟中建立的資料行主要金鑰。
    4. 選取 [確定]。

步驟 6:就地加密某些資料行

在此步驟中,您會加密儲存在伺服器端記憶體保護區內 SSNSalary 資料行中的資料,然後對資料測試 SELECT 查詢。

  1. 開啟新的 SSMS 執行個體,並在針對資料庫連接啟用 Always Encrypted 的情況下連線到 SQL Server 執行個體。

    1. 啟動新的 SSMS 執行個體。

    2. 在 [連線到伺服器] 對話方塊中,指定您的伺服器名稱,然後選取驗證方法並指定認證。

    3. 選取 [選項 >>],然後選取 [Always Encrypted] 索引標籤。

    4. 選取 [啟用 Always Encrypted (資料行加密)] 核取方塊。

    5. 選取 [啟用安全記憶體保護區]。 (此步驟適用於 SSMS 19 或更新版本。)

    6. 將 [通訊協定] 設定為 [主機守護者服務]。 (此步驟適用於 SSMS 19 或更新版本。)

    7. 指定記憶體保護區的證明 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),開啟新的查詢視窗,並執行下列查詢以加密 SSNSalary 資料行。

    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. 為驗證 SSNSalary 資料行現已加密,請在針對資料庫連接啟用 Always Encrypted 的 SSMS 執行個體中開啟新的查詢視窗,並執行以下陳述式。 查詢視窗應該傳回 SSNSalary 資料行中加密的值。 如果使用已啟用 Always Encrypted 的 SSMS 執行個體執行同一查詢,您應該會看到解密的資料。

    SELECT * FROM [HR].[Employees];
    

步驟 7:針對加密的資料行執行豐富查詢

現在,您可以針對加密的資料行執行豐富查詢。 在伺服器端記憶體保護區內,將會執行一些查詢處理。

  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 執行個體中再次嘗試相同查詢,並留意發生的失敗。

後續步驟

完成本教學課程之後,您可以移至下列其中一個教學課程:

另請參閱