Microsoft Azure Key Vault 的 SQL Server 連接器使 SQL Server 能夠利用 Azure Key Vault 服務作為可擴展金鑰管理(EKM)提供者來保護其加密金鑰。
本主題包含:
EKM 的用途
組織可以使用 SQL Server 加密來保護敏感資料。 SQL Server 加密包括 透明資料加密(TDE)、欄位層級加密(CLE)及備份加密。 在所有這些情況下,資料都是使用對稱資料加密金鑰進行加密。 對稱資料加密金鑰會以儲存在 SQL Server 中的金鑰階層加密,受到更進一步的保護。 另外,EKM 提供者架構允許SQL Server透過外部加密提供者中儲存在SQL Server外的非對稱金鑰來保護資料加密金鑰。 採用 EKM 供應商架構可增加額外安全層,並允許組織分開管理金鑰與資料。
SQL Server 連接器用於 Azure Key Vault,讓 SQL Server 能利用可擴展、高效能且高度可用的 Key Vault 服務,作為加密金鑰保護的 EKM 提供者。 金鑰保險庫服務可用於 Microsoft Azure 虛擬機器 上的 SQL Server 安裝,以及本地伺服器。 金鑰保存庫服務也提供選項,以使用受到緊密控制和監視的硬體安全性模組 (HSM),對非對稱加密金鑰提供更高等級的保護。 如需金鑰保存庫的詳細資訊,請參閱 Azure 金鑰保存庫。
下列影像摘要說明使用金鑰保存庫的 EKM 處理流程。 圖片中的製程步驟編號並非與影像後面的設定步驟編號相符。
步驟 1:設定 金鑰保存庫 供 SQL Server 使用
請依照以下步驟設定一個金鑰庫,以便使用 SQL Server Database Engine 進行加密金鑰保護。 組織中可能已經有保險庫在使用中。 當保險庫不存在時,組織中負責管理加密金鑰的 Azure 管理員可以建立保險庫,產生一個非對稱金鑰,然後授權 SQL Server 使用該金鑰。 為了熟悉 key vault service review,請開始使用 Azure Key Vault 和 PowerShell Azure Key Vault Cmdlets 參考。
Important
如果你有多個 Azure 訂閱,必須使用包含 SQL Server 的訂閱。
建立保險庫:請依照「以 Azure Key Vault 開始」中「建立金鑰金庫」章節的說明來建立保險庫。 記錄保險庫名稱。 本主題使用 ContosoKeyVault 作為金鑰庫名稱。
在保險庫中產生一個非對稱金鑰:金鑰庫中的非對稱金鑰用於保護 SQL Server 加密金鑰。 只有非對稱金鑰的公開部分會離開保險庫,私有部分永遠不會被保險庫匯出。 所有使用非對稱金鑰的密碼操作皆委派至 Azure Key Vault,並受金鑰金庫安全保護。
有幾種方法可以產生非對稱金鑰並將其存放在保險庫中。 你可以外部產生一個金鑰,然後把金鑰匯入 vault 裡,變成 .pfx 檔案。 或者直接在保險庫裡用金鑰庫的 API 建立金鑰。
SQL Server 連接器要求非對稱金鑰為 2048 位元 RSA,且金鑰名稱只能使用字元「a-z」、「A-Z」、「0-9」和「-」。 在本文件中,非對稱金鑰的名稱稱為 ContosoMasterKey。 用你用的唯一鑰匙名稱取代這個。
Important
在生產場景中,強力建議匯入非對稱金鑰,因為這允許管理員將金鑰託管於金鑰託管系統中。 如果非對稱金鑰是在保險庫中建立的,則無法被託管,因為私鑰永遠無法離開保險庫。 用於保護關鍵資料的金鑰應該被託管。 遺失非對稱金鑰會導致資料永久無法恢復。
Important
金鑰庫支援同一名稱金鑰的多個版本。 SQL Server 連接器使用的金鑰不應有版本控制或擲骰。 若管理員想滾動用於 SQL Server 加密的金鑰,應在保險庫中建立一組名稱不同的新金鑰,並用來加密 DEK。
如需更多關於如何將金鑰匯入金鑰庫或在金鑰庫中建立金鑰(不建議用於生產環境)的資訊,請參閱「從 Azure Key Vault 開始」中「新增金鑰或秘密到金鑰庫」章節。
取得 Azure Active Directory 服務主體以用於 SQL Server:當組織註冊 Microsoft 雲端服務時,會獲得一個 Azure Active Directory。 在 Azure Active Directory 中建立服務主體,供 SQL Server 使用(以驗證自己至 Azure Active Directory),存取 key vault。
SQL Server 管理員在設定 SQL Server 使用加密時,需要一個服務主體來存取保險庫。
SQL Server Database Engine 需要另一位服務主體來存取保險庫,以展開 SQL Server 加密中使用的金鑰。
欲了解更多如何註冊應用程式及產生服務主體的資訊,請參閱「以 Azure Key Vault 開始」中的「以 Azure Active Directory 註冊應用程式」章節。 註冊過程中會為每個 Azure Active Directory 服務主體回傳一個應用程式 ID(也稱為 CLIENT ID)和一個認證金鑰(也稱為 Secret)。 在語句中使用
CREATE CREDENTIAL時,必須從 CLIENT ID 中移除連字號。 請錄製這些內容,以便以下劇本使用:系統管理員登入的服務主體:CLIENTID_sysadmin_login 和 SECRET_sysadmin_login
SQL Server Database Engine服務主任:CLIENTID_DBEngine及SECRET_DBEngine。
授權服務主體存取金鑰保存庫:CLIENTID_sysadmin_login 與 CLIENTID_DBEngineService 主體都需要在key vault中取得、列舉、wrapKey 和 unwrapKey 權限。 如果你打算透過 SQL Server 建立金鑰,也需要在金鑰保險庫中授予建立權限。
Important
使用者必須至少具備金鑰保險庫的 wrapKey 與 unwrapKey 操作。
欲了解更多關於授予保險庫權限的資訊,請參閱「以 Azure Key Vault 開始使用應用程式的授權使用金鑰或秘密」章節。
連結至Azure Key Vault文件
PowerShell Azure 金鑰保存庫 Cmdlets 參考
步驟 2:安裝 SQL Server 連接器
SQL Server 連接器由 SQL Server 電腦的管理員下載並安裝。 SQL Server 連接器可從 Microsoft 下載中心 下載。 搜尋 SQL Server 連接器 for Microsoft Azure Key Vault,查看詳細資訊、系統需求及安裝說明,選擇下載連接器並使用 Run 開始安裝。 請檢視授權並接受授權,繼續進行。
預設情況下,連接器安裝於 C:\Program Files\SQL Server 連接器 for Microsoft Azure Key Vault。 這個位置可以在安裝期間變更。 (如有更改,請調整下方的腳本。)
安裝完成後,機器會安裝以下裝置:
Microsoft.AzureKeyVaultService.EKM.dll:這是需要透過CREATE CRYPTOGRAPHIC PROVIDER帳號向SQL Server註冊的加密 EKM 提供者 DLL。
Azure Key Vault SQL Server連接器:這是一種Windows服務,使密碼學 EKM 提供者能與金鑰庫通訊。
SQL Server 連接器安裝也可讓您選擇性地下載 SQL Server 加密的範例指令碼。
步驟 3:設定 SQL Server 使用 EKM 提供者來管理 金鑰保存庫
許可
完成整個流程需 CONTROL SERVER 權限或系統 管理員 固定伺服器角色的成員資格。 特定行動需要以下權限:
建立密碼學提供者需具備 CONTROL SERVER 權限或系統 管理員 固定伺服器角色的成員資格。
要更改設定選項並執行 RECONFIGURE 語句,必須獲得伺服器層級的 ALTER SETTINGS 權限。 ALTER SETTINGS 權限隱含由 系統管理員 與 伺服器管理員 固定伺服器角色持有。
要建立憑證,需要更改任何 CREDENTIAL 權限。
要為登入新增憑證,需要更改任何 LOGIN 權限。
若要建立非對稱金鑰,需要 CREATE ASYMMETRIC KEY 權限。
要設定 SQL Server 以使用密碼學提供者
將 資料庫引擎 設定為使用 EKM,並向 SQL Server 註冊(建立)密碼提供者。
-- Enable advanced options. USE master; GO sp_configure 'show advanced options', 1 ; GO RECONFIGURE ; GO -- Enable EKM provider sp_configure 'EKM provider enabled', 1 ; GO RECONFIGURE ; GO -- Create a cryptographic provider, using the SQL Server Connector -- which is an EKM provider for the Azure Key Vault. This example uses -- the name AzureKeyVault_EKM_Prov. CREATE CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov FROM FILE = 'C:\Program Files\SQL Server Connector for Microsoft Azure Key Vault\Microsoft.AzureKeyVaultService.EKM.dll'; GO為 SQL Server 管理員建立一個憑證,讓 SQL Server 管理員登入,使用金鑰庫來設定和管理 SQL Server 加密情境。
Important
IDENTITY的
CREATE CREDENTIAL論證需要金鑰庫名稱。 SECRET 參數要求 >無連字符)與 > 必須同時傳遞,且兩者之間不留空格。在以下範例中, Client ID (
00001111-aaaa-2222-bbbb-3333cccc4444) 被去除連字號,並以字串00001111AAAA2222BBBB3333CCCC4444形式輸入, Secret 則以字串 SECRET_sysadmin_login 表示。USE master; CREATE CREDENTIAL sysadmin_ekm_cred WITH IDENTITY = 'ContosoKeyVault', SECRET = '00001111AAAA2222BBBB3333CCCC4444SECRET_sysadmin_login' FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov ; -- Add the credential to the SQL Server administrators domain login ALTER LOGIN [<domain>/<login>] ADD CREDENTIAL sysadmin_ekm_cred;關於使用變數作為
CREATE CREDENTIAL參數並程式化移除客戶端 ID 連字號的範例,請參見 CREATE CREDENTIAL (Transact-SQL)如果你如前述步驟1第3節所描述的非對稱金鑰,請在以下範例中輸入你的金鑰名稱來開啟該金鑰。
CREATE ASYMMETRIC KEY CONTOSO_KEY FROM PROVIDER [AzureKeyVault_EKM_Prov] WITH PROVIDER_KEY_NAME = 'ContosoMasterKey', CREATION_DISPOSITION = OPEN_EXISTING;雖然不建議用於生產環境(因為無法匯出金鑰),但可以直接從 SQL Server 在保險庫中建立非對稱金鑰。 如果你之前沒有匯入金鑰,請在金鑰庫中用以下腳本建立一個非對稱金鑰進行測試。 執行腳本,使用以 sysadmin_ekm_cred 憑證配置的登入方式。
CREATE ASYMMETRIC KEY CONTOSO_KEY FROM PROVIDER [AzureKeyVault_EKM_Prov] WITH ALGORITHM = RSA_2048, PROVIDER_KEY_NAME = 'ContosoMasterKey';
Tip
收到錯誤的使用者 無法從提供者匯出公鑰。提供者錯誤代碼:2053。 應該檢查他們在金鑰保險庫中的 取得、 清單、 包裹Key 和 unwrapKey 權限。
如需詳細資訊,請參閱下列:
Examples
範例 A:使用 金鑰保存庫 中的非對稱金鑰進行 透明資料加密
完成上述步驟後,建立憑證和登入,建立一把資料庫加密金鑰,並用金鑰庫中的非對稱金鑰保護。 使用資料庫加密金鑰來加密 TDE 的資料庫。
要加密資料庫需要對資料庫取得 CONTROL 權限。
使用 EKM 與 金鑰保存庫 啟用 TDE
建立一個 SQL Server 憑證,讓 資料庫引擎 在資料庫載入時存取金鑰庫 EKM。
Important
IDENTITY的
CREATE CREDENTIAL論證需要金鑰庫名稱。 SECRET 參數要求 >無連字符)與 > 必須同時傳遞,且兩者之間不留空格。以下範例中, Client ID (
00001111-aaaa-2222-bbbb-3333cccc4444) 被去除連字號,輸入為字串00001111AAAA2222BBBB3333CCCC4444, Secret 則以字串 SECRET_DBEngine 表示。USE master; CREATE CREDENTIAL Azure_EKM_TDE_cred WITH IDENTITY = 'ContosoKeyVault', SECRET = '00001111AAAA2222BBBB3333CCCC4444SECRET_DBEngine' FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov ;建立一個 SQL Server 登入帳號,供 資料庫引擎 用於 TDE,並將憑證加入其中。 此範例使用了存放在金鑰庫中的CONTOSO_KEY非對稱金鑰,該金鑰先前已匯入或建立用於主資料庫,詳見上 方步驟3,第3節 。
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建立用於 TDE 的資料庫加密金鑰(DEK)。 DEK 可使用 SQL Server 支援的任何演算法或金鑰長度來建立。 DEK 會受到金鑰庫中的非對稱金鑰保護。
此範例使用了存放在金鑰保險庫中的CONTOSO_KEY非對稱金鑰,該金鑰先前已匯入或建立,詳見上 方步驟3,第3節 。
USE ContosoDatabase; GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER ASYMMETRIC KEY CONTOSO_KEY; GO -- Alter the database to enable transparent data encryption. ALTER DATABASE ContosoDatabase SET ENCRYPTION ON ; GO如需詳細資訊,請參閱下列:
範例 B:使用來自 金鑰保存庫 的非對稱金鑰加密備份
自 SQL Server 2014 起支援加密備份。 下列範例建立和還原一個使用資料加密金鑰加密的備份,該金鑰由金鑰保存庫中的非對稱金鑰保護。
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]);
GO
範例還原程式碼。
RESTORE DATABASE [DATABASE_TO_BACKUP]
FROM DISK = N'[PATH TO BACKUP FILE]' WITH FILE = 1, NOUNLOAD, REPLACE;
GO
欲了解更多備用選項,請參見 BACKUP (Transact-SQL)。
範例 C:利用 金鑰保存庫 的非對稱金鑰進行欄位層級加密
下列範例會建立一個對稱密鑰,並由金鑰保存庫中的非對稱密鑰加以保護。 然後使用對稱金鑰加密資料庫中的資料。
此範例使用了存放在金鑰保險庫中的CONTOSO_KEY非對稱金鑰,該金鑰先前已匯入或建立,詳見上 方步驟3,第3節 。 若要在 ContosoDatabase 資料庫中使用這個非對稱金鑰,您必須再執行一次 CREATE ASYMMETRIC KEY 陳述式,以提供參考這個金鑰的 ContosoDatabase 資料庫。
USE [ContosoDatabase];
GO
-- Create a reference to the key in the key vault
CREATE ASYMMETRIC KEY CONTOSO_KEY
FROM PROVIDER [AzureKeyVault_EKM_Prov]
WITH PROVIDER_KEY_NAME = 'ContosoMasterKey',
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;
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;
--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;
另請參閱
CREATE CRYPTOGRAPHIC PROVIDER (Transact-SQL)CREATE CREDENTIAL (Transact-SQLCREATE ASYMMETRIC KEY) (Transact-SQL)CREATE SYMMETRIC KEY (Transact-SQL)可擴展金鑰管理(EKM)啟用 TDE 使用EKM備份加密建立加密備份