openGauss 設定透明資料加密_TDE

techbing發表於2024-04-30

設定透明資料加密(TDE)

概述

透明資料加密(Transparent Data Encryption),是資料庫在將資料寫入儲存介質時對資料進行加密,從儲存介質中讀取資料時自動解密,防止攻擊者繞過資料庫認證機制直接讀取資料檔案中的資料,以解決靜態資料洩露問題。該功能對於應用層幾乎透明無感知,使用者可根據需要決定是否啟用透明資料加密功能。

前提條件

  • 需要由金鑰管理服務KMS對資料加密金鑰提供保護,資料庫可以正常訪問KMS服務。KMS服務可在華為雲資料加密服務DEW申請開通。
  • 需要將GUC引數enable_tde設定為on,開啟資料庫透明資料加密開關。同時需正確設定資料庫例項主金鑰ID引數tde_cmk_id

背景資訊

當前版本主要實現對接華為雲KMS服務,支援表級金鑰儲存,實現對行存表加密,規格約束如下:

  • 支援heap儲存行存表加密。
  • 不支援列存表加密,不支援物化檢視加密,不支援ustore儲存引擎加密。
  • 不支援索引和Sequence加密,不支援XLOG日誌加密,不支援MOT記憶體表加密,不支援系統表加密。
  • 使用者在建立表時可以指定加密演算法,加密演算法一旦指定不可更改。如果建立表時設定enable_tde為on,但是不指定加密演算法encrypt_algo,則預設使用AES_128_CTR加密演算法。
  • 如果在建立表時未開啟加密功能或指定加密演算法,後續無法再切換為加密表。
  • 對於已分配加密金鑰的表,切換表的加密和非加密狀態,不會更換金鑰和加密演算法。
  • 資料金鑰輪轉只有開啟表加密功能時才支援輪轉。
  • 不支援單資料庫例項跨region的多副本主備同步,不支援單資料庫例項跨region的擴容,不支援跨region的備份恢復、資料庫例項容災和資料遷移場景。
  • 混合雲場景如果使用華為雲KMS和管控面功能,則可以支援透明資料加密,其他KMS服務如果介面不相容則無法支援。
  • 加密表的查詢效能比不加密時會有所劣化,對於效能有較高要求的情況下需謹慎開啟加密功能。

金鑰管理機制

透明資料加密功能中資料的加密和解密都依賴於安全可靠的金鑰管理機制。本功能採用三層金鑰結構實現金鑰管理機制,即根金鑰(RK)、主金鑰(CMK)和資料加密金鑰(DEK)。主金鑰由根金鑰加密保護,資料加密金鑰由主金鑰加密保護。資料加密金鑰用於對使用者資料進行加密和解密,每個表對應一個資料加密金鑰。根金鑰和主金鑰儲存在KMS服務中,資料加密金鑰透過向KMS服務申請建立,建立成功可同時返回金鑰明文和密文。資料加密金鑰明文在記憶體中會使用hash表進行快取減少訪問KMS頻次以提升效能,金鑰明文只存在記憶體中使用不會落盤,並且支援自動淘汰機制刪除不常使用的金鑰明文,只儲存最近1天內使用的金鑰明文。資料加密金鑰密文儲存在資料庫中並落盤持久化。對使用者表資料加解密時,如果記憶體中沒有對應金鑰明文則需向KMS申請對資料金鑰解密後再使用。

表級加密方案

允許使用者在建立表時指定是否對錶進行加密和使用的加密演算法,加密演算法支援AES_128_CTR和SM4_CTR兩種演算法,演算法一旦指定不可更改。對於建立表時指定為加密的表,資料庫會自動為該表申請建立資料加密金鑰,並將加密演算法、金鑰密文和對應主金鑰ID等引數使用"keyword=value"格式儲存在pg_class系統表中的reloptions欄位中。

對於加密表,允許使用者切換表的加密狀態,即將加密表切換為非加密表,或將非加密表切換為加密表。如果在建立表時未使能加密功能,後續無法再切換為加密表。

對於加密表,支援資料加密金鑰輪轉。金鑰輪轉後,使用舊金鑰加密的資料仍使用舊金鑰解密,新寫入的資料使用新金鑰加密。金鑰輪轉時不更換加密演算法。

對於行存表,每次加解密的最小資料單元為一個8K大小的page頁面,每次對page頁面加密時會透過安全隨機數介面生成IV值,並將IV值和金鑰密文、主金鑰ID等資訊儲存在頁面中一起寫入儲存介質。對於加密表由於page頁面中需要儲存加密金鑰資訊,相比不加密時佔用儲存空間膨脹約2.5%。

建立加密表

登入資料庫,建立加密表tde_test1,加密狀態為開啟,指定加密演算法為AES_128_CTR:

openGauss=# CREATE TABLE tde_test (a int, b text) with (enable_tde = on, encrypt_algo = 'AES_128_CTR');

建立加密表tde_test2,加密狀態為開啟,不指定加密演算法,則加密演算法預設為AES_128_CTR:

openGauss=# CREATE TABLE tde_test2 (a int, b text) with (enable_tde = on);

建立加密表tde_test3,加密狀態為關閉,指定加密演算法為SM4_CTR:

openGauss=# CREATE TABLE tde_test3 (a int, b text) with (enable_tde = off, encrypt_algo = 'SM4_CTR');

切換加密表加密開關

登入資料庫,將加密表tde_test1的加密開關置為off:

openGauss=# ALTER TABLE tde_test1 SET (enable_tde=off);

將加密表tde_test1的加密開關置為on:

openGauss=# ALTER TABLE tde_test1 SET (enable_tde=on);

對加密表進行金鑰輪轉

登入資料庫,對加密表tde_test1進行金鑰輪轉:

openGauss=# ALTER TABLE tde_test1 ENCRYPTION KEY ROTATION;

詳情檢視:https://opengauss.org

詳情檢視:https://docs-opengauss.osinfra.cn

相關文章