如何解密从S3下载的经AWS KMS双重加密的RDS备份文件?
解决方案
核心思路
由于备份文件存在两层加密:存储过程指定KMS密钥的文件级加密 + S3桶默认KMS的对象级加密,本地环境无法直接访问AWS KMS密钥,因此必须先在AWS环境内解除文件级的加密层,再将未加密的备份文件下载到本地恢复。
方案一:通过RDS实例解密并重传备份
- 将S3上的加密备份文件下载到RDS实例本地存储
执行RDS存储过程,把目标事务日志文件从S3拉取到RDS实例的指定路径:EXEC msdb.dbo.rds_download_from_s3 @s3_arn_of_file = 'arn:aws:s3:::your-bucket-name/path/to/transaction-log.trn', @filepath_in_rds = 'D:\RDSBackup\transaction-log.trn', @overwrite_file = 1; - 在RDS内验证并解密文件
执行MSSQL命令验证备份(RDS会自动使用指定的KMS密钥解密文件级加密):RESTORE VERIFYONLY FROM DISK = 'D:\RDSBackup\transaction-log.trn'; - 生成未加密的备份并上传回S3
创建临时数据库(或直接针对原库)生成未加密的事务日志备份,再上传到S3:-- 生成未加密的事务日志备份 BACKUP LOG YourDatabaseName TO DISK = 'D:\RDSBackup\unencrypted-trn.trn' WITH NO_ENCRYPTION; -- 上传到S3 EXEC msdb.dbo.rds_tlog_backup_copy_to_S3 @source_db_name = 'YourDatabaseName', @s3_arn_to_backup_to = 'arn:aws:s3:::your-bucket-name/path/to/unencrypted-trn.trn', @overwrite_S3_backup_file = 1; - 下载未加密文件到本地
此时S3上的文件仅保留S3桶默认的KMS加密,下载时(通过有解密权限的IAM身份)会自动解除S3层加密,得到未加密的事务日志文件,可直接在本地MSSQL环境恢复。
方案二:通过EC2实例解密备份
准备EC2环境
启动一台具备以下权限的EC2实例:- S3
GetObject权限(可访问目标备份文件) - KMS
Decrypt权限(针对存储过程加密时使用的KMS密钥)
安装MSSQL Server或MSSQL命令行工具(如sqlcmd)。
- S3
下载S3文件到EC2
使用AWS CLI下载目标文件,S3层的加密会自动解密:aws s3 cp s3://your-bucket-name/path/to/transaction-log.trn /tmp/transaction-log.trn解密并生成未加密备份
使用sqlcmd连接本地MSSQL(或临时部署的MSSQL实例),执行解密并重新备份:-- 先创建临时数据库用于恢复日志(可选,若仅需导出未加密备份) CREATE DATABASE TempDBForDecrypt; -- 恢复日志到临时库(自动解密文件级加密) RESTORE LOG TempDBForDecrypt FROM DISK = '/tmp/transaction-log.trn' WITH NORECOVERY, DECRYPTION, KMS_KEY = 'arn:aws:kms:your-region:your-account-id:key/your-key-id'; -- 生成未加密的事务日志备份 BACKUP LOG TempDBForDecrypt TO DISK = '/tmp/unencrypted-trn.trn' WITH NO_ENCRYPTION;传输未加密文件到本地
将EC2上的/tmp/unencrypted-trn.trn文件通过SCP或其他方式下载到本地环境,直接用于恢复。
后续优化建议
若需避免后续出现双重加密问题,可调整备份策略:
- 取消存储过程中的
@kms_key_arn参数,仅依赖S3桶默认的SSE-KMS加密,这样备份文件仅存在一层加密,后续在AWS侧解密后即可直接下载使用。
内容的提问来源于stack exchange,提问作者Karikalan
相关产品推荐
相关产品推荐

