備份加密是利用備份工具(Xtrabackup)的加密能力對RDS MySQL實例備份進行加密,開發人員無需更改任何應用程序。如果需要使用加密的備份,需要先下載備份,然后在解壓縮時進行解密。
前提條件
RDS MySQL實例需滿足如下要求:
大版本:8.0、5.7、5.6
系列:高可用系列
存儲類型:本地SSD盤
背景信息
加密使用的密鑰由密鑰管理服務(KMS)產生和管理,RDS不提供加密所需的密鑰和證書。您不僅可以使用阿里云自動生成的密鑰,也可以使用自定義密鑰。
如果您需要使用自定義密鑰進行備份加密,首先需要創建一個服務關聯角色,RDS服務通過該角色獲取KMS密鑰列表、密鑰屬性以及別名后,才能在控制臺給您展示加密密鑰列表,并且在備份加密之后展示加密的相關信息。
開通加密服務的操作中,RDS服務會標記您選擇的密鑰,然后備份系統通過服務關聯角色使用密鑰進行備份加密。
注意事項
備份加密功能開通后不可關閉。
備份加密開通后無法修改密鑰。
備份加密開通后新增的備份才會加密,存量備份不會加密。
備份加密開通后,您如果要恢復數據到本地,請在下載后解密數據。
說明在控制臺使用備份直接恢復數據,不需要您手動解密,后端會自動解密后執行恢復操作。
使用已有自定義密鑰時,需要注意:
禁用密鑰、設置密鑰刪除計劃或者刪除密鑰材料都會造成密鑰不可用,從而使基于該密鑰加密備份的實例運維操作失敗,可能會影響實例的可用性。基于該加密備份的恢復操作也會失敗。
需要使用阿里云主賬號或者具有如下權限的RAM賬號(子賬號):
{ "Version": "1", "Statement": [ { "Action": [ "ram:CreateServiceLinkedRole" ], "Resource": "*", "Effect": "Allow", "Condition": { "StringEquals": { "ram:ServiceName": "backupencryption.rds.aliyuncs.com" } } }, { "Action": [ "kms:ListResourceTags", "kms:TagResource" ], "Effect": "Allow", "Resource": [ "acs:kms:*:*:*" ] } ] }
說明您可以在訪問控制控制臺配置權限并授權賬號,詳情請參見RAM授權訪問RDS實例。
開通備份加密
- 訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側導航欄中單擊備份恢復。
在備份恢復頁面中選擇備份策略頁簽。
單擊備份加密設置區域后的編輯,開啟備份加密狀態。
在備份加密設置對話框中,選擇備份主密鑰,然后單擊確定。
使用阿里云自動生成的密鑰
阿里云自動生成密鑰供您使用。
使用已有自定義密鑰
選擇密鑰管理服務(KMS)中已創建的密鑰。如還未創建,請參見創建密鑰。
說明首次使用自定義密鑰需要授權,您可以根據頁面提示進行操作。
開通成功后,您的備份就會被加密,在阿里云上使用備份時不需要您手動解密,后端會自動解密后執行相關操作(例如恢復數據),但是如果下載加密的備份到本地,您需要手動解密才能使用備份。解密數據,請參見解密數據。
解密數據
本文以Ubuntu 16.04系統為例,演示解密數據的全過程。
前提條件
系統中已安裝Percona XtraBackup。如未安裝,請參見Percona XtraBackup 2.4(MySQL 5.7、5.6或5.5實例)或Percona XtraBackup 8.0(MySQL 8.0實例)。
系統中已安裝qpress解壓工具。如未安裝,請執行下列命令安裝。
wget "http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/183466/cn_zh/1608011575185/qpress-11-linux-x64.tar" tar xvf qpress-11-linux-x64.tar chmod 775 qpress cp qpress /usr/bin
Python大版本需為Python 3。
操作步驟
獲取RDS加密備份數據的密文和加密算法。
訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側導航欄中單擊備份恢復。
在備份恢復頁面中選擇
。單擊目標備份集操作列下的
,即可獲取加密備份數據的密文和加密算法。
調用Decrypt接口,在CiphertextBlob參數中傳入步驟1中獲取的密文,獲取base64編碼的二進制串Plaintext。
通過base64對Plaintext進行解碼,并將各個二進制轉換為對應的十六進制獲取解密密碼。本文通過Python(版本為Python 3)代碼實現這一操作。
在命令行中執行
vi decrypt.py
打開vi編輯器。按下鍵盤上的
i
鍵開啟編輯模式,輸入如下內容后按下ESC
鍵,輸入:wq
保存并退出。import base64 import binascii plaintext = 'S14dTbl6i4Qo**********' # 單引號('')中輸入上一步驟中獲取的Plaintext。 password = binascii.b2a_hex(base64.b64decode(plaintext)) # 獲取解密密碼并將密碼賦值給password。 print(str(password, 'utf-8')) # 以字符串的形式將密碼打印在屏幕上。
在命令行中執行
python decrypt.py
命令后,屏幕上會打印出解密密碼。示例如下:4b5e1d4db97a********************
下載加密備份數據并解密該數據。
在命令行中執行如下命令創建一個目錄(例如
/home/mysql/data
)用來存放備份數據。mkdir /home/mysql/data
解壓壓縮包。根據壓縮包的后綴選擇解壓命令。
備份文件類型
解壓命令
tar 壓縮包 (.tar.gz 后綴)
tar -izxvf test1.tar.gz -C /home/mysql/data
xbstream 壓縮包 (.xb.gz 后綴)
gzip -d -c test1.xb.gz | xbstream -x -v -C /home/mysql/data
xbstream 文件包(_qp.xb 后綴)
## 先解包 cat test1_qp.xb | xbstream -x -v -C /home/mysql/data ## 然后解壓 ### 對于MySQL 5.6/5.7 innobackupex --decompress --remove-original /home/mysql/data ### 對于MySQL 8.0 xtrabackup --decompress --remove-original --target-dir=/home/mysql/data
xbstream qpress壓縮包(_xb.qp后綴)
qpress -do test1_xb.qp | xbstream -x -v -C /home/mysql/data
解壓后會發現,基本上所有數據的后綴都為
.xbcrypt
,表示數據被加密。在命令行中執行如下命令解密數據。
xtrabackup --decompress --remove-original --decrypt=AES256 --encrypt-key=4b5e1d4db97a******************** --target-dir=/home/mysql/data
執行后,數據的
.xbcrypt
后綴消失,數據解密成功。