在安全合規或靜態數據加密等場景下,推薦使用透明數據加密TDE功能,對數據文件執行實時I/O加密和解密,通過在數據庫層執行靜態數據加密,阻止可能的攻擊者繞過數據庫直接從存儲中讀取敏感信息,有效提高數據庫中敏感數據的安全性。
前提條件
RDS PostgreSQL實例需滿足以下要求:
實例大版本為PostgreSQL 10或以上版本。
存儲類型為云盤。
實例內核小版本為20221030或以上。查看內核小版本請參見升級內核小版本。
如果包含只讀實例,只讀實例也需滿足以上條件。
說明如需升級內核小版本,請參見升級內核小版本。
已使用阿里云主賬號授權RDS訪問密鑰管理服務KMS(Key Management Service)。詳情請參見授權RDS訪問KMS。
已開通密鑰管理服務KMS(Key Management Service)。如果您未開通KMS,可在開通TDE過程中根據引導開通KMS。
注意事項
如果包含只讀實例,請確保主實例和只讀實例內核小版本均升級到20221030以上,否則開通TDE加密會失敗。
TDE開通過程中會重啟實例造成實例切換,請做好業務安排,謹慎操作。實例切換的影響請參見實例切換的影響。
TDE開通后無法關閉。
開通TDE后,如果是I/O密集型(I/O bound)場景,可能會對數據庫性能產生一定影響。
TDE實例不支持用戶通過物理流復制自建備庫。
如果密鑰管理服務KMS欠費,將會導致云盤無法解密,整個實例不可用,請確保KMS狀態正常。
使用已有自定義密鑰時,需要注意:
禁用或刪除了KMS的自定義密鑰,將會造成RDS實例無法正常工作,受影響的操作包括:創建快照、恢復快照和備庫重建等。
撤銷授權關系后,重啟RDS實例會導致RDS實例不可用。
需要使用主賬號或者具有AliyunSTSAssumeRoleAccess權限的賬號。
說明關于密鑰的相關操作請參見密鑰管理服務。
開通TDE加密
訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側導航欄單擊數據安全性。
在TDE頁簽單擊未開通左邊的滑塊。
選擇密鑰類型,單擊確定,開通TDE。
使用由阿里云自動生成的密鑰:該方式使用的加密密鑰(KEK)為KMS的服務密鑰。
使用已有自定義密鑰:該方式使用的加密密鑰(KEK)為您上傳至KMS的自定義密鑰(CMK)。如果沒有自定義密鑰,需要單擊前往創建,在密鑰管理服務控制臺創建密鑰并導入自帶的密鑰材料。詳情請參見創建密鑰。
說明加密原理請參見TDE加密解密原理。
(可選)更換密鑰。
在TDE頁簽單擊TDE狀態右側的更換密鑰。
選擇使用由阿里云自動生成的密鑰或使用已有自定義密鑰,選擇密鑰,單擊確定。
使用TDE對表或索引進行加密或解密
實例級別開啟了TDE之后,您還需要對RDS PostgreSQL的表進行表級別的TDE加密解密操作。
加密和解密會帶來性能損耗,請合理控制加密范圍以減少性能損耗。
加密
全局設置
您可以在RDS控制臺設置參數rds_default_table_encryption為ON,當開啟此參數后,新建的表(CREATE TABLE)、索引(CREATE INDEX)將會默認加密。
指定表、索引加密
表加密。
-- 創建加密表 CREATE TABLE <tablename> WITH (encryption=on); -- 修改表為加密類型 ALTER TABLE <tablename> SET (encryption=on);
索引加密。
-- 創建加密索引 CREATE INDEX <indexname> ... WITH (encryption=on); -- 修改索引為加密類型 ALTER INDEX <indexname> SET (encryption=on);
說明支持6種索引的加密:btree、hash、spgist、gin、gist和brin。
解密
以下ALTER語句會觸發表或索引的重寫,類似VACUUM FULL,請勿在業務高峰期執行。
解密加密表。
ALTER TABLE <tablename> SET (encryption=off);
解密加密索引。
ALTER INDEX <indexname> SET(encryption=off);
查看表或索引的加密狀態
SELECT relname, reloptions FROM pg_class WHERE relname IN ('<tablename>', '<indexname>');
常見問題
開啟TDE后,常用數據庫工具(pgAdmin等)還能正常使用嗎?
可以正常使用。
開啟TDE后,還能正常遷移數據到其他RDS實例嗎?
可以正常遷移。
加密后查看數據為什么還是明文的?
查詢數據時會解密并讀取到內存,所以是明文顯示。開啟TDE可以防止備份泄露導致數據泄露,備份文件是加密的,無法用于恢復到本地,如果要恢復數據到本地,需要先解密數據。