

# Amazon RDS Custom 中的安全性
<a name="custom-security"></a>

自行熟悉 RDS Custom 的安全注意事项。

有关 RDS Custom 的安全性的更多信息，请参阅以下主题。
+ [保护 Amazon S3 桶免受混淆代理人问题影响](custom-security.confused-deputy.md)
+ [轮换 RDS Custom for Oracle 凭证以遵循合规性计划](custom-security.cred-rotation.md)

## RDS Custom 如何代表您安全地管理任务
<a name="custom-security.security-tools"></a>

RDS Custom 使用以下工具和方法来代表您安全地运行操作：

**AWSServiceRoleForRDSCustom 服务相关角色**  
*服务相关角色*是由服务预定义的，包含该服务代表您调用其他 AWS 服务所需的所有权限。对于 RDS Custom，`AWSServiceRoleForRDSCustom` 是根据最低权限原则定义的服务相关角色。RDS Custom 使用 `AmazonRDSCustomServiceRolePolicy` 中的权限（即附加到此角色的策略）来执行大多数预置和所有脱离主机的管理任务。有关更多信息，请参阅 [AmazonRDSCustomServiceRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSCustomServiceRolePolicy.html)。  
在主机上执行任务时，RDS Custom 自动化通过 AWS Systems Manager 使用来自服务相关角色的凭证来运行命令。您可以通过 Systems Manager 命令历史记录和 AWS CloudTrail 来审计命令历史记录。Systems Manager 使用您的网络设置连接到您的 RDS Custom 数据库实例。有关更多信息，请参阅 [步骤 4：为 RDS Custom for Oracle 配置 IAM](custom-setup-orcl.md#custom-setup-orcl.iam-vpc)。

**临时 IAM 凭证**  
在预置或删除资源时，RDS Custom 有时会使用从发出调用的 IAM 主体的凭证中派生的临时凭证。这些 IAM 凭证受附加到该主体的 IAM policy 限制，并在操作完成后过期。要了解使用 RDS Custom 的 IAM 主体所需的权限，请参阅[步骤 5：为您的 IAM 用户或角色授予所需的权限](custom-setup-orcl.md#custom-setup-orcl.iam-user)。

**Amazon EC2 实例配置文件**  
EC2 实例配置文件是 IAM 角色的容器，可用来将角色信息传递给 EC2 实例。EC2 实例是 RDS Custom 数据库实例的基础。创建 RDS Custom 数据库实例时，您需要提供实例配置文件。RDS Custom 在执行基于主机的管理任务（例如备份）时，使用 EC2 实例配置文件凭证。有关更多信息，请参阅 [手动创建您的 IAM 角色和实例配置文件](custom-setup-orcl.md#custom-setup-orcl.iam)。

**SSH 密钥对**  
当 RDS Custom 创建作为数据库实例基础的 EC2 实例时，它会代表您创建 SSH 密钥对。密钥使用命名前缀 `do-not-delete-rds-custom-ssh-privatekey-db-` 或 `rds-custom!oracle-do-not-delete-db_resource_id-uuid-ssh-privatekey`。AWS Secrets Manager 将此 SSH 私有密钥存储为您的 AWS 账户中的密钥。Amazon RDS 不存储、访问或使用这些凭证。有关更多信息，请参阅 [Amazon EC2 密钥对和 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。

## SSL 证书
<a name="custom-security.ssl"></a>

RDS Custom 数据库实例不支持托管式 SSL 证书。如果要部署 SSL，则可以在自己的钱包中自行管理 SSL 证书，并创建 SSL 侦听器来保护客户端数据库之间的连接或进行数据库复制。有关更多信息，请参阅 Oracle 数据库文档中的[配置传输层安全性协议身份验证](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-secure-sockets-layer-authentication.html#GUID-6AD89576-526F-4D6B-A539-ADF4B840819F)。

# 保护 Amazon S3 桶免受混淆代理人问题影响
<a name="custom-security.confused-deputy"></a>

创建 Amazon RDS Custom for Oracle 自定义引擎版本（CEV）或 RDS Custom for SQL Server 数据库实例时，RDS Custom 会创建一个 Amazon S3 桶。S3 桶存储相关文件，例如 CEV 构件、重做（事务）日志、支持外围的配置项目以及 AWS CloudTrail 日志。

您可以通过使用全局条件上下文键来防止*混淆代理人问题*，从而使这些 S3 桶更加安全。有关更多信息，请参阅 [防范跨服务混淆代理问题](cross-service-confused-deputy-prevention.md)。

以下 RDS Custom for Oracle 示例显示了如何在 S3 桶策略中使用 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键。对于 RDS Custom for Oracle，请确保包含 CEV 和数据库实例的 Amazon 资源名称（ARN）。对于 RDS Custom for SQL Server，确请保包含数据库实例的 ARN。

```
...
{
  "Sid": "AWSRDSCustomForOracleInstancesObjectLevelAccess",
  "Effect": "Allow",
  "Principal": {
     "Service": "custom.rds.amazonaws.com"
  },
  "Action": [
     "s3:GetObject",
     "s3:GetObjectVersion",
     "s3:DeleteObject",
     "s3:DeleteObjectVersion",
     "s3:GetObjectRetention",
     "s3:BypassGovernanceRetention"
  ],
  "Resource": "arn:aws:s3:::do-not-delete-rds-custom-123456789012-us-east-2-c8a6f7/RDSCustomForOracle/Instances/*",
  "Condition": {
     "ArnLike": {
        "aws:SourceArn": [
            "arn:aws:rds:us-east-2:123456789012:db:*",
            "arn:aws:rds:us-east-2:123456789012:cev:*/*"
        ]
     },
     "StringEquals": {
        "aws:SourceAccount": "123456789012"
    }
  }
},
...
```

# 轮换 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 天自动轮换一次。之前用户的凭证位于 AWS 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.aws.amazon.com/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.aws.amazon.com/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 中设置自动轮换。有关更多信息，请参阅[轮换 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)。

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

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

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

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

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

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

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

1. 通过 [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/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)中列出的所有数据库用户，按照[修改 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/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`。