教學課程:在 SQL Server 中開始使用具有安全記憶體保護區的 Always Encrypted
適用於:SQL Server 2019 (15.x) 和更新版本 - 僅限 Windows
本教學課程會教導您如何開始在 SQL Server 中使用具有安全記憶體保護區的 Always Encrypted。 它會顯示:
- 如何建立基本環境,以便在未針對記憶體保護區設定證明的情況下,測試及評估具有安全記憶體保護區的 Always Encrypted。
- 如何就地加密資料,以及使用 SQL Server Management Studio (SSMS) 針對加密資料行發出豐富的機密查詢。
如果您想了解如何使用主機守護者服務,設定具有安全記憶體保護區的 Always Encrypted 以進行記憶體保護區證明,請參閱教學課程:在使用 HGS 進行證明的 SQL Server 中,開始使用具安全記憶體保護區的 Always Encrypted (機器翻譯)
必要條件
託管您 SQL Server 執行個體的電腦 (稱為 SQL Server 電腦) 必須符合下列需求:
- SQL Server 2019 (15.x) 或更新版本。
- Windows 10 或更新版本、Windows Server 2019 或更新版本。
- 虛擬化技術的 CPU 支援:
- 搭載延伸分頁表的 Intel VT-x。
- 搭載快速虛擬化索引處理的 AMD-V。
- 如果您在 VM 中執行 SQL Server:
- 在 Azure 中,使用第 2 代 VM 大小 (建議),或使用啟用巢狀虛擬化的第 1 代 VM 大小。 請查看個別 VM 大小的文件,判斷哪一種第 1 代 VM 大小支援巢狀虛擬化。
- 在 Hyper-V 2016 或更新版本上 (在 Azure 外部),確定您的 VM 是第 2 代 VM (建議),或是啟用巢狀虛擬化的第 1 代 VM。 如需詳細資訊,請參閱應該在 Hyper-V 中建立第 1 代還是第 2 代的虛擬機器?(機器翻譯) 和設定巢狀虛擬化 (機器翻譯)。
- 在 VMWare vSphere 6.7 或更新版本上,針對 VM 啟用虛擬化安全性支援,如 VMware 文件中所述。
- 其他 Hypervisor 和公用雲端可能還支援啟用具有 VBS 記憶體保護區的 Always Encrypted 巢狀虛擬化功能。 如需相容性和設定指示,請參閱虛擬化解決方案文件。
- 最新版本的 SQL Server Management Studio (SSMS)。 或者,您也可以在另一部電腦上安裝 SSMS。
警告
在實際執行環境中,於 SQL Server 電腦上執行 SSMS 或其他金鑰管理工具,可能會降低使用 Always Encrypted 所帶來的安全性效益。 一般而言,我們會建議您在不同的電腦上執行這類工具。 如需詳細資訊,請參閱 金鑰管理的安全性考量。
步驟 1:確保已啟用虛擬化型安全性 (VBS)
以管理員身分登入 SQL Server 電腦,開啟提升權限的 Windows PowerShell 主控台,然後執行 msinfo32.exe。 檢查 VBS 是否正在執行。 如果 VBS 正在執行,請略過本節的其餘步驟,並移至下一節。
在 PowerShell 工作階段中執行下列 Cmdlet 來啟用 VBS。
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard -Name EnableVirtualizationBasedSecurity -Value 1
如果 SQL Server 電腦是虛擬機器、不支援 UEFI 安全開機的實體機器,或未配備 IOMMU 的實體機器,您必須移除平台安全性功能的 VBS 需求。 在提高權限的 PowerShell 主控台中,於您的 SQL Server 電腦上執行下列命令,以移除安全開機和 IOMMU 的需求:
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard -Name RequirePlatformSecurityFeatures -Value 0
再次重新啟動 SQL Server 電腦,讓 VBS 上線。
Restart-Computer
重複步驟 1 以檢查 VBS 是否正在執行。
步驟 2:在 SQL Server 啟用具有安全記憶體保護區的 Always Encrypted
在此步驟中,您會在 SQL Server 執行個體,使用記憶體保護區啟用 Always Encrypted 功能。
使用 SSMS,以 sysadmin 身分連線到未針對資料庫連接啟用 Always Encrypted 的 SQL Server 執行個體。
啟動 SSMS。
在 [連線到伺服器] 對話方塊中,指定您的伺服器名稱,然後選取驗證方法並指定認證。
選取 [選項 >>],然後選取 [Always Encrypted] 索引標籤。
請確定未選取 [啟用 Always Encrypted (資料行加密)] 核取方塊。
選取 [連線]。
開啟新的查詢視窗,並執行以下陳述式,將安全記憶體保護區類型設成虛擬化型安全性 (VBS)。
EXEC sys.sp_configure 'column encryption enclave type', 1; RECONFIGURE;
重新啟動您的 SQL Server 執行個體,先前的變更才會生效。 您可以在 SSMS 中重新啟動執行個體,方法是在 [物件總管] 中以滑鼠右鍵按一下它,然後選取 [重新啟動]。 執行個體重新啟動之後,請與它重新連線。
執行下列查詢,確認現在已載入安全記憶體保護區:
SELECT [name], [value], [value_in_use] FROM sys.configurations WHERE [name] = 'column encryption enclave type';
查詢應該會傳回下列結果:
NAME value value_in_use 資料行加密記憶體保護區類型 1 1
步驟 3:建立範例資料庫
在此步驟中,您會建立一個具有部分範例資料的資料庫,且稍後會加密它。
使用上個步驟中的 SSMS 執行個體,在查詢視窗中執行以下陳述式,建立名為 ContosoHR 的新資料庫。
CREATE DATABASE [ContosoHR];
建立名為 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];
在 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);
步驟 4:佈建啟用記憶體保護區的金鑰
在此步驟中,您將建立會允許記憶體保護區計算的資料行主要金鑰和資料行加密金鑰。
使用上個步驟中的 SSMS 執行個體,在物件總管中展開您的資料庫,然後巡覽至 [安全性]>[Always Encrypted 金鑰]。
佈建已啟用記憶體保護區的新資料行主要金鑰:
以滑鼠右鍵按一下 [Always Encrypted 金鑰],然後選取 [新增資料行主要金鑰]。
選取您的資料行主要金鑰名稱:CMK1。
請確定您選取 [Windows 憑證存放區 (目前的使用者或本機電腦)] 或 [Azure Key Vault]。
選取 [允許記憶體保護區運算]。
如果您已選取 Azure Key Vault,請登入 Azure,然後選取您的金鑰保存庫。 如需如何建立 Always Encrypted 金鑰保存庫的詳細資訊,請參閱 Manage your key vaults from Azure portal (從 Azure 入口網站管理金鑰保存庫)。
選取您的憑證或 Azure Key Vault 金鑰 (如果已有),或選取 [產生憑證] 按鈕來建立一個新的憑證。
選取 [確定]。
建立已啟用記憶體保護區的新資料行加密金鑰:
- 以滑鼠右鍵按一下 [Always Encrypted 金鑰],然後選取 [新增資料行加密金鑰]。
- 輸入新資料行加密金鑰的名稱:CEK1。
- 在 [資料行主要金鑰] 下拉式清單中,選取您在先前步驟中建立的資料行主要金鑰。
- 選取 [確定]。
步驟 5:就地加密某些資料行
在此步驟中,您會加密儲存在伺服器端記憶體保護區內 SSN 和 Salary 資料行中的資料,然後對資料測試 SELECT 查詢。
開啟新的 SSMS 執行個體,並在已針對資料庫連接啟用 Always Encrypted 的情況下連線到 SQL Server 執行個體。
啟動新的 SSMS 執行個體。
在 [連線到伺服器] 對話方塊中,指定您的伺服器名稱,然後選取驗證方法並指定認證。
選取 [選項 >>],然後選取 [Always Encrypted] 索引標籤。
選取 [啟用 Always Encrypted (資料行加密)] 核取方塊。
選取 [啟用安全記憶體保護區]。
將 [通訊協定] 設為 [無]。
選取 [連接]。
如果系統提示您啟用 Always Encrypted 的參數化查詢,請選取 [啟用]。
使用相同的 SSMS 執行個體 (啟用 Always Encrypted),開啟新的查詢視窗,並執行下列查詢以加密 SSN 和 Salary 資料行。
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 陳述式。 修改資料表之後,您需要清除所有批次之計畫和存取資料表的預存程序,以重新整理參數加密資訊。
為驗證 SSN 和 Salary 資料行現已加密,請在未針對資料庫連接啟用 Always Encrypted 的 SSMS 執行個體中開啟新的查詢視窗,並執行以下陳述式。 查詢視窗應該傳回 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 應用程式
- 教學課程:使用隨機化加密在已啟用記憶體保護區的資料行上建立及使用索引