

# 在 RDS for SQL Server 上备份和还原 TDE 证书
<a name="TDE.BackupRestoreRDS"></a>

RDS for SQL Server 提供了用于备份、还原和删除 TDE 证书的存储过程。RDS for SQL Server 还提供了用于查看已还原的用户 TDE 证书的功能。

用户 TDE 证书用于将数据库还原到 RDS for SQL Server，这些数据库位于本地并已开启 TDE。这些证书具有前缀 `UserTDECertificate_`。还原数据库之后，在使其可供使用之前，RDS 会修改已开启 TDE 的数据库以使用 RDS 生成的 TDE 证书。这些证书具有前缀 `RDSTDECertificate`。

用户 TDE 证书保留在 RDS for SQL Server 数据库实例上，除非您使用 `rds_drop_tde_certificate` 存储过程删除它们。有关更多信息，请参阅 [删除还原的 TDE 证书](#TDE.BackupRestoreRDS.Drop)。

您可以使用用户 TDE 证书从源数据库实例还原其他数据库。要还原的数据库必须使用相同的 TDE 证书并开启 TDE。您不必再次导入（还原）同一证书。

**Topics**
+ [先决条件](#TDE.BackupRestoreRDS.Prereqs)
+ [限制](#TDE.Limitations)
+ [备份 TDE 证书](#TDE.BackupRestoreRDS.Backup)
+ [还原 TDE 证书](#TDE.BackupRestoreRDS.Restore)
+ [查看还原的 TDE 证书](#TDE.BackupRestoreRDS.Show)
+ [删除还原的 TDE 证书](#TDE.BackupRestoreRDS.Drop)

## 先决条件
<a name="TDE.BackupRestoreRDS.Prereqs"></a>

在 RDS for SQL Server 上备份或还原 TDE 证书之前，请确保执行以下任务。[针对本机备份和还原进行设置](SQLServer.Procedural.Importing.Native.Enabling.md)中介绍了前三个任务。

1. 创建 Amazon S3 通用型存储桶或目录存储桶，以存储要备份和还原的文件。

   我们建议您使用单独的桶进行数据库备份和 TDE 证书备份。

1. 创建用于备份和还原文件的 IAM 角色。

   IAM 角色必须既是 AWS KMS key 的用户又是其管理员。

   使用目录存储桶时，除了针对目录存储桶[为本机备份和还原手动创建 IAM 角色](SQLServer.Procedural.Importing.Native.Enabling.md#SQLServer.Procedural.Importing.Native.Enabling.IAM)所需的权限外，不需要其他权限。

   在使用 S3 资源时，除了[为本机备份和还原手动创建 IAM 角色](SQLServer.Procedural.Importing.Native.Enabling.md#SQLServer.Procedural.Importing.Native.Enabling.IAM)所需的权限外，IAM 角色还需要以下权限：
   + 针对 S3 桶资源的 `s3:GetBucketAcl`、`s3:GetBucketLocation` 和 `s3:ListBucket`

1. 将 `SQLSERVER_BACKUP_RESTORE` 选项添加到数据库实例上的选项组。

   这是对 `TRANSPARENT_DATA_ENCRYPTION` (`TDE`) 选项的补充。

1. 请确保您有对称的加密 KMS 密钥。您有以下选项：
   + 如果您的账户中有现有的 KMS 密钥，则可以使用它。无需进一步操作。
   + 如果您的账户中没有对称的加密 KMS 密钥，请按照《AWS Key Management Service 开发人员指南》**中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)部分的说明创建一个 KMS 密钥。

1. 启用 Amazon S3 集成以在数据库实例和 Amazon S3 之间传输文件。

   有关启用 Amazon S3 集成的更多信息，请参阅[将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成](User.SQLServer.Options.S3-integration.md)。

   请注意，S3 集成不支持目录存储桶。此步骤仅对于[备份和还原本地数据库的 TDE 证书](TDE.BackupRestoreOnPrem.md)是必需的。

## 限制
<a name="TDE.Limitations"></a>

使用存储过程备份和还原 TDE 证书具有以下限制：
+ 必须将 `SQLSERVER_BACKUP_RESTORE` 和 `TRANSPARENT_DATA_ENCRYPTION` (`TDE`) 这两个选项添加到与数据库实例关联的数据库选项组。
+ 多可用区数据库实例不支持 TDE 证书备份和还原。
+ 不支持取消 TDE 证书备份和还原任务。
+ 您不能使用用户 TDE 证书对 RDS for SQL Server 数据库实例上的任何其他数据库进行 TDE 加密。您可以使用它从源数据库实例中仅还原已启用 TDE 并且使用相同 TDE 证书的其他数据库。
+ 您只能删除用户 TDE 证书。
+ RDS 上支持的最大用户 TDE 证书数量为 10 个。如果此数字超过 10，请删除未使用的 TDE 证书，然后重试。
+ 证书名称不能为空或为 null。
+ 还原证书时，证书名称不能包含 `RDSTDECERTIFICATE` 关键字，并且必须以 `UserTDECertificate_` 前缀开头。
+ `@certificate_name` 参数只能包含以下字符：a-z、0-9、@、\$1、\$1 和下划线 (\$1)。
+ `@certificate_file_s3_arn` 的文件扩展名必须为 .cer（不区分大小写）。
+ `@private_key_file_s3_arn` 的文件扩展名必须为 .pvk（不区分大小写）。
+ 私有密钥文件的 S3 元数据必须包括 `x-amz-meta-rds-tde-pwd` 标签。有关更多信息，请参阅 [备份和还原本地数据库的 TDE 证书](TDE.BackupRestoreOnPrem.md)。
+ RDS for SQL Server 不支持在 TDE 中使用跨账户密钥。

## 备份 TDE 证书
<a name="TDE.BackupRestoreRDS.Backup"></a>

要备份 TDE 证书，请使用 `rds_backup_tde_certificate` 存储过程。它具有以下语法。

```
EXECUTE msdb.dbo.rds_backup_tde_certificate
    @certificate_name='UserTDECertificate_certificate_name | RDSTDECertificatetimestamp',
    @certificate_file_s3_arn='arn:aws:s3:::bucket_name/certificate_file_name.cer',
    @private_key_file_s3_arn='arn:aws:s3:::bucket_name/key_file_name.pvk',
    @kms_password_key_arn='arn:aws:kms:region:account-id:key/key-id',
    [@overwrite_s3_files=0|1];
```

以下参数为必需参数：
+ `@certificate_name` – 要备份的 TDE 证书的名称。
+ `@certificate_file_s3_arn` – Amazon S3 中证书备份文件的目标 Amazon 资源名称 (ARN)。
+ `@private_key_file_s3_arn` – 保护 TDE 证书的私有密钥文件的目标 S3 ARN。
+ `@kms_password_key_arn` – 用于加密私有密钥密码的对称 KMS 密钥的 ARN。

以下参数为可选参数：
+ `@overwrite_s3_files` – 指示是否覆盖 S3 中的现有证书和私有密钥文件：
  + `0` – 不覆盖现有文件。此值是默认值。

    如果文件已存在，则将 `@overwrite_s3_files` 设置为 0 会返回错误。
  + `1` – 覆盖具有指定名称的现有文件，即使该文件不是备份文件也是如此。

**Example 备份 TDE 证书**  

```
EXECUTE msdb.dbo.rds_backup_tde_certificate
    @certificate_name='RDSTDECertificate20211115T185333',
    @certificate_file_s3_arn='arn:aws:s3:::TDE_certs/mycertfile.cer',
    @private_key_file_s3_arn='arn:aws:s3:::TDE_certs/mykeyfile.pvk',
    @kms_password_key_arn='arn:aws:kms:us-west-2:123456789012:key/AKIAIOSFODNN7EXAMPLE',
    @overwrite_s3_files=1;
```

## 还原 TDE 证书
<a name="TDE.BackupRestoreRDS.Restore"></a>

可以使用 `rds_restore_tde_certificate` 存储过程来还原（导入）用户 TDE 证书。它具有以下语法。

```
EXECUTE msdb.dbo.rds_restore_tde_certificate
    @certificate_name='UserTDECertificate_certificate_name',
    @certificate_file_s3_arn='arn:aws:s3:::bucket_name/certificate_file_name.cer',
    @private_key_file_s3_arn='arn:aws:s3:::bucket_name/key_file_name.pvk',
    @kms_password_key_arn='arn:aws:kms:region:account-id:key/key-id';
```

以下参数为必需参数：
+ `@certificate_name` –要还原的 TDE 证书的名称。名称必须以 `UserTDECertificate_` 前缀开头。
+ `@certificate_file_s3_arn` – 用于还原 TDE 证书的备份文件的 S3 ARN。
+ `@private_key_file_s3_arn` – 要还原的 TDE 证书的私有密钥备份文件的 S3 ARN。
+ `@kms_password_key_arn` – 用于加密私有密钥密码的对称 KMS 密钥的 ARN。

**Example 还原 TDE 证书**  

```
EXECUTE msdb.dbo.rds_restore_tde_certificate
    @certificate_name='UserTDECertificate_myTDEcertificate',
    @certificate_file_s3_arn='arn:aws:s3:::TDE_certs/mycertfile.cer',
    @private_key_file_s3_arn='arn:aws:s3:::TDE_certs/mykeyfile.pvk',
    @kms_password_key_arn='arn:aws:kms:us-west-2:123456789012:key/AKIAIOSFODNN7EXAMPLE';
```

## 查看还原的 TDE 证书
<a name="TDE.BackupRestoreRDS.Show"></a>

可以使用 `rds_fn_list_user_tde_certificates` 函数来查看已还原（导入）的用户 TDE 证书。它具有以下语法。

```
SELECT * FROM msdb.dbo.rds_fn_list_user_tde_certificates();
```

输出与以下内容类似。此处并未显示所有列。


|  |  |  |  |  |  |  |  |  |  |  | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| name | certificate\$1id | principal\$1id | pvt\$1key\$1encryption\$1type\$1desc | issuer\$1name | cert\$1serial\$1number | thumbprint | subject | start\$1date | expiry\$1date | pvt\$1key\$1last\$1backup\$1date | 
| UserTDECertificate\$1tde\$1cert | 343 | 1 | ENCRYPTED\$1BY\$1MASTER\$1KEY | AnyCompany Shipping | 79 3e 57 a3 69 fd 1d 9e 47 2c 32 67 1d 9c ca af | 0x6BB218B34110388680B FE1BA2D86C695096485B5 | AnyCompany Shipping | 2022-04-05 19:49:45.0000000 | 2023-04-05 19:49:45.0000000 | NULL | 

## 删除还原的 TDE 证书
<a name="TDE.BackupRestoreRDS.Drop"></a>

要删除您未使用的已还原（导入）的用户 TDE 证书，请使用 `rds_drop_tde_certificate` 存储过程。它具有以下语法。

```
EXECUTE msdb.dbo.rds_drop_tde_certificate @certificate_name='UserTDECertificate_certificate_name';
```

以下参数是必需参数：
+ `@certificate_name` – 要删除的 TDE 证书的名称。

您只能删除已还原（导入）的 TDE 证书。您不能删除 RDS 创建的证书。

**Example 删除 TDE 证书**  

```
EXECUTE msdb.dbo.rds_drop_tde_certificate @certificate_name='UserTDECertificate_myTDEcertificate';
```