備份加密是利用備份工具(Xtrabackup)的加密能力對RDS MySQL執行個體備份進行加密,開發人員無需更改任何應用程式。如果需要使用加密的備份,需要先下載備份,然後在解壓縮時進行解密。
前提條件
RDS MySQL執行個體需滿足如下要求:
大版本:8.0、5.7、5.6
系列:高可用系列
儲存類型:本地SSD盤
背景資訊
加密使用的密鑰由Key Management Service(KMS)產生和管理,RDS不提供加密所需的密鑰和認證。您不僅可以使用阿里雲自動產生的密鑰,也可以使用自訂密鑰。
如果您需要使用自訂密鑰進行備份加密,首先需要建立一個服務關聯角色,RDS服務通過該角色擷取KMS密鑰列表、密鑰屬性以及別名後,才能在控制台給您展示加密金鑰列表,並且在備份加密之後展示加密的相關資訊。
開通Data Encryption Service的操作中,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。
在左側導覽列中單擊備份恢複。
在備份恢複頁面中選擇備份策略頁簽。
單擊備份加密設定地區後的編輯,開啟備份加密狀態。
在備份加密設定對話方塊中,選擇備份主要金鑰,然後單擊確定。
使用阿里雲自動產生的密鑰
阿里雲自動產生密鑰供您使用。
使用已有自訂密鑰
選擇Key Management Service(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
尾碼消失,資料解密成功。