

# 创建和使用适用于 IAM 数据库访问的 IAM 策略
<a name="UsingWithRDS.IAMDBAuth.IAMPolicy"></a>

要允许用户或角色连接到数据库实例，您必须创建 IAM policy。之后，将策略附加到权限集或角色。

**注意**  
要了解有关 IAM 策略的更多信息，请参阅 [Amazon RDS 的 Identity and Access Management](UsingWithRDS.IAM.md)。

以下示例策略允许用户使用 IAM 数据库身份验证连接到数据库实例。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:us-east-2:111122223333:dbuser:db-ABCDEFGHIJKL01234/db_user"
            ]
        }
    ]
}
```

------

**重要**  
具有管理员权限的用户即使在 IAM policy 中没有显式权限，也可以访问数据库实例。如果您希望限制管理员访问数据库实例，您可以创建具有合适的较低权限的 IAM 角色，并将其分配给管理员。

**注意**  
请不要将 `rds-db:` 前缀与以 `rds:` 开头的其他 RDS API 操作前缀混淆。仅在 IAM 数据库身份验证使用 `rds-db:` 前缀和 `rds-db:connect` 操作。它们在任何其他上下文中无效。

示例策略包含带以下元素的单个语句：
+ `Effect` – 指定 `Allow` 以授予数据库实例的访问权限。如果您没有显式允许访问，则默认情况下将拒绝访问。
+ `Action` – 指定 `rds-db:connect` 以允许连接到数据库实例。
+ `Resource` – 指定 Amazon Resource Name (ARN) 以描述一个数据库实例中的一个数据库账户。ARN 格式如下所示。

  ```
  arn:aws:rds-db:region:account-id:dbuser:DbiResourceId/db-user-name
  ```

  在此格式中，替换以下内容：
  + `region` 是数据库实例所在的 AWS 区域。在示例策略中，AWS 区域为 `us-east-2`。
  + `account-id` 是数据库实例的 AWS 账号。在示例策略中，账号为 `1234567890`。该用户必须位于与数据库实例的账户相同的账户中。

    要执行跨账户存取，请在数据库实例的账户中使用上面显示的策略创建 IAM 角色，并允许其他账户代入该角色。
  + `DbiResourceId` 是数据库实例的标识符。此标识符对 AWS 区域是唯一的，并且绝不会更改。在示例策略中，标识符为 `db-ABCDEFGHIJKL01234`。

    要在适用于 Amazon RDS 的 AWS 管理控制台中查找数据库实例资源 ID，请选择数据库实例来查看其详细信息。然后，选择**配置**选项卡。**Resource ID (资源 ID)** 将显示在 **Configuration (配置)** 部分中。

    或者，您可以使用 AWS CLI 命令列出当前 AWS 区域中所有数据库实例的标识符和资源 ID，如下所示。

    ```
    aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier,DbiResourceId]"
    ```

    如果您使用的是 Amazon Aurora，请指定 `DbClusterResourceId` 而不是 `DbiResourceId`。有关更多信息，请参阅 *Amazon Aurora 用户指南*中的[创建和使用适用于 IAM 数据库访问的 IAM 策略](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html)。
**注意**  
如果要通过 RDS 代理连接到数据库，请指定代理资源 ID，如 `prx-ABCDEFGHIJKL01234`。有关将 IAM 数据库身份验证与 RDS 代理结合使用的信息，请参阅 [使用 IAM 身份验证连接到数据库](rds-proxy-connecting.md#rds-proxy-connecting-iam)。
  + `db-user-name` 是与 IAM 身份验证关联的数据库账户的名称。在示例策略中，数据库账户为 `db_user`。

您可以构造其他 ARN 以支持多种访问模式。以下策略允许访问一个数据库实例中的两个不同的数据库账户。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "arn:aws:rds-db:us-east-2:123456789012:dbuser:db-ABCDEFGHIJKL01234/jane_doe",
             "arn:aws:rds-db:us-east-2:123456789012:dbuser:db-ABCDEFGHIJKL01234/mary_roe"
         ]
      }
   ]
}
```

------

以下策略使用“\$1”字符匹配特定 AWS 账户和 AWS 区域的所有数据库实例和数据库账户。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:us-east-2:111122223333:dbuser:*/*"
            ]
        }
    ]
}
```

------

以下策略匹配特定 AWS 账户和 AWS 区域的所有数据库实例。不过，该策略仅允许访问具有 `jane_doe` 数据库账户的数据库实例。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "arn:aws:rds-db:us-east-2:123456789012:dbuser:*/jane_doe"
         ]
      }
   ]
}
```

------

用户或角色只能访问数据库用户有权访问的那些数据库。例如，假设数据库实例具有一个名为 *dev* 的数据库，以及另一个名为 *test* 的数据库。如果数据库用户 `jane_doe` 只能访问 *dev*，则与 `jane_doe` 用户一起访问数据库实例的任何用户或角色也只能访问 *dev*。此访问限制还适用于其他数据库对象 (如表、视图等)。

管理员必须创建 IAM policy，以便为实体授予权限，从而对其所需的指定资源执行特定的 API 操作。然后，管理员必须将这些策略附加到需要这些权限的权限集或角色。有关策略示例，请参阅“[Amazon RDS 的基于身份的策略示例](security_iam_id-based-policy-examples.md)”。

## 将 IAM policy 附加到权限集或角色
<a name="UsingWithRDS.IAMDBAuth.IAMPolicy.Attaching"></a>

在创建允许数据库身份验证的 IAM policy 之后，您需要将该策略附加到权限集或角色。有关此主题的教程，请参阅 *IAM 用户指南* 中的[创建和附加您的第一个客户托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html)。

在演练此教程时，您可以使用此部分中显示的策略示例之一作为起点并根据您的需求进行定制。在教程结束时，您将有一个权限集，该权限集附加了一个可利用 `rds-db:connect` 操作的策略。

**注意**  
您可以将多个权限集或角色映射到同一数据库用户账户。例如，假设您的 IAM 策略指定了以下资源 ARN。  

```
arn:aws:rds-db:us-east-2:123456789012:dbuser:db-12ABC34DEFG5HIJ6KLMNOP78QR/jane_doe
```
如果将该策略附加到 *Jane*、*Bob* 和 *Diego*，则其中的每个用户都可以使用 `jane_doe` 数据库账户连接到指定的数据库实例。