事件
3月31日 下午11時 - 4月2日 下午11時
最大的 SQL、網狀架構和 Power BI 學習事件。 3 月 31 日 - 4 月 2 日。 使用程式代碼 FABINSIDER 來節省 $400 美元。
立即註冊
適用於:SQL Server 2019 (15.x) 及更新版本 - 僅限 Windows
Azure SQL 資料庫
具有安全記憶體保護區的 Always Encrypted 透過啟用就地加密和更豐富的機密查詢,來擴充 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 支援下列記憶體保護區技術 (或記憶體保護區類型):
資料庫可用的記憶體保護區類型取決於裝載它的 SQL 產品 (Azure SQL Database 或 SQL Server),在 Azure SQL Database 的情況下,還取決於您的資料庫組態。
在 SQL Server 2019 (15.x) 和更新版本中,Always Encrypted 支援 VBS 記憶體保護區 (不支援 Intel SGX 記憶體保護區)。
在 Azure SQL Database 中,資料庫可以使用 Intel SGX 記憶體保護區或 VBS 記憶體保護區,視設定執行資料庫的硬體而定:
注意
VBS 記憶體保護區目前適用於所有 Azure SQL 資料庫區域,但 Jio 印度中部除外。
如需每個記憶體保護區類型所提供保護層級的重要資訊,請參閱安全性考量一節。
記憶體保護區證明是一項深度防禦機制,可協助偵測涉及惡意系統管理員竄改記憶體保護區程式碼或其環境的攻擊。
記憶體保護區證明可讓用戶端應用程式先與應用程式所連線資料庫的安全記憶體保護區建立信任,再讓應用程式使用該記憶體保護區來處理敏感性資料。 證明工作流程會驗證記憶體保護區是正版 VBS 或 Intel SGX 記憶體保護區,且其內部執行的程式碼是經由 Microsoft 簽署適用於 Always Encrypted 的正版記憶體保護區程式庫。 在證明期間,應用程式和資料庫引擎內的用戶端驅動程式都會使用用戶端指定的端點來與外部證明服務通訊。
Always Encrypted 可以使用下列兩項證明服務的其中一項:
若要為應用程式啟用具有安全記憶體保護區的 Always Encrypted,您必須在應用程式的用戶端驅動程式組態中設定證明通訊協定。 證明通訊協定值會 1) 判斷用戶端應用程式是否會使用證明,如果是的話,則會 2) 指定要使用的證明服務類型。 下表擷取有效 SQL 產品和記憶體保護區類型組合支援的證明通訊協定:
裝載的產品 | 記憶體保護區類型 | 支援的證明通訊協定 |
---|---|---|
SQL Server 2019 (15.x) 和更新版本 | VBS 記憶體保護區 | HGS、無證明 |
Azure SQL Database | SGX 記憶體保護區 (DC 系列資料庫) | Microsoft Azure 證明 |
Azure SQL Database | VBS 記憶體保護區 | 無證明 |
請注意下列幾個重點:
如需詳細資訊,請參閱
具有安全記憶體保護區的 Always Encrypted 引入了已啟用記憶體保護區的金鑰概念:
master
金鑰中繼資料物件中指定 ENCLAVE_COMPUTATIONS
屬性的資料行 master
金鑰。 資料行 master
金鑰中繼資料物件也必須包含中繼資料屬性的有效簽章。 如需詳細資訊,請參閱 CREATE COLUMN MASTER KEY (Transact-SQL)master
金鑰進行加密的資料行加密金鑰。 安全記憶體保護區內只能使用已啟用記憶體保護區的資料行加密金鑰執行計算。如需詳細資訊,請參閱為具有安全記憶體保護區的 Always Encrypted 管理金鑰。
已啟用記憶體保護區的資料行是以已啟用記憶體保護區資料行加密金鑰進行加密的資料庫資料行。
具有安全記憶體保護區的 Always Encrypted 其兩大優點為就地加密和豐富機密查詢。
就地加密允許對安全記憶體保護區內的資料庫資料行進行密碼編譯作業,而無需將資料移出資料庫。 就地加密可提升密碼編譯作業的效能和可靠性。 您可使用 ALTER TABLE (Transact-SQL) 陳述式執行就地加密。
可就地執行的密碼編譯作業如下:
只要與密碼編譯作業有關的資料行加密金鑰已啟用記憶體保護區,確定性和隨機加密就都可以就地加密。
注意
SQL Server 2022 (16.x) 為機密查詢新增在加密資料行上執行 JOIN、GROUP BY 和 ORDER BY 作業的額外支援。
機密查詢是在安全記憶體保護區內對已啟用記憶體保護區資料行執行作業的 DML 查詢。
安全記憶體保護區內支援的作業包括:
作業 | Azure SQL Database | SQL Server 2022 (16.x) | SQL Server 2019 (15.x) |
---|---|---|---|
比較運算子 | 支援 | 支援 | 支援 |
BETWEEN (Transact-SQL) | 支援 | 支援 | 支援 |
IN (Transact-SQL) | 支援 | 支援 | 支援 |
LIKE (Transact-SQL) | 支援 | 支援 | 支援 |
DISTINCT | 支援 | 支援 | 支援 |
聯結 | 支援 | 支援 | 僅支援巢狀的迴圈聯結 |
SELECT - ORDER BY 子句 (Transact-SQL) | 支援 | 支援 | 不支援 |
SELECT - GROUP BY- Transact-SQL | 支援 | 支援 | 不支援 |
注意
安全記憶體保護區內部的上述作業需要隨機加密。 不支援確定性加密。 相等比較仍是使用確定性加密的資料行可用的作業。
資料庫的相容性層級應設定為 SQL Server 2022 (160) 或更高版本。
在 Azure SQL Database 和 SQL Server 2022 (16.x) 中,對字元字串資料行 (char
、nchar
) 使用記憶體保護區的機密查詢,會要求資料行使用二進位字碼指標 (_BIN2) 定序或 UTF-8 定序。 在 SQL Server 2019 (15.x) 中,需要 a_BIN2 定序。
如需詳細資訊,請參閱使用安全記憶體保護區執行 Transact-SQL 陳述式。
您可在使用隨機加密的已啟用記憶體保護區資料行中建立非叢集索引,讓使用安全記憶體保護區的機密 DML 查詢執行得更快。
為確保使用隨機加密所加密資料行上索引不會外洩機密資料,索引資料結構 (B 型樹狀結構) 中的索引鍵值會加密,並根據其純文字值排序。 按純文字值排序也適用於在記憶體保護區內處理查詢。 當資料庫引擎中的查詢執行程式使用加密資料行上的索引,於記憶體保護區內部進行計算時,它會搜尋索引來查閱儲存在資料行中的特定值。 每個搜尋都可能會涉及多次比較。 查詢執行程式會將每一次的比較委派給記憶體保護區,記憶體保護區則會解密儲存在資料行中的值,以及要比較的加密索引鍵值;它接著會在純文字上執行比較,然後將比較的結果傳回執行程式。
目前仍不支援在使用隨機加密,但沒有啟用記憶體保護區的資料行上建立索引。
使用確定性加密的資料行上索引,會根據加密文字 (而非純文字) 排序,無論資料行是否啟用記憶體保護區。
如需詳細資訊,請參閱使用具有安全記憶體保護區的 Always Encrypted 在資料行上建立及使用索引。 如需資料庫引擎中索引運作方式的一般資訊,請參閱叢集與非叢集索引說明一文。
若 SQL Server 的執行個體失敗,其資料庫可能會處於資料檔案仍包含交易中修改項目未完成的狀態。 執行個體啟動時,它會執行稱為資料庫復原的處理序,該處理序會涉及復原交易記錄中所找到的每個未完成交易,確保資料庫的完整性能獲得保留。 若未完成的交易更動了索引,那些變更也必須要復原。 例如,索引中的某些索引鍵值可能需要移除或重新插入。
重要
Microsoft 強烈建議先為您的資料庫啟用高速資料庫復原 (ADR),再使用隨機加密進行加密,以在啟用記憶體保護區的資料行上建立第一個索引。 ADR 預設會在 Azure SQL Database 和 Azure SQL 受控實例中啟用。 ADR 可在 SQL Server 2019 (15.x)及其後續版本中使用,但預設未啟用。
透過 傳統資料庫復原程式(遵循 ARIES 恢復模式),若要復原索引的變更,Database Engine 必須等到應用程式將數據行的數據行加密密鑰提供給記憶體保護區,這可能需要很長的時間。 加速資料庫復原 (ADR) 可大幅減少因為無法在記憶體保護區內快取中取得資料行加密金鑰,而必須延遲的復原作業數目。 因此,它藉由將新交易遭到封鎖的機會降至最低,大幅提高資料庫可用性。 啟用 ADR 後,Database Engine 可能仍然需要數據行加密密鑰才能完成清除舊數據版本,但做為不會影響資料庫或使用者交易可用性的背景工作。 您可能會在錯誤記錄檔中看到錯誤訊息,指出因缺少資料行加密金鑰而無法完成清理作業。
下列安全性考量事項適用於具備安全記憶體保護區的 Always Encrypted。
master
金鑰或資料行加密金鑰。 DBA 可以透過使用記憶體保護區內的資料行加密金鑰快取,在無需直接存取金鑰的情況下管理加密資料行上的索引。為使用具有安全記憶體保護區之 Always Encrypted 的資料庫設定高可用性或災害復原解決方案時,請確定所有資料庫複本都可以使用安全的記憶體保護區。 如果記憶體保護區適用於主要複本,但不適用於次要複本,則嘗試使用具有安全記憶體保護區的 Always Encrypted 功能其所有陳述式在容錯移轉後都會失敗。
當使用具有安全記憶體保護區的 Always Encrypted 複製或遷移資料庫時,請確定目標環境一律支援記憶體保護區。 否則,使用記憶體保護區的陳述式將無法在複本或所移轉資料庫上運作。
請務必牢記下列特定考量:
SQL Server
Azure SQL Database
在 SQL Server 和 Azure SQL Database 中,當使用 bacpac 檔案遷移資料庫時,您必須確定在建立 bacpac 檔案前,已卸除所有使用隨機加密的啟用索引記憶體保護區資料行其索引。
具有安全記憶體保護區的 Always Encrypted 可利用索引支援就地加密和更豐富機密查詢,因應 Always Encrypted 的一些限制,如已啟用記憶體保護區的資料行機密計算功能所述。
限制中所列 Always Encrypted 的所有其他限制,也適用於具有安全記憶體保護區的 Always Encrypted。
下列限制僅適用於具備安全記憶體保護區的 Always Encrypted:
ALTER TABLE
/ALTER COLUMN
Transact-SQL 陳述式中變更資料行的資料類型。 請使用兩個個別的陳述式。nchar[n]
和 nvarchar[n]
,如果 n 大於 3967。char[n]
、varchar[n]
、binary[n]
、varbinary[n]
,如果 n 大於 7935。master
金鑰,唯一支援的金鑰存放區是 Windows 憑證存放區和 Azure Key Vault。ALTER TABLE
/ALTER COLUMN
觸發就地密碼編譯作業,您必須使用 SSMS 中的查詢視窗或 Azure Data Studio 發出陳述式,也可以撰寫自己的程式來發出陳述式。 目前,SqlServer PowerShell 模組中的 Set-SqlColumnEncryption
Cmdlet 和 SQL Server Management Studio 中的 [Always Encrypted 精靈] 不支援就地加密。 將資料移出資料庫以進行密碼編譯作業,即使用於作業的資料行加密金鑰為已啟用記憶體保護區也一樣。事件
3月31日 下午11時 - 4月2日 下午11時
最大的 SQL、網狀架構和 Power BI 學習事件。 3 月 31 日 - 4 月 2 日。 使用程式代碼 FABINSIDER 來節省 $400 美元。
立即註冊訓練
認證
Microsoft Certified: Azure Database Administrator Associate - Certifications
使用 Microsoft PaaS 關聯式資料庫供應項目管理用於雲端、內部部署和混合關聯式資料庫的 SQL Server 資料庫基礎結構。
文件
教學課程:在 SQL Server 中開始使用具有安全記憶體保護區的 Always Encrypted - SQL Server
本教學課程會教導您如何使用虛擬化型安全性 (VBS) 記憶體保護區和無記憶體保護區證明,在 SQL Server 中為 Always Encrypted 建立具有安全記憶體保護區的基本環境。 您也會了解如何就地加密資料,以及使用 SQL Server Management Studio (SSMS) 針對加密資料行發出豐富的機密查詢。
為具有安全記憶體保護區的 Always Encrypted 進行常見問題疑難排解 - SQL Server
為具有安全記憶體保護區的 Always Encrypted 進行常見問題疑難排解
使用具有安全記憶體保護區的 Always Encrypted 開發應用程式 - SQL Server
使用具有安全記憶體保護區的 Always Encrypted 開發應用程式