使用具有安全記憶體保護區的 Always Encrypted 在資料行上建立及使用索引

適用於:SQL Server 2019 (15.x) 及以後版本在 Windows Azure SQL 資料庫上

本文說明如何在使用支援安全記憶體保護區的資料行加密金鑰與 Always Encrypted with secure enclaves 加密的資料行上建立及使用索引。

支援安全記憶體保護區的 Always Encrypted 功能包括:

  • 以決定性加密和支援安全記憶體保護區的金鑰加密之資料行上的叢集與非叢集索引。
    • 這類索引會根據加密文字排序。 這類索引不需特別考量。 您可以用與在使用確定性加密且金鑰未啟用記憶體保護區的資料行上建立之索引相同的方式,管理及使用這些索引(就像 Always Encrypted 一樣)。
  • 對使用隨機加密和支援安全記憶體保護區金鑰加密的資料行建立非叢集索引。

注意

本文的其餘部分將探討在使用隨機化加密和啟用 enclave 的金鑰加密之資料行上的非叢集索引。

由於使用隨機化加密和已啟用記憶體保護區資料行加密金鑰的資料行上索引包含根據純文字排序的加密 (加密文字) 資料,因此 SQL Server 引擎必須針對涉及建立、更新或搜尋索引的任何作業使用記憶體保護區,包括:

  • 建立或重建索引。
  • 在資料表中的某一資料列(包含已建立索引/已加密資料行)進行插入、更新或刪除,會觸發將索引鍵插入索引中及/或自索引中移除索引鍵。
  • 執行涉及檢查索引完整性的 DBCC 命令,例如 DBCC CHECKDB (Transact-SQL) 或 DBCC CHECKTABLE (Transact-SQL)。
  • 資料庫復原 (例如在 SQL Server 失敗並重新啟動後),若 SQL Server 需要復原對索引進行的任何變更 (請參閱以下詳細資料)。

所有上述作業都需要記憶體保護區具備適用於已編製索引之資料行的資料行加密金鑰。 必須有此金鑰才能將索引鍵解密。 一般而言,安全區域可以透過以下兩種方式之一取得資料行加密金鑰:

  • 直接從用戶端應用程式取得。
  • 從資料行加密金鑰的快取取得。

使用由用戶端直接提供的資料行加密金鑰來呼叫索引作業

若要讓這個叫用編製索引作業的方法能夠運作,發出會在索引上觸發作業之查詢的應用程式 (包括 SQL Server Management Studio (SSMS) 等工具) 必須:

  • 在針對資料庫連接同時啟用 Always Encrypted 及記憶體保護區計算的情況下連接到資料庫。
  • 應用程式必須能存取保護已編制索引資料行之資料行加密金鑰的資料行主要金鑰。

在 SQL Server 引擎剖析應用程式查詢,並判斷其必須更新加密資料行上的索引以執行該查詢之後,會指示用戶端驅動程式透過安全通道向記憶體保護區釋出必要的資料行加密金鑰。 這和向記憶體保護區提供資料行加密金鑰以處理所有其他不使用索引的查詢所用機制完全相同。 例如,使用模式比對和範圍比較的就地加密或查詢。

此方法有助於確保:對於已連線到資料庫且已啟用 Always Encrypted 與安全記憶體保護區計算的應用程式而言,加密資料行上索引的存在是透明的。 此應用程式連接可以使用記憶體保護區進行查詢處理。 在您於資料行上建立索引之後,應用程式內的驅動程式會以透明方式將資料行加密金鑰提供給記憶體保護區,以執行索引作業。 建立索引可能會增加需要應用程式將資料行加密金鑰傳送至記憶體保護區的查詢數目。

若要使用此方法,請遵循使用安全記憶體保護區執行 Transact-SQL 陳述式中有關使用安全記憶體保護區執行陳述式的一般指導方針。

如需逐步瞭解如何使用此方法的說明,請參閱教學課程:使用隨機化加密在已啟用記憶體保護區的資料行上建立及使用索引。

使用已快取的資料行加密金鑰執行索引作業

在用戶端應用程式將資料行加密金鑰傳送至記憶體保護區,以處理需要記憶體保護區計算的任何查詢之後,記憶體保護區會將資料行加密金鑰快取於內部快取之中。 此快取位於安全區域內,且無法從外部存取。

如果有相同或不同使用者所使用的相同或另一個用戶端應用程式,在沒有直接提供必要資料行加密的情況下於索引上觸發作業,則記憶體保護區將會在快取中查詢資料行加密金鑰。 如此一來,索引上的作業會成功,即便用戶端應用程式沒有提供金鑰。

若要讓這個叫用編制索引作業的方法能夠運作,應用程式必須在沒有針對連線啟用 Always Encrypted 的情況下連線至資料庫,且必要的資料行加密金鑰必須在記憶體保護區內的快取中可供使用。

這個叫用作業的方法僅支援針對其他 (與索引無關的) 作業不需要資料行加密金鑰的查詢。 例如,使用 INSERT 陳述式將資料列插入包含加密資料行之資料表的應用程式,必須在連接字串中已啟用 Always Encrypted 的情況下連接到資料庫,且必須能夠存取金鑰,無論加密資料行是否具有索引。

這個方法很適合用來:

  • 確保使用隨機化加密的已啟用記憶體保護區之資料行上的索引,對於無法以純文字存取金鑰和資料的應用程式和使用者來說能夠透明地呈現。

  • 確保在加密資料行上建立索引不會中斷現有的查詢。 如果應用程式不需要能夠存取金鑰就能在包含加密資料行的資料表上發出查詢,則該應用程式將可以在 DBA 建立索引之後繼續執行,而無須存取金鑰。 例如,假設應用程式在包含加密資料行的 Employees 資料表上執行下列查詢。 DBA 尚未為任何加密資料行建立索引。

    DELETE FROM [dbo].[Employees] WHERE [EmployeeID] = 1;
    GO
    

    如果應用程式透過未啟用 Always Encrypted 和記憶體保護區計算的連接提交查詢,查詢將會成功。 該查詢不會在加密資料行上觸發任何計算。 在 DBA 於任何加密資料行上建立索引之後,該查詢會觸發從索引移除索引鍵的動作。 在此情況下,記憶體保護區需要資料行加密金鑰。 不過,只要資料擁有者已將資料行加密金鑰提供給安全區域,應用程式便能夠透過相同的連線繼續執行此查詢。

  • 這能在管理索引上達成角色區隔,因為它能讓 DBA 在無法存取敏感性資料的情況下,建立及改變已加密資料行上的索引。

提示

sp_enclave_send_keys (Transact-SQL) 可讓您輕鬆地將用於索引的所有已啟用安全記憶體保護區資料行加密金鑰傳送至安全記憶體保護區,並填入金鑰快取。

如需逐步瞭解如何使用此方法的說明,請參閱教學課程:使用隨機化加密在已啟用記憶體保護區的資料行上建立及使用索引。

後續步驟