本文為您介紹如何對Hologres中的資料進行儲存加密處理,包括資料存放區加密機制、使用限制及操作步驟。
背景資訊
KMS(Key Management Service,Key Management Service) 是一種用於建立、儲存和管理加密金鑰的雲端服務。其主要目標是協助使用者保護敏感性資料,通過加密確保資料在儲存和傳輸過程中的安全性。
Hologres支援通過KMS對資料進行加密儲存,開啟加密儲存後,KMS會通過演算法將資料轉換為密文儲存,需要密鑰才能還原未經處理資料,可以有效在儲存層保護資料,防止外部攻擊,滿足企業監管和安全合規需求。開啟加密儲存後,由於涉及加密和解密操作,所以會影響查詢和寫入效能,大約有20%-40%的效能損耗,具體情況根據查詢特徵有不同程度的影響。
使用限制
-
僅Hologres V1.1及以上版本支援資料加密儲存,如果您的執行個體是V1.1以下版本,請您使用常見升級準備失敗報錯或加入HologresDingTalk交流群反饋,詳情請參見如何擷取更多的線上支援?。
-
使用資料存放區加密功能時,如果您的執行個體版本低於V1.3.31需要添加後台配置。Hologres從V1.3.31版本開始無需添加後台配置,如需使用該功能,建議您升級執行個體,詳情請參見執行個體升級。
-
您在KMS上對內建密鑰(BYOK)的操作(例如禁用或刪除),會影響Hologres對資料的加密或解密操作。由於Hologres服務涉及緩衝,您在KMS的相關操作會在24小時內生效。
-
儲存加密僅會對開啟儲存加密後的資料表生效,對於開啟儲存加密前建立的資料表,系統不會對其進行儲存加密。
-
開啟儲存加密功能後,仍然可以在MaxCompute中建立Hologres外部表格進行資料讀寫。
-
開啟儲存加密功能後,再使用如下SQL關閉資料庫的儲存加密,關閉前的表資料仍然是被加密的,只有關閉後新建立的表才不會使用儲存加密。
ALTER DATABASE <database_name> set hg_experimental_encryption_options=''; -
開啟儲存加密表使用的KMS密鑰被禁用或者失效,會導致該表的資料無法讀寫。
-
Hologres不支援直接切換已加密資料庫的KMS密鑰。對已加密的資料庫執行
ALTER DATABASE指向新密鑰,語句可能執行成功,但密鑰不會實際切換,已有加密表仍由原密鑰進行加解密,查詢不受影響。如需改用新祕密金鑰加密資料,請按密鑰切換與資料移轉建立資料庫並遷移資料。禁用或刪除原密鑰後,使用原祕密金鑰加密的歷史資料將無法解密,請在確認不再訪問舊資料後再執行該操作。 -
Hologres從 V2.0版本開始支援為每張表設定單獨的加密規則,即對於不同的表設定不同的KMS密鑰進行加密。
-
僅支援對列存表以及行列共存模式中的列存表開啟資料存放區加密,其餘表類型不支援。開啟儲存加密功能後,您仍然可以在MaxCompute中建立Hologres外部表格以進行資料讀寫,且僅列存表、及行列共存中的列存表為加密模式,其餘表類型不進行加密。
資料加密機制
Hologres通過KMS託管密鑰,實現資料加密或解密功能,資料加密機制如下。
-
Hologres以資料庫為單位,通過KMS加密或解密儲存在Hologres的資料。在使用資料加密功能前,請確保您所在地區已開通KMS服務。
-
KMS產生和管理您的密鑰並保障密鑰的安全性。
-
Hologres支援的密碼編譯演算法有AES256、AESCTR、RC4。
-
Hologres僅支援內建密鑰(BYOK)加密或解密資料,同時支援兩類密鑰材料,包括建立使用者主要金鑰CMK時由KMS產生的密鑰材料以及使用者匯入的密鑰材料。
您可以通過KMS建立內建密鑰(BYOK),並在Hologres中針對資料庫,選擇該密鑰作為密鑰進行資料加密。在KMS上建立BYOK的詳情請參見建立密鑰。
-
在資料讀寫時,Hologres會調用KMS的API擷取相關的密鑰資訊,擷取相關的密鑰資訊系統預設會緩衝24小時。因此在使用資料加密功能時會產生相關的KMS費用,KMS相關計費說明請參見KMS 1.0計費說明。
操作步驟
-
建立自訂權限原則
-
登入RAM控制台,單擊左側導覽列的權限原則,進入權限原則頁面,單擊创建权限策略。

-
進入创建权限策略頁面,單擊腳本編輯配置指令碼如下所示且名稱命名為AliyunHologresEncryptionDefaultRolePolicy。

{ "Version": "1", "Statement": [ { "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey", "kms:DescribeKey" ], "Resource": "acs:kms:*:*:*/*", "Effect": "Allow" } ] } -
單擊確定,完成自訂權限原則的建立。
-
-
建立Hologres代理角色並授權
-
登入RAM控制台,單擊左側導覽列的角色。
-
進入角色頁面,單擊创建角色,進入创建角色對話方塊,選擇信任主體類型為雲服務,信任主體名稱為實時數倉Hologres。
-
單擊確認,角色名稱命名為
AliyunHologresEncryptionDefaultRole。 -
進入创建完成頁面,單擊新增授權。
-
進入新增授權頁面,資源範圍選擇賬戶層級,策略許可權為自訂策略中第一步建立的自訂角色策略(AliyunHologresEncryptionDefaultRolePolicy)。

-
單擊確定,完成角色建立和授權操作。
在建立完角色後,單擊建立的角色,在信任策略管理頁簽,可以查看信任策略的設定。
-
-
建立密鑰
具體操作,請參見密鑰管理快速入門。
重要Hologres只支援使用對稱金鑰,其密鑰類型為Aliyun_AES_256。
-
設定加密規則
-
登入需要進行儲存資料加密的資料庫執行個體,登入資料庫請參見登入資料庫。
-
在臨時Query查詢頁面,選擇已建立的實例名和資料庫後,請您在SQL查詢的編輯框輸入如下語句,單擊運行。
以下SQL語句用於設定資料存放區加密規則。
ALTER DATABASE <db_name> SET hg_experimental_encryption_options='<encryption_type>,<cmk_id>,<ram_role>,<uid>';參數說明
參數
說明
db_name
需要進行加密儲存的資料庫名稱。
encryption_type
加密類型。僅支援AES256、AESCTR、RC4類型。
cmk_id
密鑰ID。登入Key Management Service控制台,密鑰詳情頁擷取。
ram_role
建立的Hologres代理角色名稱。
uid
阿里雲帳號ID。擷取詳情請參見帳號ID。
一個設定加密規則並查詢資料的簡單使用樣本如下。
-
對資料庫開啟儲存加密。
ALTER DATABASE hoxxxx set hg_experimental_encryption_options= 'AES256,623c26ee-xxxx-xxxx-xxxx-91d323cc4855,AliyunHologresEncryptionDefaultRole,187xxxxxxxxxxxxx'; -
建立表並寫入資料。
DROP TABLE IF EXISTS a; CREATE TABLE a(id int); INSERT INTO a values(1); SELECT hg_admin_command('flush'); -- 僅對測試使用,為了馬上查詢到效果使用 -
查詢資料。
SELECT * FROM a;
若此時禁用了KMS,在執行個體重啟或者24小時後,查詢a表資料會報錯。
-
表層級儲存加密設定
Hologres從V2.0版本開始,在資料庫開啟儲存加密後,支援設定差異化的單表加密策略,允許部分表不加密或為不同表指定獨立的KMS密鑰。
設定表層級儲存加密規則
-
注意事項:
-
若不對錶單獨設定加密規則,系統會使用
hg_experimental_encryption_options設定的加密規則作為表的加密規則。 -
設定必須要在建表時設定,不支援在表建立後再設定加密規則。
-
-
使用文法:
CALL SET_TABLE_PROPERTY('<table_name>', 'encryption_options', '<encryption_type>,<cmk_id>,<ram_role>,<uid>'); -
參數說明如下:
參數
說明
table_name
需要進行加密儲存的表名稱。
encryption_type
加密類型。僅支援AES256、AESCTR、RC4類型。
cmk_id
密鑰ID。登入Key Management Service控制台,密鑰詳情頁擷取。
ram_role
建立的Hologres代理角色名稱。
uid
阿里雲帳號ID。擷取詳情請參見帳號ID。
-
使用樣本:
建立表lineitem,並使用AES256加密類型、623c26ee-xxxx-xxxx-xxxx-91d323cc4855祕密金鑰加密。
BEGIN; CREATE TABLE LINEITEM ( L_ORDERKEY BIGINT NOT NULL, L_PARTKEY INT NOT NULL, L_SUPPKEY INT NOT NULL, L_LINENUMBER INT NOT NULL, L_QUANTITY DECIMAL(15,2) NOT NULL, L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, L_DISCOUNT DECIMAL(15,2) NOT NULL, L_TAX DECIMAL(15,2) NOT NULL, L_RETURNFLAG TEXT NOT NULL, L_LINESTATUS TEXT NOT NULL, L_SHIPDATE TIMESTAMPTZ NOT NULL, L_COMMITDATE TIMESTAMPTZ NOT NULL, L_RECEIPTDATE TIMESTAMPTZ NOT NULL, L_SHIPINSTRUCT TEXT NOT NULL, L_SHIPMODE TEXT NOT NULL, L_COMMENT TEXT NOT NULL, PRIMARY KEY (L_ORDERKEY,L_LINENUMBER) ); CALL SET_TABLE_PROPERTY('LINEITEM', 'encryption_options', 'AES256,623c26ee-xxxx-xxxx-xxxx-91d323cc4855,AliyunHologresEncryptionDefaultRole,153xxxxxxxxxxxxx'); COMMIT;
查看儲存加密規則
Hologres從V2.0版本開始,您可以使用如下SQL查看每張表的加密規則。
SELECT
*
FROM
hologres.hg_table_properties
WHERE
property_key = 'encryption_options';
樣本返回結果包含 table_namespace、table_name、property_key、property_value 四列,其中 property_value 記錄了密碼編譯演算法(如 AES256)、CMK ID、RAM 角色(如 AliyunHologresEncryptionDefaultRole)及 UID 等資訊。
密鑰切換與資料移轉
Hologres不支援直接切換已加密資料庫的KMS密鑰。使用指定祕密金鑰加密的資料只能由該密鑰解密,同一個資料庫在資料庫層級只能有一個生效的儲存加密規則。對已加密的資料庫執行ALTER DATABASE指向新密鑰,語句可能執行成功,但密鑰不會實際切換,原有資料仍由舊密鑰解密。
如需更換KMS密鑰(例如舊密鑰即將停用),請按以下順序遷移資料:
-
建立一個新的資料庫。
-
對新資料庫設定新的KMS儲存加密規則,文法與“操作步驟”中設定加密規則一致。
ALTER DATABASE <db_name> SET hg_experimental_encryption_options='<encryption_type>,<cmk_id>,<ram_role>,<uid>'; -
通過Flink、DataWorks等資料同步任務,將舊資料庫中的資料移轉到新資料庫。
必須先對新資料庫設定儲存加密規則,再遷移資料。儲存加密僅會對開啟儲存加密後建立的資料表生效(詳情請參見“使用限制”),若先遷移資料再設定加密規則,遷移過程中已建立的表不會被加密。