

# 轮换 RDS Custom for Oracle 凭证以遵循合规性计划
<a name="custom-security.cred-rotation"></a>

一些合规性计划要求定期更改数据库用户凭证，例如每 90 天更改一次。RDS Custom for Oracle 会自动轮换某些预定义数据库用户的凭证。

**Topics**
+ [自动轮换预定义用户的凭证](#custom-security.cred-rotation.auto)
+ [轮换用户凭证的指南](#custom-security.cred-rotation.guidelines)
+ [手动轮换用户凭证](#custom-security.cred-rotation.manual)

## 自动轮换预定义用户的凭证
<a name="custom-security.cred-rotation.auto"></a>

如果 RDS Custom for Oracle 数据库实例托管在 Amazon RDS 中，则以下预定义 Oracle 用户的凭证每 30 天自动轮换一次。之前用户的凭证位于 Amazon Secrets Manager 中。


| 数据库用户 | 创建者 | 支持的引擎版本 | 备注 | 
| --- | --- | --- | --- | 
|  `SYS`  |  Oracle  |  custom-oracle-ee custom-oracle-ee-cdb custom-oracle-se2 custom-oracle-se2-cdb  |  | 
|  `SYSTEM`  |  Oracle  |  custom-oracle-ee custom-oracle-ee-cdb custom-oracle-se2 custom-oracle-se2-cdb  |  | 
|  `RDSADMIN`  |  RDS  |  custom-oracle-ee custom-oracle-se2  |  | 
|  `C##RDSADMIN`  |  RDS  |  custom-oracle-ee-cdb custom-oracle-se2-cdb  | 带有 C\$1\$1 前缀的用户名仅存在于 CDB 中。有关 CDB 的更多信息，请参阅 [Amazon RDS Custom for Oracle 架构概述](https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/custom-creating.html#custom-creating.overview)。 | 
|  `RDS_DATAGUARD`  |  RDS  |  custom-oracle-ee  | 此用户仅存在于只读副本、只读副本的源数据库以及您已使用 Oracle Data Guard 物理迁移到 RDS Custom 的数据库中。 | 
|  `C##RDS_DATAGUARD`  |  RDS  |  custom-oracle-ee-cdb  | 此用户仅存在于只读副本、只读副本的源数据库以及您已使用 Oracle Data Guard 物理迁移到 RDS Custom 的数据库中。带有 C\$1\$1 前缀的用户名仅存在于 CDB 中。有关 CDB 的更多信息，请参阅 [Amazon RDS Custom for Oracle 架构概述](https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/custom-creating.html#custom-creating.overview)。 | 

自动凭证轮换的一个例外是您手动配置为备用数据库的 RDS Custom for Oracle 数据库实例。RDS 仅轮换您已使用 `create-db-instance-read-replica` CLI 命令或 `CreateDBInstanceReadReplica` API 创建的只读副本的凭证。

## 轮换用户凭证的指南
<a name="custom-security.cred-rotation.guidelines"></a>

为确保您的凭证根据您的合规性计划进行轮换，请注意以下指南：
+ 如果您的数据库实例自动轮换凭证，请不要手动更改或删除[预定义 Oracle 用户](#auto-rotation)中列出的用户的密钥、密码文件或密码。否则，RDS Custom 可能会将您的数据库实例置于支持边界之外，这会暂停自动轮换。
+ RDS 主用户不是预定义的，因此您负责手动更改密码或在 Secrets Manager 中设置自动轮换。有关更多信息，请参阅[轮换 Amazon Secrets Manager 密钥](https://docs.amazonaws.cn/secretsmanager/latest/userguide/rotating-secrets.html)。

## 手动轮换用户凭证
<a name="custom-security.cred-rotation.manual"></a>

对于以下类别的数据库，RDS 不会自动轮换在[预定义 Oracle 用户](#auto-rotation)中列出的用户的凭证：
+ 您手动配置为用作备用数据库的数据库。
+ 本地数据库。
+ 位于支持边界之外或处于 RDS Custom 自动化无法运行的状态的数据库实例。在这种情况下，RDS Custom 也不会轮换密钥。

如果您的数据库属于上述任何类别，则必须手动轮换用户凭证。

**手动轮换数据库实例的用户凭证**

1. 登录 Amazon Web Services 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.amazonaws.cn/rds/)。

1. 在**数据库**中，确保 RDS 当前未备份您的数据库实例或执行配置高可用性等操作。

1. 在数据库详细信息页面中，选择**配置**并记下数据库实例的资源 ID。或者，您可以使用 Amazon CLI 命令 `describe-db-instances`。

1. 通过 [https://console.aws.amazon.com/secretsmanager/](https://console.amazonaws.cn/secretsmanager/) 打开 Secrets Manager 控制台。

1. 在搜索框中，输入数据库的资源 ID，然后使用以下任一命名约定搜索密钥：

   ```
   do-not-delete-rds-custom-resource_id-uuid
   rds-custom!oracle-do-not-delete-resource_id-uuid
   ```

   此密钥存储 `RDSADMIN`、`SYS` 和 `SYSTEM` 的密码。以下示例密钥适用于资源 ID 为 `db-ABCDEFG12HIJKLNMNOPQRS3TUVWX` 和 UUID 为 `123456` 的数据库实例：

   ```
   do-not-delete-rds-custom-db-ABCDEFG12HIJKLNMNOPQRS3TUVWX-123456
   rds-custom!oracle-do-not-delete-db-ABCDEFG12HIJKLNMNOPQRS3TUVWX-123456
   ```
**重要**  
如果您的数据库实例是只读副本并使用 `custom-oracle-ee-cdb` 引擎，则存在两个带有后缀 `db-resource_id-uuid` 的密钥，一个用于主用户，另一个用于 `RDSADMIN`、`SYS` 和 `SYSTEM`。要找到正确的密钥，请在主机上运行以下命令：  

   ```
   cat /opt/aws/rdscustomagent/config/database_metadata.json | python3 -c "import sys,json; print(json.load(sys.stdin)['dbMonitoringUserPassword'])"
   ```
`dbMonitoringUserPassword` 属性表示 `RDSADMIN`、`SYS` 和 `SYSTEM` 的密钥。

1. 如果您的数据库实例存在于 Oracle Data Guard 配置中，请使用以下任一命名约定搜索密钥：

   ```
   do-not-delete-rds-custom-resource_id-uuid-dg
   rds-custom!oracle-do-not-delete-resource_id-uuid-dg
   ```

   此密钥存储了 `RDS_DATAGUARD` 的密码。以下示例密钥适用于数据库资源 ID 为 `db-ABCDEFG12HIJKLNMNOPQRS3TUVWX` 和 UUID 为 **789012** 的数据库实例：

   ```
   do-not-delete-rds-custom-db-ABCDEFG12HIJKLNMNOPQRS3TUVWX-789012-dg
   rds-custom!oracle-do-not-delete-db-ABCDEFG12HIJKLNMNOPQRS3TUVWX-789012-dg
   ```

1. 对于[预定义 Oracle 用户](#auto-rotation)中列出的所有数据库用户，按照[修改 Amazon Secrets Manager 密钥](https://docs.amazonaws.cn/secretsmanager/latest/userguide/manage_update-secret.html)中的说明更新密码。

1. 如果您的数据库是独立数据库或 Oracle Data Guard 配置中的源数据库：

   1. 启动 Oracle SQL 客户端并以 `SYS` 身份登录。

   1. 为[预定义 Oracle 用户](#auto-rotation)中列出的每个数据库用户运行以下形式的 SQL 语句：

      ```
      ALTER USER user-name IDENTIFIED BY pwd-from-secrets-manager ACCOUNT UNLOCK;
      ```

      例如，如果存储在 Secrets Manager 中的 `RDSADMIN` 的新密码为 `pwd-123`，请运行以下语句：

      ```
      ALTER USER RDSADMIN IDENTIFIED BY pwd-123 ACCOUNT UNLOCK;
      ```

1. 如果您的数据库实例运行 Oracle Database 12c 版本 1（12.1）并由 Oracle Data Guard 管理，请手动将密码文件（`orapw`）从主数据库实例复制到每个备用数据库实例。

   如果您的数据库实例托管在 Amazon RDS 中，则密码文件位置为 `/rdsdbdata/config/orapw`。对于不在 Amazon RDS 中托管的数据库，在 Linux 和 UNIX 上的原定设置位置为 `$ORACLE_HOME/dbs/orapw$ORACLE_SID`，在 Windows 上的原定设置位置为 `%ORACLE_HOME%\database\PWD%ORACLE_SID%.ora`。