备份加密

更新时间:
复制 MD 格式

备份加密是利用备份工具(Xtrabackup)的加密能力对专属集群MyBase for MySQL实例的备份进行加密,以此来提高数据的安全性。

前提条件

  • 实例类型为如下之一:

    • MyBase MySQL 8.0高可用版(本地SSD盘)

    • MyBase MySQL 5.7高可用版(本地SSD盘)

  • 购买专属KMS实例。

背景信息

加密使用的密钥由密钥管理服务(KMS)产生和管理,MyBase不提供加密所需的密钥和证书。您不仅可以使用阿里云自动生成的密钥,也可以使用自定义密钥。

如果您需要使用自定义密钥进行备份加密,首先需要创建一个服务关联角色,MyBase服务通过该角色获取KMS密钥列表、密钥属性以及别名后,才能在控制台给您展示加密密钥列表,并且在备份加密之后展示加密的相关信息。

开通加密服务的操作中,MyBase服务会标记您选择的密钥,然后备份系统通过服务关联角色使用密钥进行备份加密。

注意事项

警告

备份加密功能开通后不可关闭。

  • 备份加密开通后无法修改密钥。

  • 备份加密开通后新增的备份才会加密,存量备份不会加密。

  • 备份加密开通后,您如果要恢复数据到本地,请在下载后解密数据。

    说明

    在控制台使用备份直接恢复数据,不需要您手动解密,后端会自动解密后执行恢复操作。

  • 使用已有自定义密钥时,需要注意:

    • 禁用密钥、设置密钥删除计划或者删除密钥材料都会造成密钥不可用,从而使基于该密钥加密备份的实例运维操作失败,可能会影响实例的可用性。基于该加密备份的恢复操作也会失败。

    • 需要使用主账号或者具有如下权限的子账号:

      {
          "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:*:*:*"
                  ]
              }
          ]
      }

开通备份加密

  1. 登录云数据库专属集群控制台。

  2. 在页面左上角,选择目标地域。

  3. 在左侧单击实例列表 > MySQL。

  4. 找到目标实例,单击操作列的详情。

  5. 在左侧导航栏中单击备份恢复。

  6. 单击备份设置页签,在备份加密设置区域,单击备份加密状态的开关。

    在备份加密设置区域中,备份加密状态开关默认为关闭状态,旁边标注未开通(开通后不可关闭)。

  7. 选择加密设置选项,然后单击确认。加密设置说明如下:

    • 使用阿里云自动生成的密钥

      阿里云自动生成密钥供您使用。

    • 使用已有自定义密钥

      首次使用自定义密钥需要授权,请根据页面提示进行授权操作。授权成功后,选择一个自定义密钥。如果没有可用的自定义密钥,单击前往创建,创建密钥。具体操作,请参见创建密钥。

    说明

    开通成功后,新生成的备份就会被加密,在阿里云上使用备份时不需要您手动解密,后端会自动解密后执行相关操作(例如恢复数据),但是如果下载加密的备份到本地,您需要手动解密才能使用。

解密数据

本文以Ubuntu 16.04系统为例,演示解密数据的全过程。

前提条件

操作步骤

  1. 获取加密备份数据的密文和加密算法。

    1. 登录云数据库专属集群控制台。

    2. 在页面左上角,选择目标地域。

    3. 在左侧单击实例列表 > MySQL。

    4. 找到目标实例,单击操作列的详情,然后在左侧导航栏中单击备份恢复。

    5. 单击目标备份集操作列下的1 > 查看加密信息,即可获取加密备份数据的密文和加密算法。

  2. 调用Decrypt接口,在CiphertextBlob参数中传入步骤1中获取的密文,获取base64编码的二进制串Plaintext。

    {
        "KeyId": "xxx",
        "KeyVersionId": "xxx",
        "Plaintext": "S14dTb16i4Qo",
        "RequestId": "7474865d-f1fc-49c8-bf4d-7323de86ce59"
    }
  3. 通过base64对Plaintext进行解码,并将各个二进制转换为对应的十六进制获取解密密码。本文通过Python(版本为Python 3)代码实现这一操作。

    1. 在命令行中执行vi decrypt.py打开vi编辑器。

    2. 按下键盘上的i键开启编辑模式,输入如下内容后按下ESC键,输入:wq保存并退出。

      import base64
      import binascii
      plaintext = 'S14dTbl6i4Qo**********'  # 单引号('')中输入上一步骤中获取的Plaintext。
      password = binascii.b2a_hex(base64.b64decode(plaintext))   # 获取解密密码并将密码赋值给password。
      print(str(password, 'utf-8'))   # 以字符串的形式将密码打印在屏幕上。
                    
    3. 在命令行中执行python decrypt.py命令后,屏幕上会打印出解密密码。示例如下:

      4b5e1d4db97a********************
  4. 下载加密备份数据并解密该数据。

    1. 下载备份数据到本地。

    2. 在命令行中执行如下命令创建一个目录(例如/home/mysql/data)用来存放备份数据。

      mkdir /home/mysql/data
    3. 解压压缩包。根据压缩包的后缀选择解压命令。

      备份文件类型

      解压命令

      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,表示数据被加密。

      backup-my.cnf.xbcrypt    testdb
      dbfortest                xtrabackup_binlog_info.xbcrypt
      ibdata1.xbcrypt          xtrabackup_checkpoints
      mysql                    xtrabackup_info.xbcrypt
      performance_schema       xtrabackup_logfile.xbcrypt
      rds_table_info_json_105244.log  xtrabackup_slave_filename_info.xbcrypt
      _recycle_bin_            xtrabackup_slave_info.xbcrypt
    4. 在命令行中执行如下命令解密数据。

      xtrabackup --decompress --remove-original --decrypt=AES256 --encrypt-key=4b5e1d4db97a******************** --target-dir=/home/mysql/data
      说明

      上述命令中的主要参数说明如下:

      • decrypt:步骤1中获取的加密算法,本示例中为AES256。

      • encrypt-key:步骤3中获取的解密密码。

      • target-dir:备份文件所在的目录。

      执行后,数据的.xbcrypt后缀消失,数据解密成功。

      backup-my.cnf            testdb
      dbfortest                xtrabackup_binlog_info
      ibdata1                  xtrabackup_checkpoints
      mysql                    xtrabackup_info
      performance_schema       xtrabackup_logfile
      rds_table_info_json_105244.log  xtrabackup_slave_filename_info
      _recycle_bin_            xtrabackup_slave_info