如何从本地环境还原 RDS for SQL Server 中的加密备份文件或加密的 Microsoft Azure 备份?

上次更新日期:2022 年 10 月 14 日

我想在本地环境和适用于 Microsoft SQL Server 实例的 Amazon Relational Database Service(Amazon RDS)之间还原加密备份文件或加密的 Microsoft Azure 备份。如何使用本机备份和还原功能来完成这项操作?

简短描述

SQL Server 2014(12.x)及更高版本中提供备份加密功能。创建备份时,您可以指定加密算法和加密器(证书或非对称密钥)。这将创建一个加密的备份文件。

注意:此功能与 TDE 加密不同。

解决方法

加密备份

注意:在开始执行以下解决步骤之前,请确保您已经创建了以下资源:

  • 一个 Amazon Simple Storage Service(Amazon S3)桶。
  • 一个在选项组中配置了 TDE 和 SQLSERVER_BACKUP_RESTORE 的 Amazon RDS 实例。

1.    在您的本地账户中使用以下脚本创建一个主密钥

USE Master;
GO
CREATE MASTER KEY ENCRYPTION
BY PASSWORD='InsertStrongPasswordHere';
GO

2.    在您的本地账户中创建一个受主密钥保护的证书

CREATE CERTIFICATE TDE_Cert
WITH 
SUBJECT='Database_Encryption';
GO

3.    使用以下脚本开始本机备份。

注意:启用压缩功能可避免在还原到 RDS 时出现问题。

BACKUP DATABASE [TestDB] TO DISK =N'E:\Backup\EncryptedBackupFromOnpremise.bak' WITH COMPRESSION,
ENCRYPTION( ALGORITHM = AES_256, SERVER CERTIFICATE = [TDE_Cert] ), STATS = 10
GO

4.    使用 AWS 管理控制台将加密的备份上传到 S3 桶 tde-db

5.    运行以下命令还原数据库:

exec msdb.dbo.rds_restore_database 
@restore_db_name='onpremdb',
@s3_arn_to_restore_from='arn:aws:s3:::tde-db/EncryptedBackupFromOnpremise.bak';

加密的 Microsoft Azure 备份

注意:此解决方案涉及的步骤与前面各节相似。但是,加密备份在 Microsoft Azure 备份容器启动,而不是在本地存储中。在开始执行以下解决步骤之前,请确保您已经创建了以下资源:

  • 一个 Amazon Simple Storage Service(Amazon S3)桶。
  • 一个配置了 TDE 和 SQLSERVER_BACKUP_RESTORE 选项组的 RDS 实例。
  • 一个配置了用于加密备份的证书的本地账户。
  • 一个活跃的 Microsoft Azure 账户。

1.    在 Microsoft Azure 中创建一个存储账户。有关更多信息,请参阅 Microsoft 文档网站中的创建存储账户

2.    根据共享访问签名创建凭证。有关更多信息,请参阅 Microsoft 文档网站中的为存储容器创建 SAS 令牌

USE master  
CREATE CREDENTIAL [https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>] 
  -- this name must match the container path, start with https and must not contain a forward slash at the end
WITH IDENTITY='SHARED ACCESS SIGNATURE' 
  -- this is a mandatory string and should not be changed   
 , SECRET = 'sharedaccesssignature'
GO

3.    开始对 Microsoft Azure 存储进行本机加密备份:

BACKUP DATABASE [TestDB] TO  URL = N'https://backuptestsanketh.blob.core.windows.net/backup/TestDB_backup_2022_09_29_112330.bak' 
WITH  COPY_ONLY, NOFORMAT, NOINIT,  NAME = N'BackupEnc-Full Database Backup', NOSKIP, NOREWIND, NOUNLOAD, COMPRESSION, 
ENCRYPTION(ALGORITHM = AES_128, SERVER CERTIFICATE = [On_PremTDE_Cert]),  STATS = 10
GO

注意:Amazon RDS 不支持直接从 Microsoft Azure 存储容器还原备份。因此,您必须将备份下载到中间系统。

4.    将备份文件上传到 S3 桶(tde-db)。

5.    要对私钥和证书进行备份并还原到 RDS 实例,请按照解决“Cannot find server certificate with thumbprint(找不到带指纹的服务器证书)”错误部分中的步骤进行操作。

6.     满足先决条件后,运行以下命令还原加密备份:

exec msdb.dbo.rds_restore_database
@restore_db_name='AzureBackupEncrypted',
@s3_arn_to_restore_from='arn:aws:s3:::tde-db/backup/azure-encrypted.bak'

解决“Cannot find server certificate with thumbprint(找不到带指纹的服务器证书)”错误

在另一个未配置证书的环境中还原加密备份会导致以下错误:

Cannot find server certificate with thumbprint '0xBA01F2AF71C3FB4A92C5F69BDE3EC8DB318D7D0E'

要避免上述错误,请执行以下操作:

1.    在您要执行本机恢复的 AWS 账户中创建一个新的 AWS Key Management Service(AWS KMS)密钥

2.    生成 AWS KMS 数据密钥以启动证书备份:

aws kms generate-data-key --key-id KMS-Key-ID --key-spec AES_256 --region us-west-2

以下是前述命令的示例输出:

{
"Plaintext": "Gve+VE1JV8aufhDkPKeWceEt+vZaTYZCH25/OLPo+a4=", 
"KeyId": "arn:aws:kms:us-west-2:289799745972:key/eee4d613-4871-4cee-87d8-a54ad8d5251b", 
"CiphertextBlob": "AQIDAHiojOaIcTtQGK4gqEf6QcYuVUutMiW0y52tG63GqOknSgF0ZtnfmfqadzhfWUlRSx15AAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM/U3+BkE/yN5Jf0ckAgEQgDtoG9coTwG7bnPGx3c4hND8LAc4LEPnxd2BLQdJDOjqXU0LgudNfVUw4xNfWy2XCDgmSYV0nHU9EVbwkQ=="
}

3.    开始备份源实例(本地实例或 EC2 实例)中的证书和私钥:

use master 
BACKUP CERTIFICATE TDE_Cert TO
FILE= 'C:\Program Files\Microsoft SQL Server\MSSQL15.SQL2019\MSSQL\DATA\certificatename.cer'
WITH PRIVATE KEY (
FILE= 'C:\Program Files\Microsoft SQL Server\MSSQL15.SQL2019\MSSQL\DATA\privatekey.pvk',
ENCRYPTION BY PASSWORD='Gve+VE1JV8aufhDkPKeWceEt+vZaTYZCH25/OLPo+a4=')

4.    将备份证书文件上传到 S3 桶 tde-bkt

5.    将私钥文件上传到 S3 桶 tde-bkt。上传后,编辑私钥文件的元数据,然后指定以下值:

  • 键:x-amz-meta-rds-tde-pwd
  • 值:在步骤 2 中获得的 CipertexBlob。

6.    还原 RDS 实例中的证书:

exec
msdb.dbo.rds_restore_tde_certificate
@certificate_name='UserTDECertificate_ec2_tde_cert',
@certificate_file_s3_arn='arn:aws:s3:::tde-bkt/certificatename.cer',
@private_key_file_s3_arn='arn:aws:s3:::tde-bkt/privatekey.pvk',
@kms_password_key_arn='arn:aws:kms:us-west-2:aws-account-id:key/key-id';

7.    运行以下命令还原数据库:

exec msdb.dbo.rds_restore_database 
@restore_db_name='onpremdb',
@s3_arn_to_restore_from='arn:aws:s3:::tde-db/EncryptedBackupFromOnpremise.bak';