適用於:Azure SQL 資料庫
這個教學教你如何在 Azure SQL Database 中開始使用 Always Encrypted with secure enclaves。 你會使用 Intel Software Guard Extensions(Intel SGX)enclaves。 教學內容包括:
重要
Always Encrypted with Intel Software Guard Extensions(Intel SGX)enclaves 將於 2027 年 10 月 31 日結束支援。 在此日期前遷移受影響的資料庫。 2027 年 10 月 31 日後,Azure 會自動將仍屬於 DC 系列運算層的任何資料庫移至支援的標準系列(非 DC)運算層,並啟用虛擬化架構安全性 (VBS) 安全隔離區。 關於遷移選項,請參閱 《Always Encrypted with Intel SGX enclaves》遷移指南。
- 如何建立環境來測試和評估具有 Intel SGX 安全區的 Always Encrypted。
- 如何在原地加密資料,並使用 SQL Server Management Studio (SSMS) 對加密資料行發出詳盡的保密查詢。
必要條件
- 有效的 Azure 訂用帳戶。 如果您沒有訂用帳戶,請建立免費帳戶。 您必須是「參與者」角色或訂用帳戶的「擁有者」角色的成員,才能建立資源和設定證明原則。
- 不強制,但建議用來儲存 Always Encrypted 的資料行主要金鑰:Azure Key Vault 中的金鑰保存庫。 如需建立金鑰保存庫的資訊,請參閱快速入門:使用 Azure 入口網站建立金鑰保存庫。
- 如果您的金鑰保存庫使用存取原則權限模型,請確定您在金鑰保存庫中具有下列金鑰權限:
get、list、create、unwrap key、wrap key、verify、sign。 如需詳細資訊,請參閱指派 金鑰保存庫 存取原則。 - 如果您使用 Azure 角色型存取控制(RBAC)權限模型,請確認您是金鑰保存庫的 金鑰保存庫 Crypto Officer 角色成員。 請參閱使用 Azure 角色型存取控制來提供 金鑰保存庫 金鑰、憑證和秘密的存取權。
- 如果您的金鑰保存庫使用存取原則權限模型,請確定您在金鑰保存庫中具有下列金鑰權限:
- 最新版本的 SQL Server Management Studio (SSMS)。
PowerShell 需求
注意
本節所列的必要條件僅於您在本教學課程中的某些步驟選擇使用 PowerShell 時才適用。 如果您計劃改用 Azure 入口網站,可以略過本節。 Microsoft 建議執行 Always Encrypted PowerShell 腳本時,使用 PowerShell 7 或更新版本。 PowerShell 7 提供更佳的跨平台支援、更佳的效能,以及與 SqlServer 模組(v22+)的最新相容性,這是許多 Always Encrypted 情境所必需的。
需要 Az PowerShell 模組 9.3.0 版或更新版本。 如需如何安裝 Az PowerShell 模組的詳細資料,請參閱安裝 Azure Az PowerShell 模組。 若要判斷電腦上安裝的 Az PowerShell 模組版本,請從 PowerShell 執行下列命令。
Get-InstalledModule -Name Az
步驟 1:建立和設定伺服器和 DC 系列資料庫
在此步驟中,您將需要使用 DC 系列硬體建立新的 Azure SQL Database 邏輯伺服器與新的資料庫,以供具有安全記憶體保護區的 Always Encrypted 使用。 如需詳細資訊,請參閱 DC 系列。
在資源選單中,展開 Azure SQL 資料庫 並選擇 SQL 資料庫。
從 + Create 下拉選單中,選擇 SQL 資料庫。
在建立 SQL 資料庫表單的基本資料索引標籤上,在專案詳細資料下,選取想要的 Azure 訂用帳戶。
針對 [資源群組],選取 [新建],輸入您的資源群組名稱,然後選取 [確定]。
針對 [資料庫名稱],輸入 ContosoHR。
在伺服器中,選取 [建立新的],並以下列值填寫新伺服器表單:
-
伺服器名稱:輸入 mysqlserver 並新增一些字元來表示唯一性。 伺服器名稱必須在 Azure 中全域唯一(不僅限於訂閱內),所以可以用類似
mysqlserver135「入口網站」告訴你是否可用這樣的名稱。 -
位置:從下拉式清單中選取位置。
重要
您必須選取同時支援 DC 系列硬體與 Microsoft Azure 證明的位置 (Azure 區域)。 如需支援 DC 系列的區域清單,請參閱 DC 系列的可用性。 請參閱 Microsoft Azure 證明 的區域可用性。
- 驗證方法 - 選取 [使用 SQL 驗證]
- 伺服器管理員登入:輸入管理員登入名稱,例如:azureuser。
- 密碼:輸入符合需求的密碼,然後在 [確認密碼] 欄位中再次輸入。
- 選取 [確定]。
-
伺服器名稱:輸入 mysqlserver 並新增一些字元來表示唯一性。 伺服器名稱必須在 Azure 中全域唯一(不僅限於訂閱內),所以可以用類似
將您要使用 SQL 彈性集區設為否。
在 [計算 + 儲存體] 下,選取 [設定資料庫],然後選取 [變更設定]。
選取 [DC 系列] 硬體設定,然後選取 [確定]。
選擇 [套用]。
回到 [基本] 索引標籤,驗證 [計算 + 儲存體] 設定為 [一般用途]、[DC、2 個虛擬核心、32 GB 儲存體]。
針對 備份儲存體備援 選擇 本地備援備份儲存體。
在頁面底部,選取 [下一步: 網路設定]。
在網路功能索引標籤的連線方法中,選取 [公用端點]。
針對 [防火牆規則],將 [新增目前的用戶端 IP 位址] 設定為 [是]。 將 [允許 Azure 服務和資源存取此伺服器] 設定為 [否]。
連線政策則設為預設 - 對所有來自 Azure 內部的用戶端連線使用重定向政策,對所有來自 Azure 外部的用戶端連線則設為代理。
針對 [加密連線],將 [最低 TLS 版本] 保留為 [TLS 1.2]。
請在頁面底部選擇 [檢閱 + 建立]。
在 檢閱 + 建立 頁面進行檢閱之後,選取 建立。
步驟 2:設定證明提供者
在此步驟中,您將在 Microsoft Azure 證明中建立並設定證明提供者。 這是驗證您資料庫所使用的安全區域所需。
瀏覽至 建立證明提供者 頁面。
在 [建立證明提供者] 頁面上,提供下列輸入:
- 訂用帳戶:選擇您在其中建立 Azure SQL 邏輯伺服器的相同訂用帳戶。
- 資源群組:選擇您在其中建立 Azure SQL 邏輯伺服器的相同資源群組。
- 名稱:輸入 myattestprovider,並新增一些字元以獲得獨特性。 因為名稱必須是全域唯一的,所以我們無法提供要使用的確切證明提供者名稱。 因此,請輸入類似 myattestprovider12345 的值,入口網站會讓您知道您輸入的值是否可以使用。
- 位置:選擇與 Azure SQL 邏輯伺服器相同的位置。
- 原則簽署者憑證檔案:將此欄位保留空白,因為您將設定未簽署的原則。
提供必要的輸入之後,選擇 [檢視 + 建立]。
選取 建立。
建立憑證提供者後,請選取 [移至資源]。
在證明提供者的 [概觀] 索引標籤上,將證明 URI 屬性的值複製到剪貼簿,並將其儲存在檔案中。 這是驗證網址,您會在後續的步驟中需要用到。
在視窗左側或下方窗格中,於資源功能表上選取 [Policy]。
將 [證明類型] 設定為 SGX-IntelSDK。
選取上方功能表上的 [設定]。
將 原則格式 設為 文字。 讓 [政策選項] 設定為 [輸入政策]。
在 [ 原則] 文字 欄位中,將默認原則取代為下列原則。 如需詳細資訊,請參閱建立及設定證明提供者。
version= 1.0; authorizationrules { [ type=="x-ms-sgx-is-debuggable", value==false ] && [ type=="x-ms-sgx-product-id", value==4639 ] && [ type=="x-ms-sgx-svn", value>= 2 ] && [ type=="x-ms-sgx-mrsigner", value=="e31c9e505f37a58de09335075fc8591254313eb20bb1a27e5443cc450b6e33e5"] => permit(); [ type=="x-ms-sgx-is-debuggable", value==false ] && [ type=="x-ms-sgx-product-id", value==4639 ] && [ type=="x-ms-sgx-svn", value>= 2 ] && [ type=="x-ms-sgx-mrsigner", value=="a0f8e7f72092fb6a5d5752ffccd47fb3af7027ffb589b24e921e81f5703f3a9a"] => permit(); };選取 [儲存]。
點選上方功能表中的 [重新整理],以檢視設定的原則。
步驟 3:填入您的資料庫
在此步驟中,您將建立一個資料表,並將其填入您稍後將加密和查詢的一些資料。
開啟 SSMS,並連線到您在資料庫連線中所建立、未啟用 Always Encrypted 的 Azure SQL 邏輯伺服器中的 ContosoHR 資料庫。
在 [連線至伺服器] 對話方塊中,指定伺服器的完整名稱 (例如,myserver135.database.windows.net),然後輸入您在建立伺服器時所指定的管理員使用者名稱和密碼。
選取 [選項]>>,然後選取 [連線屬性] 索引標籤。請務必選取 [ContosoHR] 資料庫 (而非預設的 資料庫)。
選取「Always Encrypted」索引標籤。
請確定未選取 [啟用 Always Encrypted (資料行加密)] 核取方塊。
選取 連線。
建立名為
Employees的新數據表。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]; GO將一些員工記錄新增至
Employees數據表。INSERT INTO [HR].[Employees] ([SSN] ,[FirstName] ,[LastName] ,[Salary]) VALUES ('987-65-4320' , N'Catherine' , N'Abel' , $31692); INSERT INTO [HR].[Employees] ([SSN] ,[FirstName] ,[LastName] ,[Salary]) VALUES ('990-00-6818' , N'Kim' , N'Abercrombie' , $55415);
步驟 4:準備安全區域啟用的金鑰
在此步驟中,您將建立會允許記憶體保護區計算的資料行主要金鑰和資料行加密金鑰。
使用上個步驟中的 SSMS 執行個體,在物件總管中展開您的資料庫,然後巡覽至 [安全性][Always Encrypted 金鑰]。
配置啟用隔離區的新欄位主金鑰:
- 以滑鼠右鍵按一下 [Always Encrypted 金鑰],然後選取 [新增資料行主要金鑰...]。
- 輸入新數據行主要金鑰的名稱:
CMK1。 - 確認已選取 [允許記憶體保護區計算]。 (如果為資料庫啟用安全記憶體保護區,則預設會選取此項目。此項目應已啟用,因為您的資料庫會使用 DC 系列硬體組態。)
- 請選取 [Azure Key Vault] (建議),[Windows 憑證存放區] ([目前使用者] 或 [本機電腦])。
- 如果您選取 [Azure Key Vault],請登入 Azure,選取包含您要使用的金鑰保存庫 Azure 訂用帳戶,然後選取您的金鑰保存庫。 選取 [產生金鑰] 以建立新的金鑰。
- 如果您選取 [Windows 憑證存放區],請選取 [產生憑證] 按鈕以建立新的憑證。
- 選取 [確定]。
建立已啟用記憶體保護區的新資料行加密金鑰:
- 以滑鼠右鍵按一下 [Always Encrypted 金鑰],然後選取 [新增資料行加密金鑰]。
- 輸入新數據行加密金鑰的名稱:
CEK1。 - 在 [ 資料行主要金鑰 ] 下拉式清單中,選取您在先前步驟中建立的數據行主要密鑰。
- 選取 [確定]。
步驟 5:直接加密某些欄位
在此步驟中,您將加密儲存在伺服器端內部安全區中的 SSN 和 Salary 資料行資料,然後測試 SELECT 資料的查詢。
開啟新的 SSMS 執行個體,並連線至資料庫,使資料庫連線啟用 Always Encrypted 功能。
啟動新的 SSMS 執行個體。
在 [ 連接到伺服器 ] 對話框中,指定伺服器的完整名稱(例如
<server name>.database.windows.net),然後輸入您在建立伺服器時指定的系統管理員使用者名稱和密碼。選取 [選項]>>,然後選取 [連線屬性] 索引標籤。請務必選取 [ContosoHR] 資料庫 (而非預設的 資料庫)。
選取「Always Encrypted」索引標籤。
選取 [啟用 Always Encrypted (欄位加密)] 核取方塊。
選取 [啟用安全區域]。 (此步驟適用於 SSMS 19 或更新版本。)
將通訊協定設定為 Microsoft Azure 證明。 (此步驟適用於 SSMS 19 或更新版本。)
指定您在遵循步驟 2:設定證明提供者的過程中所取得的區域證明 URL。
選取 連線。
如果系統提示您啟用 Always Encrypted 的參數化查詢,請選取 [啟用]。
使用相同的 SSMS 實例(已啟用 Always Encrypted),開啟新的查詢視窗,並執行下列 T-SQL 語句來
SSN加密 和Salary數據行: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語句,以清除資料庫的查詢計劃快取。 修改資料表之後,您需要清除所有批次之計畫和存取資料表的預存程序,以重新整理參數加密資訊。若要確認
SSN和Salary列現在已加密,請在 SSMS 實例中開啟新的查詢視窗,且不要針對資料庫連接啟用 Always Encrypted,然後執行下列語句。 查詢視窗應該會在SSN和Salary數據行中傳回加密值。 如果使用已啟用 Always Encrypted 的 SSMS 執行個體執行同一查詢,您應該會看到解密的資料。SELECT * FROM [HR].[Employees];
步驟 6:針對加密的資料行執行複雜查詢
您可以針對加密的資料行執行豐富查詢。 在伺服器端的安全區域中,將會執行一些查詢處理。
在已啟用 Always Encrypted 的 SSMS 執行個體中,請確定也已啟用 Always Encrypted 的參數化。
- 從 SSMS 的主功能表選取 [工具]。
- 選擇 選項...。
- 瀏覽至 查詢執行>SQL Server>進階。
- 請確保已勾選 [啟用 Always Encrypted 的參數化] 選項。
- 選取 [確定]。
開啟新的查詢視窗,貼上下列查詢,然後執行。 查詢應該會傳回純文字值和符合指定搜尋準則的資料列。
DECLARE @SSNPattern [char](11) = '%6818'; DECLARE @MinSalary [money] = $1000; SELECT * FROM [HR].[Employees] WHERE SSN LIKE @SSNPattern AND [Salary] >= @MinSalary;在未啟用 Always Encrypted 的 SSMS 執行個體中,再次嘗試相同的查詢。 應該會發生故障。
教程
完成本教學課程之後,您可以移至下列其中一個教學課程:
- 教學課程:使用具有安全區域的 Always Encrypted 開發 .NET 應用程式
- 教程:使用安全保護區的 Always Encrypted 開發 .NET Framework 應用程式
- 教學:使用隨機化加密在啟用安全區的資料行上建立及使用索引