本文為您介紹如何在Hologres中對數據進行加密處理,本文包括數據加密機制、使用限制及操作步驟。
背景信息
Hologres支持通過密鑰管理服務KMS(Key Management Service)對數據進行加密存儲,提供數據靜態保護能力,滿足企業監管和安全合規需求。開啟加密存儲后,由于涉及加密和解密操作,所以會影響查詢和寫入性能,大約有20%-40%的性能損耗,具體情況根據查詢特征有不同程度的影響。
使用限制
僅Hologres V1.1及以上版本支持數據加密存儲,如果您的實例是V1.1以下版本,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?。
使用數據存儲加密功能時,如果您的實例版本低于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從 V2.0版本開始支持為每張表設置單獨的加密規則,即對于不同的表設置不同的KMS密鑰進行加密。
僅支持對列存表以及行列共存模式中的列存表開啟數據存儲加密,其余表類型不支持。開啟存儲加密功能后,您仍然可以在MaxCompute中創建Hologres外部表以進行數據讀寫,且僅列存表、及行列共存中的列存表為加密模式,其余表類型不進行加密。
數據加密機制
Hologres通過KMS托管密鑰,實現數據加密或解密功能,數據加密機制如下。
Hologres以數據庫為單位,通過KMS加密或解密存儲在Hologres的數據。在使用數據加密功能前,請確保您所在區域已開通KMS服務。
KMS生成和管理您的密鑰并保障密鑰的安全性。
Hologres支持的加密算法有AES256、AESCTR、RC4和SM4。
Hologres僅支持自帶密鑰(BYOK)加密或解密數據,同時支持兩類密鑰材料,包括創建用戶主密鑰CMK時由KMS生成的密鑰材料以及用戶導入的密鑰材料。
您可以通過KMS創建自帶密鑰(BYOK),并在Hologres中針對數據庫,選擇該密鑰作為密鑰進行數據加密。在KMS上創建BYOK的詳情請參見創建密鑰。
在數據讀寫時,Hologres會調用KMS的API獲取相關的密鑰信息,獲取相關的密鑰信息系統默認會緩存24小時。因此在使用數據加密功能時會產生相關的KMS費用,KMS相關計費說明請參見KMS計費說明。
操作步驟
創建自定義權限策略
登錄RAM控制臺,單擊左側導航欄的權限策略,進入權限策略頁面,單擊創建權限策略。
進入創建權限策略頁面,單擊腳本編輯配置腳本如下所示且名稱命名為AliyunHologresEncryptionDefaultRolePolicy。
{ "Version": "1", "Statement": [ { "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey", "kms:DescribeKey" ], "Resource": "acs:kms:*:*:*/*", "Effect": "Allow" } ] }
單擊確定,完成自定義權限策略的創建。
創建Hologres代理角色并授權
登錄RAM控制臺,單擊左側導航欄的角色。
進入角色頁面,單擊創建角色,進入創建角色對話框,選擇可信實體類型為阿里云服務。
單擊下一步,角色類型選擇普通服務角色,角色名稱命名為AliyunHologresEncryptionDefaultRole,設置選擇受信服務為交互式分析,單擊完成。
進入創建完成頁面,單擊為角色授權。
進入添加權限頁面,授權范圍選擇整個云賬號,選擇權限為自定義策略中第一步創建的自定義角色策略(AliyunHologresEncryptionDefaultRolePolicy)。
單擊確定,完成角色創建和授權操作。
在創建完角色后,單擊創建的角色,在信任策略管理頁簽,可以查看信任策略的設置。
創建密鑰
具體操作,請參見密鑰管理快速入門。
重要Hologres只支持使用對稱密鑰,其密鑰類型為Aliyun_AES_256。
設置加密規則
登錄需要進行存儲數據加密的數據庫實例,登錄數據庫請參見登錄數據庫。
在臨時Query查詢頁面,選擇已創建的實例名和數據庫后,請您在SQL查詢的編輯框輸入如下語句,單擊運行。
一個設置加密規則并查詢數據的簡單使用示例如下。
對數據庫開啟存儲加密。
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。登錄密鑰管理服務控制臺,密鑰詳情頁獲取。
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';
示例返回結果: