適用於:SQL Server 2019 (15.x) 及以後版本在 Windows
Azure SQL 資料庫上
Always Encrypted with secure enclaves 支援就地加密及更豐富的機密查詢,擴展了 Always Encrypted 的機密運算能力。 SQL Server 2019 (15.x) 和更新版本以及 Azure SQL Database 均提供具有安全區域的 Always Encrypted。
Always Encrypted 是在 Azure SQL Database 2015 和 SQL Server 2016 (13.x) 中引進,旨在保護敏感性資料的機密性免受惡意程式碼和高權限的未經授權使用者威脅,這些使用者包括資料庫管理員 (DBA)、電腦系統管理員、雲端系統管理員,或是對伺服器執行個體、硬體等具有合法存取權,但不應該存取部分或所有實際資料的其他人。
若沒有本文所述的增強功能,Always Encrypted 保護資料的方式是透過在用戶端將資料加密,且「絕不」允許資料或對應的密碼編譯金鑰以純文字形式出現在資料庫引擎內部。 因此,資料庫內部的加密資料行功能受到嚴格限制。 資料庫引擎唯一能對加密資料執行的作業是相等比較 (僅適用於確定性加密)。 資料庫內部不支援所有其他作業,包括密碼編譯作業 (初始資料加密或金鑰輪替) 及更豐富的查詢 (例如模式比對)。 使用者需要將資料移出資料庫以在用戶端執行這些作業。
「具有安全記憶體保護區」的 Always Encrypted 允許在伺服器端對安全記憶體保護區內的純文字資料進行一些計算,藉以因應這些限制。 安全記憶體保護區是資料庫引擎處理序內受保護的記憶體區域。 安全隔區在主機上以不透明的盒子形式呈現給資料庫引擎及其他程序。 即使使用偵錯工具,也無法從外部檢視記憶體保護區內部的任何資料或程式碼。 這些屬性會讓安全記憶體保護區成為「信任的執行環境」,可安全存取純文字的密碼編譯金鑰和機密資料,卻不會破壞資料機密性。
Always Encrypted 使用安全區域,如下圖所示:
剖析應用程式提交的 Transact-SQL 陳述式時,資料庫引擎會判斷陳述式是否包含任何需要使用安全記憶體保護區的加密資料作業。 針對此類陳述:
用戶端驅動程式會將作業所需的資料行加密金鑰(透過安全通道)傳送至安全隔離區,並提交陳述式以供執行。
處理陳述式時,資料庫引擎會將加密操作或加密資料行的計算委派給安全保護區。 如有需要,安全區會解密資料,並對純文字執行計算。
在陳述式處理期間,資料和資料行加密金鑰在安全區域外的資料庫引擎中都不會以純文字形式被公開。
支援的用戶端驅動程式
若要使用具有安全記憶體保護區的 Always Encrypted,應用程式必須使用支援此功能的用戶端驅動程式。 設定應用程式和用戶端驅動程式,以啟用記憶體保護區計算和記憶體保護區證明 (請參閱下面的安全記憶體保護區證明一節)。 如需詳細資料 (包括支援的用戶端驅動程式清單),請參閱使用 Always Encrypted 開發應用程式。
支援的飛區技術
Always Encrypted 支援下列記憶體保護區技術 (或記憶體保護區類型):
- 虛擬化型安全性 (VBS) 區域 (也稱為虛擬安全模式或 VSM 區域) - 這是一種依賴 Windows 虛擬機管理程式且不需要任何特殊硬體的技術。
- Intel 軟體守護擴充(Intel SGX)隔區 ——一種基於硬體的可信執行環境技術。
資料庫可用的記憶體保護區類型取決於裝載它的 SQL 產品 (Azure SQL Database 或 SQL Server),在 Azure SQL Database 的情況下,還取決於您的資料庫組態。
在 SQL Server 2019 (15.x) 和更高版本中,Always Encrypted 支援 VBS 隔離環境。 Intel SGX enclaves 不被支援。
在 Azure SQL Database 中,資料庫可以使用 Intel SGX 記憶體保護區或 VBS 記憶體保護區,視設定執行資料庫的硬體而定:
- 使用 DC 系列 硬體配置的資料庫(可透過 vCore 購買模式 取得)使用 Intel SGX 隔區。
- 使用非 DC 系列配置且採用 vCore 採購模式的資料庫,以及使用 DTU 採購模式 的資料庫,都可以設定為使用 VBS 隔區。
Note
VBS enclave 目前在所有 Azure SQL 資料庫區域( 除了 Jio India Central 外)皆可用。
如需每個記憶體保護區類型所提供保護層級的重要資訊,請參閱安全性考量一節。
安全區域驗證
記憶體保護區證明是一項深度防禦機制,可協助偵測涉及惡意系統管理員竄改記憶體保護區程式碼或其環境的攻擊。
記憶體保護區證明可讓用戶端應用程式先與應用程式所連線資料庫的安全記憶體保護區建立信任,再讓應用程式使用該記憶體保護區來處理敏感性資料。 證明工作流程會驗證記憶體保護區是正版 VBS 或 Intel SGX 記憶體保護區,且其內部執行的程式碼是經由 Microsoft 簽署適用於 Always Encrypted 的正版記憶體保護區程式庫。 在證明期間,應用程式和資料庫引擎內的用戶端驅動程式都會使用用戶端指定的端點來與外部證明服務通訊。
Always Encrypted 可以使用下列兩項證明服務的其中一項:
- Microsoft Azure 證明 - 雲端式證明解決方案。
- Host Guardian Service(HGS)實現 Windows Defender System Guard 執行時認證。
若要為應用程式啟用具有安全記憶體保護區的 Always Encrypted,您必須在應用程式的用戶端驅動程式組態中設定證明通訊協定。 證明通訊協定值會 1) 判斷用戶端應用程式是否會使用證明,如果是的話,則會 2) 指定要使用的證明服務類型。 下表記錄了有效 SQL 產品和安全區域類型組合所支援的驗證協議:
| 主機產品 | 飛地類型 | 支援的證明通訊協定 |
|---|---|---|
| SQL Server 2019 (15.x) 和更新版本 | VBS 隔離區 | HGS、無證明 |
| Azure SQL Database | SGX 隔間(DC 系列資料庫) | Microsoft Azure 認證 |
| Azure SQL Database | VBS 隔離區 | 無證明 |
請注意下列幾個重點:
- 在 SQL Server 2019(15.x)及之後的版本中,驗證 VBS 環境需要 HGS。 您也可以在沒有證明的情況下使用 VBS 區域 (需要最新的用戶端驅動程式)。
- 在 Azure SQL 資料庫的 DC 系列資料庫中,使用 Intel SGX enclaves 時必須進行驗證,且需要使用 Microsoft Azure Attestation。
- Azure SQL 資料庫中的 VBS 區域不支援證明。
如需詳細資訊,請參閱
術語
啟用安全區金鑰
Always Encrypted with secure enclaves 引入了支援 enclave 的金鑰概念:
-
Enclave 啟用的欄位主鍵——具備在資料庫內的欄位
master鍵元資料物件中指定的master鍵屬性的欄位鍵。 欄位master鍵元資料物件也必須包含元資料屬性的有效簽章。 如需詳細資訊,請參閱 CREATE COLUMN MASTER KEY (Transact-SQL) -
已啟用記憶體保護區的資料行加密金鑰 - 以已啟用記憶體保護區的資料行
master金鑰進行加密的資料行加密金鑰。 只有啟用記憶體保護區的資料行加密金鑰可用於記憶體保護區內計算。
如需詳細資訊,請參閱管理 Always Encrypted 的金鑰及安全區域。
可啟用飛地的欄位
支援安全區的欄位是用支援安全區的欄位加密金鑰加密的資料庫欄位。
用於安全區啟用欄的機密運算功能
擁有安全區域的 Always Encrypted 的兩大優點是即時加密和豐富的機密查詢。
就地加密
就地加密允許對安全記憶體保護區內的資料庫資料行進行密碼編譯作業,而無需將資料移出資料庫。 就地加密可提升密碼編譯作業的效能和可靠性。 您可使用 ALTER TABLE (Transact-SQL) 陳述式執行就地加密。
可就地執行的密碼編譯作業如下:
- 使用啟用隔區的欄位加密金鑰加密明文欄位。
- 重新加密已加密且啟用隱匿功能(enclave)的欄位至:
- 旋轉欄位加密金鑰——用新的啟用隔離區的欄位加密金鑰重新加密欄位。
- 例如,將啟用環域的資料行加密類型從確定性變更為隨機。
- 解密儲存在啟用 enclave 欄位的資料(將欄位轉換為明文欄位)。
只要涉及加密操作的欄位加密金鑰能啟用 enclave,就可以透過確定性加密和隨機加密方式進行就地加密。
機密查詢
Note
SQL Server 2022 (16.x) 為機密查詢新增在加密資料行上執行 JOIN、GROUP BY 和 ORDER BY 作業的額外支援。
機密查詢是涉及在安全隔離區內對啟用 enclave 欄位進行操作的 DML 查詢 。
在安全區域內所支援的操作有:
| Operation | Azure SQL Database | SQL Server 2022 (16.x) | SQL Server 2019 (15.x) |
|---|---|---|---|
| 比較運算子 | Supported | Supported | Supported |
| 中間(Transact-SQL) | Supported | Supported | Supported |
| 在 (Transact-SQL) | Supported | Supported | Supported |
| 像(Transact-SQL) | Supported | Supported | Supported |
| 獨特 | Supported | Supported | Supported |
| 加入 | Supported | Supported | 僅支援巢狀迴圈連接 |
| SELECT - ORDER BY 子句 (Transact-SQL) | Supported | Supported | 不支援 |
| SELECT - GROUP BY- Transact-SQL | Supported | Supported | 不支援 |
Note
安全區域內部的上述作業需要隨機化加密。 不支援確定性加密。 在使用確定性加密的欄位中,等值比較是唯一可用的操作。
資料庫的相容性層級應設定為 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 定序。
如需詳細資訊,請參閱使用安全記憶體保護區執行 Transact-SQL 陳述式。
啟用 enclave 欄位的索引
您可在使用隨機加密的已啟用記憶體保護區資料行中建立非叢集索引,讓使用安全記憶體保護區的機密 DML 查詢執行得更快。
為確保使用隨機加密所加密資料行上索引不會外洩機密資料,索引資料結構 (B 型樹狀結構) 中的索引鍵值會加密,並根據其純文字值排序。 按純文字值排序也有助於在安全區域內處理查詢。 當資料庫引擎中的查詢執行程式使用加密資料行上的索引,於記憶體保護區內部進行計算時,它會搜尋索引來查閱儲存在資料行中的特定值。 每個搜尋都可能會涉及多次比較。 查詢執行程式每次比較時,會將任務委派給記憶體保護區。記憶體保護區會解密儲存在資料行中的值和加密的索引鍵值,然後在純文字上執行比較,並將結果傳回給執行程式。
對於使用隨機加密且未啟用 enclave 的欄位建立索引,仍然不被支援。
使用確定性加密的資料行上索引,會根據加密文字 (而非純文字) 排序,無論資料行是否啟用記憶體保護區。
如需詳細資訊,請參閱使用安全區域的 Always Encrypted 在資料行上建立及使用索引。 如需資料庫引擎中索引運作方式的一般資訊,請參閱叢集與非叢集索引說明一文。
資料庫復原
若 SQL Server 的執行個體發生故障,其資料庫可能會處於一種狀態,此時資料檔案可能包含來自未完成交易的某些修改。 執行個體啟動時,它會執行稱為資料庫復原的處理序,該處理序會涉及復原交易記錄中所找到的每個未完成交易,確保資料庫的完整性能獲得保留。 若未完成的交易更動了索引,那些變更也必須要復原。 例如,索引中的某些索引鍵值可能需要移除或重新插入。
重要
Microsoft 強烈建議在針對資料庫啟用加速資料庫復原(ADR)後,再為具有隨機加密的 enclave 啟用欄位建立第一個索引。 ADR 預設會在 Azure SQL Database 和 Azure SQL 受控實例中啟用。 ADR 可在 SQL Server 2019 (15.x)及其後續版本中使用,但預設未啟用。
透過 傳統資料庫復原程式(遵循 ARIES 恢復模式),若要復原索引的變更,Database Engine 必須等到應用程式將欄位加密金鑰提供給安全區域,這可能需要很長的時間。 加速資料庫恢復(ADR) 大幅減少了因 enclave 內快取中沒有欄位加密金鑰而必須延遲的回復操作次數。 因此,它藉由將新交易遭到封鎖的機會降至最低,大幅提高資料庫可用性。 啟用 ADR 後,Database Engine 可能仍然需要數據行加密密鑰才能完成清除舊數據版本,但做為不會影響資料庫或使用者交易可用性的背景工作。 您可能會在錯誤記錄檔中看到錯誤訊息,指出因缺少資料行加密金鑰而無法完成清理作業。
安全性考量
以下是適用於 Always Encrypted 與安全區域的一些安全考量。
- VBS 記憶體保護區有助於保護資料免受 VM 內部的攻擊。 不過,它們無法抵禦來自主機並使用特殊權限系統帳戶發動的攻擊。 Intel SGX 記憶體保護區可保護資料免受來自客體 OS 和主機 OS 的攻擊。
- 如果你的環境可用,且擔心保護資料免受擁有作業系統管理員權限的使用者攻擊,建議使用飛區認證。 如果您使用證明,您必須確定證明服務及其組態是由受信任的系統管理員所管理。 此外,這兩個支援的驗證服務提供不同的政策和驗證模式,其中一些會對enclave及其環境進行基本驗證,且旨在用於測試及開發。 請仔細遵循您使用的認證服務特定的指導方針,確保您針對生產部署使用建議的配置和政策。
- 使用啟用 enclave 的欄位加密金鑰進行隨機加密,可能會導致欄位中資料的順序外洩,因為此類欄位支援範圍比較。 例如,如果包含員工薪資的加密資料行中具有索引,則惡意的 DBA 可能會掃描索引來尋找最大加密薪資值,並識別薪資最高的人員 (假設該人員的姓名未加密)。
- 如果您使用 Always Encrypted 來保護敏感性資料,使其不受未獲授權的 DBA 存取,請不要與 DBA 共用資料行
master金鑰或資料行加密金鑰。 DBA 可以使用 enclave 內部的欄加密金鑰快取,管理加密欄位上的索引,而無需直接存取金鑰。
商務持續性、災害復原和資料移轉的考量
為使用具有安全記憶體保護區之 Always Encrypted 的資料庫設定高可用性或災害復原解決方案時,請確定所有資料庫複本都可以使用安全的記憶體保護區。 如果主要副本有可用的隔離區,但次要副本沒有可用的隔離區,那麼任何嘗試使用 Always Encrypted 與安全隔離區功能的語句在故障轉移後都會失敗。
當使用具有安全記憶體保護區的 Always Encrypted 複製或遷移資料庫時,請確定目標環境一律支援記憶體保護區。 否則,使用安全區域的語句在複製品或遷移後的資料庫中無法運作。
請務必牢記下列特定考量:
SQL 伺服器
- 設定 Always On 可用性群組時,請確保可用性群組中裝載資料庫的每個 SQL Server 執行個體都支援具有安全記憶體保護區的 Always Encrypted,並設定了記憶體保護區和證明。
- 當將使用具有安全記憶體保護區 Always Encrypted 功能的資料庫備份檔案還原到未設定記憶體保護區上 SQL Server 執行個體時,還原作業會成功,並可使用所有不依賴記憶體保護區的功能。 但是,所有使用記憶體保護區功能的後續陳述式都會失敗,且使用隨機加密的已啟用記憶體保護區資料行上索引都會失效。 同樣的情況也適用於在還沒有配置安全隔區的實例上附加使用 Always Encrypted 的資料庫。
- 如果您的資料庫包含使用隨機加密啟用的 enclave 欄位索引,請在建立資料庫備份前先啟用加速 資料庫復原(ADR )。 ADR 將會確保資料庫 (包含索引) 在還原資料庫後立即開放使用。 如需詳細資訊,請參閱資料庫復原。
Azure SQL 資料庫
- 設定主動式異地複寫時,如果主要資料庫支援安全記憶體保護區,請確定次要資料庫也支援。
在 SQL Server 和 Azure SQL 資料庫中,當你使用 bacpac 檔案遷移資料庫時,必須確保在建立 bacpac 檔案前,先刪除所有啟用 enclave 欄位的索引,並採用隨機加密技術。
已知的限制
Always Encrypted with secure enclaves 透過支援原地加密及更豐富的機密查詢(含索引)來解決 Always Encrypted 的一些限制,詳見 適用於 enclave 啟用欄位的機密計算功能。
限制中所列 Always Encrypted 的所有其他限制,也適用於具有安全區域的 Always Encrypted。
以下限制是針對 Always Encrypted with Secure Enclaves 的:
- 無法在啟用安全保護區並使用隨機加密的資料行上建立叢集索引。
- 使用隨機加密啟用的 Enclave 欄位不能成為主金鑰欄位,也無法被外金鑰限制或唯一金鑰限制引用。
- 在 SQL Server 2019 (15.x) 中 (此限制不適用於 Azure SQL Database 或 SQL Server 2022 (16.x)),使用隨機加密的已啟用記憶體保護區資料行僅支援巢狀迴圈聯結 (使用索引,如果有的話)。 如需不同產品間其他差異的資訊,請參閱機密查詢。
- 原地加密運算無法與其他欄位中繼資料變更結合,除非在相同代碼頁中更改排序規則及設定為可空。 例如,您無法加密、重新加密或解密資料行,同時在單一
ALTER TABLE/ALTER COLUMNTransact-SQL 陳述式中變更資料行的資料類型。 請使用兩個個別的陳述式。 - 不支援在記憶體資料表中使用啟用的 enclave 鍵來控制欄位。
- 定義計算資料行的運算式,無法對使用隨機加密且啟用 enclave 的資料行執行任何計算(即使這些計算是機密查詢中所列的支援運算)。
- 在使用隨機加密的啟用 enclave 欄位中,LIKE 運算子的參數不支援逸出字元。
- 使用 LIKE 運算子或具有查詢參數的比較運算子(使用以下資料型態之一,加密後會成為大型物件)的查詢會忽略索引並執行資料表掃描。
-
nchar[n]和nvarchar[n],如果 n 大於 3967。 -
char[n]、varchar[n]、binary[n]、varbinary[n],如果 n 大於 7935。
-
- 唯一支援儲存啟用 enclave 的欄位
master金鑰的金鑰儲存是 Windows 憑證庫和 Azure 金鑰庫。 - 當您還原已啟用 VBS 記憶體保護區的資料庫時,請務必再次重新設定 VBS 記憶體保護區設定。