使用 Azure Key Vault 為 SQL Server 設定透明資料加密

適用於:SQL Server

在本文中,你會安裝並設定 Azure Key Vault 的 SQL Server 連接器,然後透過 Azure Key Vault 中的金鑰來設定 透明資料加密(TDE)。

Prerequisites

在開始使用 Azure Key Vault 與您的 SQL Server 實例之前,請確保您符合以下先決條件:

Note

在 SQL Server 2022(16.x)CU 12 及更新版本中,Linux 上的 SQL Server 支援使用 Azure Key Vault 進行 TDE 可擴充金鑰管理。 本指南中的第 3 和 4 步不適用於 Linux 上的 SQL Server。

快速流速

  1. 在步驟 1 中選擇認證模型 :設定認證模型。
  2. 在 步驟 2:建立金鑰保存庫 中建立金鑰保存庫和金鑰。
  3. 安裝連接器在步驟 3:安裝 SQL Server 連接器。
  4. 在步驟 4 中設定登錄檔前置條件 :新增登錄檔金鑰以支援 EKM 提供者。
  5. 在步驟 5:配置 SQL Server 時,配置 SQL Server 並驗證加密。

步驟 1:建立認證模型

Important

在繼續之前,請先選擇你的認證模式:

  • 在本地使用 SQL Server 的 Service Principal 標籤。
  • 對於 Azure VM 上的 SQL Server 或已啟用 Azure Arc 的 SQL Server,若支援受控識別,請使用 受控識別 索引標籤。

認證模型支援矩陣:

驗證模型 SQL Server 版本 SQL Server 執行地點 支援
服務主體 本文涵蓋的支援版本 內部部署、Azure 虛擬機器、已啟用 Azure Arc 的 SQL Server 是的
受管理的識別 SQL Server 2022 CU17 及以後版本 Azure VM 是的
受管理的識別 SQL Server 2025 及以後版本 透過 Azure Arc 啟用的 SQL Server 是的
受管理的識別 任意 On-premises No

若要將 SQL Server 執行個體存取權限授與 Azure Key Vault,您需要 Microsoft Entra ID 中的服務主體帳戶。

  1. 登入 Azure 入口網站,並執行以下任一步驟:

    • 選取 [Microsoft Entra ID] 按鈕。

      [Azure 服務] 窗格的螢幕擷取畫面。

    • 選取 [更多服務],然後在 [所有服務] 窗格中鍵入 [Microsoft Entra ID]。

  2. 請依照以下步驟註冊應用程式,使用 Microsoft Entra ID。 如需詳細的逐步指示,請參閱 Azure Key Vault 部落格文章 Azure Key Vault – 逐步解說中取得應用程式的身分識別一節。

    1. 在 [Microsoft Entra ID] 資源的 [管理] 部分中,選取 [應用程式註冊]。

      Azure 入口網站中 Microsoft Entra ID [概觀] 頁面的螢幕擷取畫面。

    2. 在應用程式註冊頁面上,選取新增註冊。

      Azure 入口網站中 [應用程式註冊]的螢幕擷取畫面。

    3. 在 [註冊應用程式] 窗格中,輸入應用程式的使用者對應名稱,然後選取 [註冊]。

      [註冊應用程式] 窗格的螢幕擷取畫面。

    4. 在左側窗格,選擇憑證 與秘密、>客戶端秘密、>新客戶端秘密。

      Azure 入口網站中應用程式之 [憑證和祕密] 窗格的螢幕擷取畫面。

    5. 在 [新增用戶端密碼] 中輸入描述和適當的到期日,然後選取 [新增]。 您無法選擇超過 24 個月的到期期間。 如需詳細資訊,請參閱新增用戶端密碼。

      Azure 入口網站中應用程式之 [新增用戶端密碼] 部分的螢幕擷取畫面。

    6. 在憑證與秘密面板中,值下方,選擇用戶端秘密值旁的複製按鈕,以在 SQL Server 中建立非對稱金鑰。

      Azure 入口網站中祕密值的螢幕擷取畫面。

    7. 在左側窗格選擇「概覽」,然後在應用程式(客戶端)ID 欄位複製該值,以便在 SQL Server 中建立非對稱鍵。

      [概觀] 窗格上 [應用程式 (用戶端) 識別碼] 值的螢幕擷取畫面。

步驟 2:建立金鑰保存庫

選取要用來建立金鑰保存庫的方法。

Note

僅支援 Azure 金鑰保存庫和 Azure 金鑰保存庫受控 HSM。 不支援 Azure 雲端 HSM。

使用 Azure 入口網站來建立金鑰保存庫

要使用 Azure 入口網站建立金鑰保險庫,請參見快速入門:使用 Azure 入口建立金鑰金庫。

Azure 角色型存取控制

使用 Azure 角色基礎存取控制(RBAC)來管理對 Azure Key Vault 的存取。 不要使用舊有存取政策。 舊有存取政策存在已知的安全漏洞,缺乏對 Privileged Identity Management(PIM)的支援,且不應用於關鍵資料與工作負載。 如需 Azure Key Vault RBAC 權限的詳細資訊,請參閱 金鑰保存庫 資料平面操作的 Azure 內建角色。

  1. 移至您所建立的金鑰保存庫資源,然後選取 [存取控制] (IAM) 設定。

  2. 選取 新增>新增角色指派。

    Azure 入口網站 [存取控制 (IAM)] 窗格上 [新增角色指派] 按鈕的螢幕擷取畫面。

  3. EKM 應用程式或管理身份需要 金鑰保存庫 加密服務的使用者角色來執行包裝與展開操作。 搜尋 金鑰保存庫加密服務使用者並選取角色。 選取 下一步。

    Azure 入口網站中 [選取角色指派] 的螢幕擷取畫面。

  4. 在「成員」標籤中,選擇「選擇成員」選項,然後搜尋你在步驟 1 中建立的 Microsoft Entra 應用程式或管理身份。 選取應用程式或受控識別,然後選取 選取 按鈕。

    Azure 入口網站中用於新增角色指派的 [選取角色] 窗格的螢幕擷取畫面。

  5. 選取「檢閱 + 指派」兩次以完成角色指派。

建立金鑰

建立金鑰的使用者需要 [金鑰保存庫管理員] 角色。 就像先前的步驟一樣,新增可建立金鑰的成員並指派角色。

  1. 在 [金鑰保存庫] 窗格中,選取 [金鑰],然後選取 [產生/匯入] 選項。 此操作會開啟「 建立鍵 窗格」。 選取 [產生] 選項,然後輸入金鑰名稱。 SQL Server 連接器需要金鑰名稱僅使用字元 "a-z"、"A-Z"、"0-9" 和 "-",且長度限制為 26 個字元。

  2. 使用金鑰類型 RSA,RSA 金鑰大小為 2048。 EKM 目前僅支援 RSA 金鑰。 根據需要設定啟用日期和到期日,並將 [啟用] 設為 [是]。

    [建立金鑰] 窗格的螢幕擷取畫面。

設定 Azure Key Vault Managed HSM(選用)

Azure Key Vault Managed HSM(硬體安全模組)在使用最新版的 SQL Server Connector 時,支援 SQL Server、在 Azure 虛擬機器(VM)上執行的 SQL Server,以及 Azure SQL。 管理 HSM 是一種完全管理、高可用性的單租戶 HSM 服務。 受控 HSM 為密碼編譯作業和金鑰儲存提供安全的基礎。 受控 HSM 的設計目的是要符合最嚴格的安全性和合規性需求。

步驟 2 說明如何在 Azure Key Vault 中建立金鑰保險庫和金鑰。 你可以選擇使用 Azure Key Vault 管理型 HSM 來儲存或建立 SQL Server 連接器的金鑰。 請遵循下列步驟:

  1. 使用 Azure portal、Azure CLI、PowerShell 或 ARM 模板創建 Azure Key Vault Managed HSM。

  2. 啟用受控 HSM。 只有在創建時指定的管理員才能啟用它。 在 Azure 入口網站中,選擇受管理的 HSM 資源,然後在概覽選單中選擇下載安全網域。 請依照其中一個 快速啟動程序啟動你的託管 HSM。

  3. 授予 Microsoft Entra 服務主體或受管理身份存取受管理 HSM 的權限。 受控 HSM 系統管理員角色不會授與建立金鑰的許可權。 與 步驟 2 類似,EKM 應用程式或受控識別需要具備 Managed HSM Crypto User 或 Managed HSM Crypto Service Encryption User 角色,才能執行包裝和解除包裝作業。 如需更多資訊,請參閱受控 HSM 的本地 RBAC 內建角色。

  4. 在 Azure Key Vault 受控 HSM 服務功能表中,於設定底下選取金鑰。 在金鑰視窗中,選取產/匯入/還原備份以建立金鑰或匯入現有的金鑰。

    Note

    自 2022 SQL Server(16.x)累積更新 13 起,支援 RSA-HSM_2048 與 RSA-HSM_3072 演算法。

    Azure Key Vault 管理式 HSM 支援自動金鑰輪換。 如需詳細資訊,請參閱在 Azure 管理的 HSM 中配置金鑰自動輪替。

    受控 HSM 支援私人端點連線。 如需詳細資訊,請參閱整合受控 HSM 與 Azure Private Link。 在此設定中,您必須在 Azure Key Vault 管理的 HSM 網路設定中啟用 Microsoft 可信服務繞過選項。

步驟 3:安裝 SQL Server 連接器

請 SQL Server 管理員從 Microsoft 下載中心 下載 Microsoft Server Azure Key Vault 最新版本的 SQL Server Connector,並執行安裝程式。

[SQL Server 連接器安裝精靈] 的螢幕擷取畫面。

按照預設,連接器會安裝在 C:\Program Files\SQL Server Connector for Microsoft Azure Key Vault。 你可以在設定時更改這個位置。 如果您變更了該項目,請在下一節中調整腳本。

安裝成功後,系統會將 Microsoft.AzureKeyVaultService.EKM.dll 安裝到電腦上。 此組件即為密碼學 EKM 提供者 DLL。 使用 CREATE CRYPTOGRAPHIC PROVIDER 陳述式向 SQL Server 註冊它。

安裝程式也提供 SQL Server 加密的範例腳本。

關於錯誤代碼說明、設定設定或維護任務,請參見:

步驟 4:新增登錄機碼以支援 EKM 提供者

Warning

只有真正知道自己在做什麼的 SQL Server 管理員才應該修改登錄檔。 錯誤的更改可能會造成嚴重問題。 在做任何更改前先備份登錄檔,這樣如果遇到問題可以還原。

  1. 執行 regedit 以開啟登錄編輯程式。

  2. 在 SQL Server Cryptographic Provider 建立HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SQL Server Cryptographic Provider登錄機碼。

  3. 以滑鼠右鍵按一下 SQL Server Cryptographic Provider 登錄機碼,然後選取 [權限]。

  4. 將執行 SQL Server 服務的使用者帳號的金鑰完全控制SQL Server Cryptographic Provider權。

    登錄編輯程式中 EKM 登錄機碼的螢幕擷取畫面。

  5. 選取 [] [套用],然後 [] [確定]。

  6. 關閉登錄編輯程式,然後重新啟動 SQL Server 服務。

    Note

    如果你在故障轉移叢集實例中使用 TDE 搭配 EKM 或 Azure Key Vault,也要加入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SQL Server Cryptographic Provider叢集登錄檔檢查點例程,讓登錄檔能跨節點同步,方便故障轉移和金鑰輪換後的資料庫復原。

    執行以下 PowerShell 指令,將登錄鍵加入檢查點例程中:

    Add-ClusterCheckpoint -RegistryCheckpoint "SOFTWARE\Microsoft\SQL Server Cryptographic Provider" -Resourcename "SQL Server"
    

步驟 5:設定 SQL Server

如需本節中每個動作所需最小權限等級的附註。請參閱 B. 常見問題集。

第一階段:在 master 中設定密碼編譯提供者和認證

選擇你的認證模式並依照相應步驟操作。

  1. 執行 sqlcmd 或開啟 SQL Server Management Studio。

  2. 執行下列 Transact-SQL 指令碼,將 SQL Server 設定為使用 EKM:

    -- Enable advanced options.
    USE master;
    GO
    
    EXEC sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    
    -- Enable EKM provider
    EXEC sp_configure 'EKM provider enabled', 1;
    GO
    RECONFIGURE;
    
  3. 將 SQL Server 連接器註冊為 SQL Server 的 EKM 提供者。

    使用 SQL Server 連接器來建立密碼編譯提供者,它是 Azure Key Vault 的 EKM 提供者。 在此範例中,提供者名稱為 AzureKeyVault_EKM。

    CREATE CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM
    FROM FILE = 'C:\Program Files\SQL Server Connector for Microsoft Azure Key Vault\Microsoft.AzureKeyVaultService.EKM.dll';
    GO
    

    Note

    檔案路徑長度不能超過 256 個字元。

  4. 設定 SQL Server 凭證以供 SQL Server 登入使用金鑰保存庫。

    為每個登入加一組憑證,使用金鑰庫中的金鑰進行加密。 憑證和登入之間有一對一的對應——每個登入必須有唯一的憑證。

    利用下列方式修改此 Transact-SQL 指令碼:

    • 編輯 IDENTITY 引數 (DocsSampleEKMKeyVault),以指向您的 Azure 金鑰保存庫。

      • 如果使用的是全域 Azure,請使用 Azure Key Vault 名稱來取代 IDENTITY 引數 (步驟 2:建立金鑰保存庫)。
      • 如果你使用的是私人 Azure 雲端(例如 Azure Government、21Vianet 營運的 Microsoft Azure,或 Azure 德國),請將參數替換IDENTITY為「使用 PowerShell 建立金鑰金庫與金鑰」中回傳的 Vault URI。 請不要在金鑰保存庫 URI 中包含 https://。
    • 將 SECRET 參數的第一部分取代為 步驟 1:設定認證模型 中的 Microsoft Entra 用戶端 ID。 在此範例中,用戶端識別碼為 d956f6b9xxxxxxx。

      Important

      請移除 App (Client) ID 中的連字號。

    • 用步驟 1 的SECRET完成論證的第二部分。 最終字串是一長串不含連字號的字母與數字(但用戶端密鑰本身中的任何連字號除外)。

    USE master;
    CREATE CREDENTIAL sysadmin_ekm_cred
       -- Set IDENTITY to the vault name (public Azure) or full vault hostname without https:// (sovereign clouds / Managed HSM)
       -- See https://learn.microsoft.com/azure/key-vault/general/about-keys-secrets-certificates#dns-suffixes-for-base-url
       WITH IDENTITY = 'DocsSampleEKMKeyVault',
             --<----Application (Client) ID ---><--Microsoft Entra app (Client) ID secret-->
       SECRET = 'd956f6b9xxxxxxxyrA8X~PldtMCvUZPxxxxxxxx'
    FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM;
    
    -- Add the credential to the SQL Server administrator's domain login
    ALTER LOGIN [<domain>\<login>]
        ADD CREDENTIAL sysadmin_ekm_cred;
    

    關於使用變數並程式化移除用戶端 ID 連字號的範例,請參見 CREATE CREDENTIAL。

  5. 在你的 SQL Server 實例中開啟 Azure Key Vault 金鑰。

    無論你是在步驟 2:建立金鑰保險庫時建立新金鑰還是匯入非對稱金鑰,請使用 CREATE ASYMMETRIC KEYSQL Server 開啟金鑰。

    Important

    在執行此步驟前,請先完成登記前置條件。

    在下列範例中:

    • 替換EKMSampleASYKey成你想在 SQL Server 中使用的名稱。
    • 在 Azure Key Vault 或 Managed HSM 裡替換ContosoRSAKey0成你的金鑰名稱。

    使用無版本的鍵名(大多數情況下建議):

    CREATE ASYMMETRIC KEY EKMSampleASYKey
       FROM PROVIDER [AzureKeyVault_EKM]
       WITH PROVIDER_KEY_NAME = 'ContosoRSAKey0',
          CREATION_DISPOSITION = OPEN_EXISTING;
    

    當你需要將操作固定到一個版本時,請使用特定的金鑰版本:

    CREATE ASYMMETRIC KEY EKMSampleASYKey
       FROM PROVIDER [AzureKeyVault_EKM]
       WITH PROVIDER_KEY_NAME = 'ContosoRSAKey0/1a4d3b9b393c4678831ccc60def75379',
          CREATION_DISPOSITION = OPEN_EXISTING;
    

    在這個例子中,1a4d3b9b393c4678831ccc60def75379是 SQL Server 用於資料庫操作的特定金鑰版本。

  6. 請利用上個步驟所建立的 SQL Server 非對稱金鑰來建立新登入。

    -- Create a login that associates the asymmetric key with this login
    CREATE LOGIN TDE_Login
        FROM ASYMMETRIC KEY EKMSampleASYKey;
    
  7. 將憑證映射從原本的管理員登入移到用非對稱金鑰建立的登入帳號。

    SQL Server 使用非對稱鍵(TDE_Login)建立的登入資料來進行 EKM 操作。 為了確保 SQL Server 在加密和復原作業期間能夠存取 Azure Key Vault,請將認證對應至 TDE_Login,而非原始的設定登入帳戶。

    -- Remove the service principal credential from the original setup login
    ALTER LOGIN [<domain>\<login>]
       DROP CREDENTIAL sysadmin_ekm_cred;
    
    -- Map the service principal credential to the login created from the asymmetric key
    ALTER LOGIN TDE_Login
       ADD CREDENTIAL sysadmin_ekm_cred;
    

第二階段:加密並驗證使用者資料庫

設定要加密的使用者資料庫

  1. 建立一個測試資料庫,使用 Azure Key Vault 金鑰進行加密。

    -- Create a test database for the TDE example.
    CREATE DATABASE TestTDE;
    
  2. 使用伺服器非對稱金鑰()建立資料庫加密金鑰。EKMSampleASYKey

    USE TestTDE;
    -- Create a DEK protected by the EKM asymmetric key.
    CREATE DATABASE ENCRYPTION KEY
    WITH ALGORITHM = AES_256
    ENCRYPTION BY SERVER ASYMMETRIC KEY EKMSampleASYKey;
    
  3. 透過設定 ENCRYPTION ON在資料庫中啟用 TDE 。

    -- Enable TDE for the database.
    ALTER DATABASE TestTDE
        SET ENCRYPTION ON;
    

驗證金鑰使用情況與加密狀態

  1. 在 master 資料庫中執行以下 Transact-SQL 查詢以驗證 EKM 非對稱金鑰的存在並擷取其指紋。

    SELECT name,
           algorithm_desc,
           thumbprint
    FROM sys.asymmetric_keys;
    

    該語句會回傳類似以下內容的輸出:

    name            algorithm_desc    thumbprint
    EKMSampleASYKey RSA_2048          <key thumbprint>
    
  2. 在使用者資料庫(),TestTDE執行以下 Transact-SQL 查詢以確認 TDE 是否啟用,且資料庫加密金鑰是否由非對稱金鑰保護。

    SELECT encryptor_type,
           encryption_state_desc,
           encryptor_thumbprint
    FROM sys.dm_database_encryption_keys
    WHERE database_id = DB_ID('TestTDE');
    

    該語句會回傳類似以下內容的輸出:

    encryptor_type encryption_state_desc encryptor_thumbprint
    ASYMMETRIC KEY ENCRYPTED             <key thumbprint>
    

    確認 encryptor_thumbprint 與從 sys.asymmetric_keys 傳回的指紋相符。 不符通常表示保護資料庫加密金鑰的金鑰與預期不符。

收拾整理

使用與你設定的認證模型相符的清理步驟。

  1. 清理你在此過程中建立的測試物件。

    -- CLEAN UP: shared objects + service principal credential
    USE master;
    GO
    ALTER DATABASE [TestTDE] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE [TestTDE];
    GO
    
    DROP LOGIN [TDE_Login];
    GO
    
    DROP ASYMMETRIC KEY [EKMSampleASYKey];
    DROP CRYPTOGRAPHIC PROVIDER [AzureKeyVault_EKM];
    GO
    
    DROP CREDENTIAL [sysadmin_ekm_cred];
    GO
    
  2. 檢視是否應該移除 SQL Server Cryptographic Provider 登錄檔金鑰。

    Important

    SQL Server Cryptographic Provider刪除 EKM 金鑰後,登錄檔金鑰不會自動移除。

    只有當你不再需要 EKM 時,才刪除這個登錄檔金鑰。 過早刪除可能會破壞 EKM 功能和復原操作。

    登入路徑: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SQL Server Cryptographic Provider

更新即將到期或已到期的用戶端密碼

如果你使用服務主體認證,請在 Microsoft Entra 應用程式的用戶端秘密到期前更新。 如果秘密已經過期,請建立替代秘密並依本節說明更新現有的 SQL Server 憑證。 此程序不適用於管理身份驗證,因為該認證不使用用戶端秘密。

更新用戶端秘密會更新 SQL Server 用來認證 Azure Key Vault 的憑證。 它不會輪換非對稱金鑰,也不會改變資料庫加密金鑰。

要更新 SQL Server 憑證,你需要取得ALTER ANY CREDENTIAL權限。 欲了解更多資訊,請參見 ALTER CREDENTIAL (Transact-SQL)。

  1. 在 Azure 入口網站中,打開 Microsoft Entra ID>應用程式註冊,並選擇 SQL Server 用來存取 Azure Key Vault 的現有應用程式。 選取 [憑證和祕密]>[用戶端密碼]>[新增用戶端密碼]。 輸入描述和到期時間,選取 新增,然後複製新祕密的 Value,而非其 Secret ID。

  2. 更新現有的 SQL Server 憑證,使用相同身份和新的認證值。 在以下範例中:

    • 請將現有憑證名稱替換 sysadmin_ekm_cred 。
    • 用該憑證現有的身份來替換 DocsSampleEKMKeyVault 。 保留你建立憑證時使用的保險庫名稱或主機名稱。
    • 以應用程式的用戶端 ID 取代 <client_id_without_hyphens><new_client_secret> ,並移除連字號,然後立即更換新的用戶端秘密值。 不要插入空格或分隔符,並保留 client-secret 值中的所有連字號。 不要單獨使用用戶端密碼值。
    USE master;
    GO
    ALTER CREDENTIAL sysadmin_ekm_cred
       WITH IDENTITY = 'DocsSampleEKMKeyVault',
       SECRET = '<client_id_without_hyphens><new_client_secret>';
    GO
    
  3. 對每個使用被替換用戶端秘密的 SQL Server 憑證(包括由 TDE 非對稱金鑰建立的登入資料)重複更新憑證。 如果你在可用性群組中使用 EKM,請更新每個副本中受影響的憑證。

  4. 更新憑證後重新啟動 SQL Server 服務。 對於可用性群組,請在每個副本上執行重新啟動,作為你計畫維護的一部分。 服務重啟會中斷連線,因此請將重啟與你的可用性需求協調。

  5. 重新連接 SQL Server,確認加密資料庫是否可存取。 如果你使用 SQL Server Management Studio,請重啟它以清除會話的快取憑證。 只有在所有 SQL Server 實例及其他使用該秘密的應用程式都已更新並驗證後,才從應用程式註冊中移除舊的客戶端秘密。

使用 Azure Key Vault 輪替 TDE 的非對稱金鑰

使用專門的操作指南來了解關鍵輪替步驟,包括認證專用腳本、驗證及安全檢查:

Important

輪換後,請不要刪除先前版本的金鑰。 早期版本可能仍需用於恢復舊備份、日誌檔案及復原產物。