备份加密是利用备份工具(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
后缀消失,数据解密成功。