建議使用 Azure SQL Database Always Encrypted 的時機

已完成

Always Encrypted 是一項功能,旨在保護敏感數據,例如信用卡號碼或國家/地區標識符(例如美國社會安全號碼),儲存在 Azure SQL Database、Azure SQL 受控實例和 SQL Server 資料庫中。 Always Encrypted 可讓用戶端加密用戶端應用程式內的敏感數據,且永遠不會向 Database Engine 顯示加密密鑰。 Always Encrypted 將擁有資料並可查看的人,與管理資料但不應有權限的人——本地資料庫管理員、雲端資料庫管理員或其他高權限的未經授權使用者——區分開來。 因此,Always Encrypted 可讓客戶自信地將其敏感數據儲存在雲端,並減少惡意內部人員竊取數據的可能性。

Always Encrypted 可以設定為支援加密數據的有限機密查詢,這些查詢牽涉到相等比較。 例如,點查閱搜尋或相等聯結。 這類查詢使用確定性加密。

顯示一律加密資料庫範例的圖表。

備註

安全隔區透過模式匹配、其他比較運算符及原地加密,擴展了 Always Encrypted 的機密運算能力。

Always Encrypted 可讓應用程式保持透明加密。 安裝於用戶端電腦的啟用 Always Encrypted 驅動程式,會自動加密與解密用戶端應用程式中的敏感資料。 驅動程式會在將資料交給資料庫引擎前,先將資料加密成敏感欄位。 接著驅動程式會自動重寫查詢,以保留應用程式的語意。 同樣地,驅動程式會以透明方式解密儲存在加密資料庫數據行中的數據,並包含在查詢結果中。

設定 Always Encrypted

若要在您的資料庫中設定 Always Encrypted,您需要:

  1. 部署加密金鑰以保護您的資料。 Always Encrypted 使用兩個類型的金鑰:

    • 資料行加密金鑰。
    • 資料行主要金鑰。

    資料行加密金鑰用來將加密資料行中的資料加密。 資料行主要金鑰是金鑰保護金鑰,可加密一或多個資料行加密。 你需要將欄位主金鑰存放在資料庫系統外的受信任金鑰庫中。 最常見的儲存位置包括 Azure Key Vault、Windows 憑證儲存庫或硬體安全模組。 接著,你需要部署欄位加密金鑰,並用欄位主金鑰加密每個欄位。 最後,您必須將金鑰的相關元數據儲存在資料庫中。

    • 資料行主要金鑰中繼資料會擷取資料行主要金鑰的位置。
    • 資料行加密金鑰中繼資料包含資料行加密金鑰的加密值。 Database Engine 絕不會以純文本儲存或使用任一類型的索引鍵。
  2. 針對包含要保護之敏感數據的所選資料庫數據行設定加密。 你可以建立帶有加密欄位的新資料表,或加密現有的資料庫欄位和資料。 設定資料行加密時,您可以指定加密演算法的相關信息、用來保護資料行中的數據的數據行加密金鑰,以及加密類型。 Always Encrypted 支援兩種加密類型:

    • 確定性加密一律會針對指定的純文本值產生相同的加密值。 使用具決定性加密可允許對加密數據行進行點查閱、相等聯結、分組和編製索引。 然而,它也可能讓未經授權的使用者透過檢視加密欄位中的模式來猜測加密值的資訊,特別是當有少數可能的加密值集合,例如真/假或北/南/東/西區域時。
    • 隨機化加密使用方法,以較不可預測的方式加密數據。 隨機加密更安全,但會防止在加密的數據行上搜尋、分組、編製索引和聯結。

    對於用作搜尋或分組參數的欄位,請使用確定性加密。 例如,政府標識碼。 針對機密調查批注等數據使用隨機加密,這些批註不會與其他記錄分組,而且不會用來聯結數據表。 如需 Always Encrypted 密碼編譯演算法的詳細資訊,請參閱 Always Encrypted 密碼編譯。 您可以使用 SQL 工具執行上述步驟:

    為確保 Always Encrypted 金鑰和受保護的敏感性資料永遠不會以純文字形式向資料庫環境顯示,資料庫引擎無法參與金鑰佈建和資料加密或解密作業。 因此,Transact-SQL (T-SQL) 不支援密鑰布建或密碼編譯作業。 基於相同原因,加密現有的資料或重新加密它 (使用不同的加密類型或資料行加密金鑰) 必須在資料庫外部執行 (SQL 工具可以將其自動化)。

對加密欄位的查詢如何運作

若使用者需要執行以下任一操作,必須滿足一組先決條件:

  • 對加密資料庫欄位執行查詢
  • 將資料插入加密欄位
  • 從加密欄位中擷取明文值
  • 對使用確定性加密的欄位執行支援的操作(例如點查找搜尋)

使用者或應用程式發出查詢時必須符合以下先決條件:

  • 具備存取保護資料的欄主金鑰的權限。 除了資料庫層級許可權之外,還需要密鑰存取權,例如 SELECT 包含數據的數據表。
  • 連接到資料庫時,已啟用 Always Encrypted。 大部分的 SQL 工具和 SQL 用戶端驅動程式都支援針對資料庫連線啟用 Always Encrypted。

備註

如果使用者擁有讀取資料所需的資料庫權限,但無法存取保護資料的金鑰,則可執行相關操作。 使用者可透過連接資料庫取得密文(加密)資料,而無需在資料庫連線中啟用「始終加密」。

以下是加密資料列的查詢運作方式:

  1. 當應用程式發出參數化查詢時,應用程式內的 SQL 用戶端驅動程式會透明地連絡 Database Engine,透過呼叫 sp_describe_parameter_encryption (Transact-SQL) 來判斷哪些參數針對加密的數據行並應被加密。 針對需要加密的每個參數,驅動程式會收到加密演算法、加密類型和密鑰元數據,包括加密的數據行加密密鑰及其對應數據行主要金鑰的位置。
  2. 驅動程式會呼叫金鑰存放區,其中包含數據行主要金鑰,以解密加密的數據行加密金鑰值。 系統會快取產生的純文本數據行加密密鑰,以減少後續使用相同數據行加密密鑰時,往返密鑰存放區的數目。
  3. 驅動程式會使用取得的純文字數據行加密金鑰來加密對應至加密數據行的查詢參數。
  4. 驅動程式會將針對加密欄的參數的純文字值替換為其加密值,然後將查詢傳送至資料庫引擎進行處理。
  5. 資料庫引擎執行查詢,可能涉及使用確定性加密對欄位進行等式比較。
  6. 如果查詢結果包含來自加密數據行的數據,Database Engine 會為每個數據行附加加密元數據,包括加密演算法、加密類型和金鑰元數據的相關信息至結果集。
  7. Database Engine 會將結果集傳送至用戶端應用程式。
  8. 針對所接收結果集中的每個加密數據行,驅動程式會先嘗試在本機快取中尋找純文本數據行加密密鑰,而且只有在快取中找不到密鑰時,才會往返保存數據行主要密鑰的金鑰存放區。
  9. 驅動程式會將結果解密,並將純文本值傳回給應用程式。

用戶端驅動程式會使用資料行主要金鑰存放區提供者與包含資料行主要金鑰的金鑰存放區互動,後者是用戶端軟體元件,其中封裝包含資料行主要金鑰的金鑰存放區。 常見類型的金鑰存放區提供者可從 Microsoft 的用戶端驅動程式庫中獲得,或者以獨立下載的形式提供。 您也可以實作自己的提供者。 Always Encrypted 功能 (包括內建的資料行主要金鑰存放區提供者) 會因驅動程式庫及其版本而異。

如需支援 Always Encrypted 的用戶端驅動程式清單,請參閱 使用 Always Encrypted 開發應用程式 ,以及如何開發查詢加密數據行的應用程式。

您也可以使用 SQL 工具查詢加密的數據行,例如 Azure Data StudioSSMS

局限性

下列限制適用加密資料行上的查詢:

  • 確定性加密支援下列涉及相等比較的作業 - 不允許其他作業。

  • 不允許對使用隨機化加密的加密資料行進行計算。

備註

Always Encrypted with Secure Enclaves 放寬了限制,允許使用隨機加密進行模式匹配、比較運算子、排序及欄位索引。

  • 不允許觸發涉及純文字和加密資料計算的查詢陳述式。 例如:

    • 比較加密資料行與純文字資料行或常值。
    • 將資料從純文本欄複製到加密的欄(或反過來)UPDATEBULK INSERTSELECT INTOINSERT..SELECT
    • 將常值插入加密的資料行。

這類陳述式會導致運算元衝突錯誤,如下所示:

Output
Msg 206, Level 16, State 2, Line 89
Operand type clash: char(11) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_1', column_encryption_key_database_name = 'ssn') collation_name = 'Latin1_General_BIN2' is incompatible with char












  • 應用程式必須使用查詢參數來傳遞對應至加密數據行的值。 例如,將數據插入加密資料行或篩選加密數據行時(使用決定性加密時)。 不支援傳遞對應至加密數據行的常值或 T-SQL 變數。 如需您使用之客戶端驅動程式的特定詳細資訊,請參閱 使用 Always Encrypted 開發應用程式

  • 您必須在 Azure Data StudioSSMS 中使用 Always Encrypted 變數的參數化,以發出查詢,這些查詢會傳遞對應至這些工具中加密數據行的值。 例如,將數據插入加密資料行或篩選加密數據行時(使用決定性加密時)。

  • 不支援針對加密的欄位的表值參數

  • 不支援使用下列子句的查詢:

  • 變更加密數據行的定義之後,請執行 sp_refresh_parameter_encryption 以更新 物件的 Always Encrypted 元數據。

  • 具有下列特性的資料行不支援 Always Encrypted:

    • 使用下列資料類型之一的欄位:xml、timestamp、rowversion、image、ntext、text、sql_variant、hierarchyid、geography、geometry、alias、自定義類型。
    • FILESTREAM
    • 具有 IDENTITY 屬性的欄位。
    • 具有 ROWGUIDCOL 屬性的數據行。
    • 使用確定性加密時,具有除二進位碼點 (_BIN2) 定序以外定序的字串 (varchar、char 等) 資料行。
    • 使用隨機化加密時,屬於叢集和非叢集索引的索引鍵的資料行 (支援使用確定性加密的資料行索引)。
    • 全文檢索索引中包含的欄位(Always Encrypted 不支援 全文檢索)。
    • 計算數據行
    • 計算資料行參考的資料行 (當運算式對 Always Encrypted 執行不支援的作業時)。
    • 稀疏列集
    • 在使用隨機 加密(支援 確定性加密)時,統計所參考的欄位。
    • 分割欄位
    • 具有 預設約束的列。
    • 使用隨機加密時,唯一性約束條件所參考的欄位(支持決定性加密)。
    • 使用隨機化加密時的主索引鍵資料行 (支援確定性加密)。
    • 使用隨機化加密或使用確定性加密時,參考外部索引鍵條件約束中的資料行,如果參考和參考端資料行使用不同的金鑰或演算法。
    • 檢查條件約束參考的資料行。
    • 使用異動資料擷取擷取/追蹤的資料行。
    • 具有 變更追蹤的數據表之主鍵欄。
    • 遮罩的數據行(使用 動態數據遮罩)。
    • 延展資料庫資料表中的資料行。 (可以為使用 Always Encrypted 加密的資料表啟用延展。)

這很重要

Stretch Database 在 SQL Server 2022 (16.x) 及 Azure SQL 資料庫中已被取代。 資料庫引擎的未來版本將移除此功能。 請避免在新的開發工作中使用此功能,並計劃修改目前使用此功能的應用程式。

Always Encrypted Transact-SQL 參考

Always Encrypted 使用下列 Transact-SQL 陳述式、系統目錄檢視、系統預存程序和權限。

陳述

系統目錄檢視和預存程序

另請參閱 sys.columns (Transact-SQL), 以取得每個數據行所儲存之加密元數據的資訊。

資料庫權限

Always Encrypted 有四個資料庫許可權:

  • ALTER ANY COLUMN MASTER KEY - 建立和刪除資料行主要金鑰中繼資料所需。
  • ALTER ANY COLUMN ENCRYPTION KEY - 建立和刪除資料行加密金鑰中繼資料所需。
  • VIEW ANY COLUMN MASTER KEY DEFINITION - 存取和讀取資料行主要金鑰中繼資料所需,這是查詢加密的資料行所需。
  • VIEW ANY COLUMN ENCRYPTION KEY DEFINITION - 存取和讀取資料行主要金鑰中繼資料所需,這是查詢加密的資料行所需。

下表摘要說明常見動作所需的權限。

場景 變更任何欄位主鍵 變更任何欄位加密金鑰 檢視任何欄位主金鑰定義 檢視任何數據行加密金鑰定義
金鑰管理 (在資料庫中建立/變更/檢閱金鑰中繼資料) X X X X
查詢加密的資料行 X X

重要考慮

  • 選取加密資料行時,需要 VIEW ANY COLUMN MASTER KEY DEFINITION 和 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限,即使使用者沒有資料行主要金鑰的權限 (在其金鑰存放區中),保護資料行且無法存取純文字嘗試。
  • 在 SQL Server 中,VIEW ANY COLUMN MASTER KEY DEFINITION 和 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限預設都會授與公用固定資料庫角色。 資料庫管理員可能會選擇撤銷公用角色的許可權,並授與特定角色或使用者以實作更受限制的控制。
  • 在 SQL Database 中,VIEW ANY COLUMN MASTER KEY DEFINITION 和 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限預設不會授與公用固定資料庫角色。 這可讓某些現有的舊版工具 (使用舊版 DacFx) 正常運作。 若要使用加密的數據行(即使未解密它們),資料庫管理員必須明確授與 VIEW ANY COLUMN MASTER KEY DEFINITION 和 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 許可權。