適用於:SQL Server
使用非對稱金鑰並由 Azure Key Vault 保護的常見 SQL Server 加密活動,可分為以下三個範疇:
- 透過使用 Azure Key Vault 的非對稱金鑰實現透明資料加密(TDE)。
- 利用金鑰庫中的非對稱金鑰加密備份。
- 利用金鑰庫中的非對稱金鑰進行欄位層級加密。
在遵循本文步驟前,請先完成 Set Up 透明資料加密 with Azure Key Vault for SQL Server 的第 1 到 4 步驟。
注意
1.0.0.440 及更早版本則被取代,不再支援在生產環境中使用。 升級至 1.0.1.0 或更新版本以上。 請從 Microsoft 下載中心 下載目前的版本,並依照 SQL Server Connector 維護與故障排除中「升級 SQL Server 連接器」部分的指示操作。
注意
Microsoft Entra ID 先前稱為 Azure Active Directory (Azure AD)。
透過使用 Azure Key Vault 的非對稱金鑰實現透明資料加密
完成 為 SQL Server 使用 Azure Key Vault 設定透明資料加密 的第 1 到第 4 個步驟後,使用 Azure Key Vault 金鑰透過 TDE 加密資料庫加密金鑰。 欲了解更多使用 PowerShell 旋轉金鑰的資訊,請參見「使用 PowerShell 旋轉 透明資料加密 (TDE) 保護器」。
重要
變換金鑰後,請不要刪除先前版本的金鑰。 當金鑰滾存時,部分資料仍會被先前的金鑰加密,例如較舊的資料庫備份、備份的日誌檔案和交易日誌檔案。
你需要建立一個認證和一個登入,並建立一個資料庫加密金鑰來加密資料庫中的資料和交易記錄。 加密資料庫需要資料庫的 CONTROL 權限。 以下圖表顯示使用 Azure Key Vault 時加密金鑰的階層。
建立 SQL Server 認證,以供 資料庫引擎 使用於 TDE
資料庫引擎 在資料庫載入時使用 Microsoft Entra 應用程式憑證來存取金鑰庫。 為了限制你所授予的 Key Vault 權限,請依照步驟 1:設定認證模型中所述,為 資料庫引擎 建立另一個 Client ID 和 Secret。
使用下列方式修改下面的 Transact-SQL 指令碼:
編輯
IDENTITY引數 (ContosoDevKeyVault),以指向您的 Azure 金鑰保存庫。- 如果使用的是全域 Azure,請使用 Azure Key Vault 名稱來取代
IDENTITY引數 (步驟 2:建立金鑰保存庫)。 - 如果您使用私人 Azure 雲端,例如 Azure Government、由 21Vianet 營運的 Azure 或 Azure 德國,請將
IDENTITY引數取代為使用 PowerShell 建立金鑰保存庫和金鑰中傳回的 Vault URI。 請不要在金鑰保存庫 URI 中包含https://。
- 如果使用的是全域 Azure,請使用 Azure Key Vault 名稱來取代
將參數的第一
SECRET部分替換為步驟 1:設定認證模型中的 Microsoft Entra 應用程式客戶端 ID。 在此範例中,用戶端識別碼為EF5C8E094D2A4A769998D93440D8115D。重要
您必須移除 用戶端識別碼中的連字號。
用第一步中的
SECRET完成引數的第二部分。 在此範例中,用戶端密碼為ReplaceWithAADClientSecret。SECRET引數的最後一個字串是一長串字母和數字,沒有連字號。
USE master; CREATE CREDENTIAL Azure_EKM_TDE_cred WITH IDENTITY = 'ContosoDevKeyVault', -- for global Azure -- WITH IDENTITY = 'ContosoDevKeyVault.vault.usgovcloudapi.net', -- for Azure Government -- WITH IDENTITY = 'ContosoDevKeyVault.vault.azure.cn', -- for Microsoft Azure operated by 21Vianet -- WITH IDENTITY = 'ContosoDevKeyVault.vault.microsoftazure.de', -- for Azure Germany SECRET = 'EF5C8E094D2A4A769998D93440D8115DReplaceWithAADClientSecret' FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov;為 資料庫引擎 中的 TDE 建立 SQL Server 登入
建立 SQL Server 登入,並在其中新增步驟 1 中的認證。 這個 Transact-SQL 範例會使用稍早匯入的相同金鑰。
USE master; -- Create a SQL Server login associated with the asymmetric key -- for the Database engine to use when it loads a database -- encrypted by TDE. CREATE LOGIN TDE_Login FROM ASYMMETRIC KEY CONTOSO_KEY; GO -- Alter the TDE Login to add the credential for use by the -- Database Engine to access the key vault ALTER LOGIN TDE_Login ADD CREDENTIAL Azure_EKM_TDE_cred ; GO建立資料庫加密金鑰(DEK)
DEK 會加密你在資料庫實例中的資料和日誌檔案,然後再由 Azure Key Vault 非對稱金鑰加密。 你可以使用任何 SQL Server 支援的演算法或金鑰長度來建立 DEK。
USE ContosoDatabase; GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER ASYMMETRIC KEY CONTOSO_KEY; GO開啟TDE
-- Alter the database to enable transparent data encryption. ALTER DATABASE ContosoDatabase SET ENCRYPTION ON; GO使用 Management Studio,使用 物件總管 連線到您的資料庫,以確認 TDE 是否已開啟。 右鍵點擊你的資料庫,指向 任務,然後選擇 管理資料庫加密。
在 [管理資料庫加密] 對話方塊中,確認已開啟 TDE,以及哪個非對稱金鑰正在加密 DEK。
或者,您可以執行下列 Transact-SQL 指令碼。 加密狀態 3 表示加密的資料庫。
USE MASTER SELECT * FROM sys.asymmetric_keys -- Check which databases are encrypted using TDE SELECT d.name, dek.encryption_state FROM sys.dm_database_encryption_keys AS dek JOIN sys.databases AS d ON dek.database_id = d.database_id;注意
只要任何資料庫啟用 TDE,就會自動加密
tempdb資料庫。
使用金鑰庫中的非對稱金鑰加密備份
自 SQL Server 2014 (12.x) 開始,支援加密備份。 以下範例建立並還原一個以由金鑰保存庫中的非對稱金鑰保護的資料加密金鑰加密的備份。
資料庫引擎 在資料庫載入時使用 Microsoft Entra 應用程式憑證來存取金鑰庫。 為了限制你所授予的金鑰保險庫權限,請如步驟 1:設定認證模型所述,為 資料庫引擎 建立另一個 Client ID 和 Secret。
為 資料庫引擎 建立一個 SQL Server 憑證,用於備份加密
使用下列方式修改下面的 Transact-SQL 指令碼:
編輯
IDENTITY引數 (ContosoDevKeyVault),以指向您的 Azure 金鑰保存庫。- 如果使用的是全域 Azure,請使用 Azure Key Vault 名稱來取代
IDENTITY引數 (步驟 2:建立金鑰保存庫)。 - 如果你使用的是私人 Azure 雲端,例如 Azure Government、由 21Vianet 營運的 Microsoft Azure 或 Azure 德國,請將
IDENTITY參數替換為 使用 PowerShell 建立金鑰保存庫和金鑰 中回傳的 Vault URI。 請不要在金鑰保存庫 URI 中包含https://。
- 如果使用的是全域 Azure,請使用 Azure Key Vault 名稱來取代
將
SECRET參數的第一部分替換為來自步驟 1:設定認證模型的 Microsoft Entra 應用程式 Client ID。 在此範例中,用戶端識別碼為EF5C8E094D2A4A769998D93440D8115D。重要
您必須移除 用戶端識別碼中的連字號。
用第一步的
SECRET完成引數的第二部分。 在此範例中, 客戶端秘密 為Replace-With-AAD-Client-Secret。SECRET引數的最後一個字串是一長串字母和數字,沒有連字號。USE master; CREATE CREDENTIAL Azure_EKM_Backup_cred WITH IDENTITY = 'ContosoDevKeyVault', -- for global Azure -- WITH IDENTITY = 'ContosoDevKeyVault.vault.usgovcloudapi.net', -- for Azure Government -- WITH IDENTITY = 'ContosoDevKeyVault.vault.azure.cn', -- for Microsoft Azure operated by 21Vianet -- WITH IDENTITY = 'ContosoDevKeyVault.vault.microsoftazure.de', -- for Azure Germany SECRET = 'EF5C8E094D2A4A769998D93440D8115DReplace-With-AAD-Client-Secret' FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov;
為 資料庫引擎 建立 SQL Server 登入以進行備份加密
建立資料庫引擎用來進行加密備份的 SQL Server 登入,並將步驟 1 中的認證新增至其中。 這個 Transact-SQL 範例會使用稍早匯入的相同金鑰。
重要
如果你已經用同一把非對稱金鑰做備份加密(前述例子)或欄位層級加密(下一個例子),就不能再用同一把非對稱金鑰做備份加密。
此範例使用
CONTOSO_KEY_BACKUP存放在金鑰保險庫中的非對稱金鑰,您可以如步驟 2:建立金鑰保險庫所述master,提前為資料庫匯入或建立該金鑰。USE master; -- Create a SQL Server login associated with the asymmetric key -- for the Database engine to use when it is encrypting the backup. CREATE LOGIN Backup_Login FROM ASYMMETRIC KEY CONTOSO_KEY_BACKUP; GO -- Alter the Encrypted Backup Login to add the credential for use by -- the Database Engine to access the key vault ALTER LOGIN Backup_Login ADD CREDENTIAL Azure_EKM_Backup_cred ; GO備份資料庫
備份資料庫,並指定加密,使用存放在金鑰庫中的非對稱金鑰。
以下範例中,若資料庫已以 TDE 加密,且非對稱金鑰
CONTOSO_KEY_BACKUP與 TDE 非對稱金鑰不同,備份則同時由 TDE 非對稱金鑰與CONTOSO_KEY_BACKUP加密。 目標 SQL Server 實例需要兩個金鑰才能解密備份。USE master; BACKUP DATABASE [DATABASE_TO_BACKUP] TO DISK = N'[PATH TO BACKUP FILE]' WITH FORMAT, INIT, SKIP, NOREWIND, NOUNLOAD, ENCRYPTION(ALGORITHM = AES_256, SERVER ASYMMETRIC KEY = [CONTOSO_KEY_BACKUP]); GO還原資料庫
要還原以 TDE 加密的資料庫備份,目標 SQL Server 執行個體必須先擁有用於加密的金鑰保存庫中的非對稱金鑰副本。 若要提供該複本:
如果原本用於 TDE 的非對稱金鑰已不在金鑰庫中,請還原金鑰庫的金鑰備份或從本地 HSM 重新匯入金鑰。 為了讓金鑰的指紋與資料庫備份中記錄的指紋相符,金鑰必須使用其原先的相同金鑰保存庫金鑰名稱。
對目標 SQL Server 實例套用步驟 1 和 2。
當目標 SQL Server 實例取得用於加密備份的非對稱金鑰後,還原伺服器上的資料庫。
範例還原程式碼:
RESTORE DATABASE [DATABASE_TO_BACKUP] FROM DISK = N'[PATH TO BACKUP FILE]' WITH FILE = 1, NOUNLOAD, REPLACE; GO欲了解更多備用選項,請參見 BACKUP (Transact-SQL)。
利用金鑰庫中的非對稱金鑰進行欄位層級加密
下列範例會建立一個對稱密鑰,並由金鑰保存庫中的非對稱密鑰加以保護。 對稱金鑰接著會加密資料庫中的資料。
重要
如果你已經用同一把非對稱金鑰做備份加密,就不能再用同一把不對稱金鑰來做欄位層級加密。
此範例使用 CONTOSO_KEY_COLUMNS 存放在金鑰保險庫中的非對稱金鑰,您可以如 步驟 2:建立金鑰保險庫所描述,提前匯入或建立該金鑰。 若要在 ContosoDatabase 資料庫中使用這個非對稱金鑰,請再次執行 CREATE ASYMMETRIC KEY 陳述式,讓 ContosoDatabase 資料庫獲得該金鑰的參考。
USE [ContosoDatabase];
GO
-- Create a reference to the key in the key vault
CREATE ASYMMETRIC KEY CONTOSO_KEY_COLUMNS
FROM PROVIDER [AzureKeyVault_EKM_Prov]
WITH PROVIDER_KEY_NAME = 'ContosoDevRSAKey2',
CREATION_DISPOSITION = OPEN_EXISTING;
-- Create the data encryption key.
-- The data encryption key can be created using any SQL Server
-- supported algorithm or key length.
-- The DEK will be protected by the asymmetric key in the key vault
CREATE SYMMETRIC KEY DATA_ENCRYPTION_KEY
WITH ALGORITHM=AES_256
ENCRYPTION BY ASYMMETRIC KEY CONTOSO_KEY_COLUMNS;
DECLARE @DATA VARBINARY(MAX);
--Open the symmetric key for use in this session
OPEN SYMMETRIC KEY DATA_ENCRYPTION_KEY
DECRYPTION BY ASYMMETRIC KEY CONTOSO_KEY_COLUMNS;
--Encrypt syntax
SELECT @DATA = ENCRYPTBYKEY
(
KEY_GUID('DATA_ENCRYPTION_KEY'),
CONVERT(VARBINARY,'Plain text data to encrypt')
);
-- Decrypt syntax
SELECT CONVERT(VARCHAR, DECRYPTBYKEY(@DATA));
--Close the symmetric key
CLOSE SYMMETRIC KEY DATA_ENCRYPTION_KEY;