使用安全記憶體保護區執行 Transact-SQL 陳述式
適用於: SQL Server 2019 (15.x) 與更新版本 - 僅限 Windows
Azure SQL 資料庫
具有安全記憶體保護區的 Always Encrypted 可讓一些 Transact-SQL (T-SQL) 陳述式對伺服器端安全記憶體保護區中的加密資料庫資料行執行機密計算。
使用安全區域的陳述式
下列 T-SQL 陳述式類型會利用安全記憶體保護區。
使用安全執行區域的 DDL 陳述式
下列類型的資料定義語言 (DDL) 陳述式需要安全記憶體保護區。
- ALTER TABLE column_definition (Transact-SQL) 陳述式,其使用啟用記憶體保護區的金鑰觸發就地密碼編譯作業。 如需詳細資訊,請參閱使用具有安全記憶體保護區的 Always Encrypted 就地設定資料行加密。
- CREATE INDEX (Transact-SQL) 和 ALTER INDEX (Transact-SQL) 陳述式,這些陳述式利用隨機加密在啟用記憶體保護區的資料行上建立或變更索引。 如需詳細資訊,請參閱使用安全區域的 Always Encrypted 在資料行上建立及使用索引。
使用安全記憶體保護區的 DML 陳述式
下列資料操作語言 (DML)語句或查詢針對啟用隨機加密的記憶體保護區資料行時,需要安全記憶體保護區:
- 支援在安全區域內使用下列一或多個 Transact-SQL 運算子的查詢:
- 比較運算子
- BETWEEN (Transact-SQL)
- IN (Transact-SQL)
- LIKE (Transact-SQL)
- DISTINCT
- 聯結 - SQL Server 2019 (15.x) 僅支援巢狀迴圈聯結。 SQL Server 2022 (16.x) 和 Azure SQL Database 支援巢狀迴圈、雜湊和合併聯結
- SELECT - ORDER BY 子句 (Transact-SQL)。 SQL Server 2022 (16.x) 和 Azure SQL Database 有支援。 SQL Server 2019 (15.x) 不支援
- SELECT - GROUP BY 子句 (Transact-SQL)。 SQL Server 2022 (16.x) 和 Azure SQL Database 有支援。 SQL Server 2019 (15.x) 不支援
- 插入、更新或刪除資料列的查詢會接著觸發在已啟用記憶體保護區的資料行索引中插入及/或移除索引鍵。 如需詳細資訊,請參閱 在資料行上使用 Always Encrypted 與安全區域建立並使用索引
注意
只有在啟用了記憶體保護區且使用隨機加密的資料行中,才支援索引作業和機密 DML 查詢。 不支援確定性加密。
資料庫的相容性層級應設定為 SQL Server 2022 (160) 或更高版本。
在 Azure SQL Database 和 SQL Server 2022 (16.x) 中,對字元字串資料行 (char
、nchar
) 使用 enclaves 的機密查詢,要求資料行使用二進位碼指標 (_BIN2) 定序或 UTF-8 定序。 在 SQL Server 2019 (15.x) 中,需要 a_BIN2 定序。
使用安全區域的 DBCC 命令
如果資料庫中使用隨機加密的資料行有啟用記憶體保護區的索引,則檢查索引完整性的 DBCC (Transact-SQL) 系統管理命令可能也需要使用安全記憶體保護區。 例如,DBCC CHECKDB (Transact-SQL) 和 DBCC CHECKTABLE (Transact-SQL)。
使用安全隔離區執行陳述式的必要條件
您的環境必須符合下列需求才能支援執行使用安全記憶體保護區的陳述式。
您的 SQL Server 執行個體或 Azure SQL Database 資料庫伺服器必須正確配置,以支援在適用或需要時的信任執行環境和證明流程。 如需詳細資訊,請參閱設定安全區域和認證。
當您從應用程式或工具 (例如 SQL Server Management Studio) 連線至資料庫時,請務必:
使用支援具有安全記憶體保護區之 Always Encrypted 的用戶端驅動程式版本或工具版本。
- 如需支援具有安全記憶體保護區之 Always Encrypted 用戶端驅動程式的資訊,請參閱使用具有安全記憶體保護區的 Always Encrypted 開發應用程式。
- 如需支援具有記憶體保護區之 Always Encrypted 的工具資訊,請參閱以下各節。
為資料庫連線啟用 Always Encrypted。
指定一個證明通訊協定,來確定您的應用程式或工具是否必須在提交飛地查詢之前進行證明,以及應該使用哪個證明服務。 大部分的工具和驅動程式都支援以下證明通訊協定:
- Microsoft Azure 證明 - 強制證明使用 Microsoft Azure 證明。
- 主機守護者服務 - 強制證明使用主機守護者服務。
- 無 - 允許在沒有證明的情況下使用記憶體保護區。
下表指定特定 SQL 產品和記憶體保護區技術適用的證明通訊協定:
產品 安全區域技術 支援的證明通訊協定 SQL Server 2019 (15.x) 和更新版本 VBS 隔離區 主機守護者服務,無 Azure SQL Database SGX 安全區 (DC 系列資料庫中) Microsoft Azure 認證 Azure SQL Database VBS 記憶體保護區 無
如果您使用證明,請指定對您環境有效的證明 URL。
- 如果您使用的是 SQL Server 和主機守護者服務 (HGS),請參閱判斷並共用 HGS 證明 URL。
- 若您在使用搭載 Intel SGX 隔離環境和 Microsoft Azure 認證的 Azure SQL Database,請參閱判斷認證原則的認證 URL。
在 SSMS 中使用 enclave 執行 T-SQL 陳述式的必要條件
下載最新版的 SQL Server Management Studio (SSMS)。
確保您從查詢視窗執行陳述式,而該視窗的連線已正確配置 Always Encrypted 和驗證參數。
在 [連線到伺服器] 對話方塊中指定您的伺服器名稱,選取驗證方法,然後指定認證。
選取 [選項] >>,然後選取 [連線屬性] 索引標籤。指定您的資料庫名稱。
選取 [Always Encrypted] 索引標籤。
選取 [啟用 Always Encrypted (資料行加密)]。
選取 [啟用安全區域]。
將 [通訊協定] 設定為:
- [主機守護者服務] (如果您使用的是 SQL Server)。
- Microsoft Azure 認證服務如果您使用具有 Intel SGX 環境的 Azure SQL Database。
- 無 如果您正在使用支持 VBS 隔離區的 Azure SQL Database。
指定安全區域驗證 URL。 當通訊協定設定為 [無] 時不適用。 例如,
https://hgs.bastion.local/Attestation
或https://contososqlattestation.uks.attest.azure.net/attest/SgxEnclave
。選取 [連接]。
如果系統提示您啟用 Always Encrypted 的參數化查詢,請選取 [啟用]。
如需詳細資訊,請參閱針對資料庫連接啟用和停用 Always Encrypted。
在 Azure Data Studio 中使用記憶體保護區執行 T-SQL 陳述式的必要條件
建議使用的最低版本為 1.23 或更高版本。 請務必在查詢視窗中執行您的語句,該視窗使用的連線已啟用 Always Encrypted,並且已設定正確的證明通訊協定和證明 URL。
在 [連線] 對話方塊中,選取 [進階]。
若要針對連線啟用 Always Encrypted,請將 [Always Encrypted] 欄位設定為 [啟用]。
若要啟用安全記憶體保護區,請將 [安全記憶體保護區] 欄位設定為 [已啟用]。
指定認證協議和認證 URL。
- 如果您是使用 SQL Server,請將 證明通訊協定 設定為 主機守護者服務,並在 記憶體保護區證明 URL 欄位中輸入主機守護者服務證明 URL。
- 如果您使用 DC 系列的資料庫搭配 Azure SQL 資料庫中的 Intel SGX,請將 證明通訊協定 設定為 Azure 證明,輸入證明 URL,並在 保護區證明 URL 欄位中參考 Microsoft Azure 證明中的原則。
- 如果您在 Azure SQL 資料庫中使用啟用 VBS 保護區的資料庫,請將 [證明通訊協定] 設定為 [無]。
選取 [確定],以關閉 [進階屬性]。
如需詳細資訊,請參閱針對資料庫連接啟用和停用 Always Encrypted。
如果打算執行參數化的 DML 查詢,則必須同時啟用 Always Encrypted 的參數化。
範例
本節包含使用安全區域的 DML 查詢範例。
這些範例使用以下結構描述。
CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Jobs](
[JobID] [int] IDENTITY(1,1) PRIMARY KEY,
[JobTitle] [nvarchar](50) NOT NULL,
[MinSalary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
[MaxSalary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
);
GO
CREATE TABLE [HR].[Employees](
[EmployeeID] [int] IDENTITY(1,1) PRIMARY KEY,
[SSN] [char](11) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
[Salary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
[JobID] [int] NULL,
FOREIGN KEY (JobID) REFERENCES [HR].[Jobs] (JobID)
);
GO
完全相符搜尋
以下查詢會對加密的 SSN
字串資料行執行完全相符搜尋。
DECLARE @SSN char(11) = '795-73-9838';
SELECT * FROM [HR].[Employees] WHERE [SSN] = @SSN;
GO
模式比對搜尋
以下查詢會對加密的 SSN
字串資料行執行模式比對搜尋,搜尋其社會安全號碼特定末幾碼的員工。
DECLARE @SSN char(11) = '795-73-9838';
SELECT * FROM [HR].[Employees] WHERE [SSN] = @SSN;
GO
範圍比較
以下查詢會對加密的 Salary
資料行執行範圍比較,搜尋其薪資在指定範圍內的員工。
DECLARE @MinSalary money = 40000;
DECLARE @MaxSalary money = 45000;
SELECT * FROM [HR].[Employees] WHERE [Salary] > @MinSalary AND [Salary] < @MaxSalary;
GO
連結
以下查詢會使用加密的 Employees
資料行執行 Jobs
和 Salary
資料表的聯結。 此查詢將擷取那些薪資超出其工作職位薪資範圍的員工。
SELECT * FROM [HR].[Employees] e
JOIN [HR].[Jobs] j
ON e.[JobID] = j.[JobID] AND e.[Salary] > j.[MaxSalary] OR e.[Salary] < j.[MinSalary];
GO
排序
下列查詢會根據加密的 Salary
資料行排序員工記錄,擷取薪資最高的 10 名員工。
注意
SQL Server 2022 (16.x) 和 Azure SQL Database 支援排序加密資料行,但 SQL Server 2019 (15.x) 則否。
SELECT TOP(10) * FROM [HR].[Employees]
ORDER BY [Salary] DESC;
GO