# IAM Role for RDS

用户可以使用 IAM 用户或角色凭证以及身份验证令牌连接到 Amazon RDS 数据库实例或集群。出于以下原因，IAM 数据库身份验证比原生身份验证方法更安全：

* IAM 数据库身份验证令牌是使用您的 AWS 访问密钥生成的。您无需存储数据库用户凭证。
* 身份验证令牌的有效期为 15 分钟，因此您无需强制执行密码重置。
* IAM 数据库身份验证需要安全套接字层（SSL）连接。传入和传出数据库实例的所有数据均经过加密。
* 如果您的应用程序正在 Amazon Elastic Compute Cloud（Amazon EC2）上运行，则可以使用 EC2 实例配置文件凭证来访问数据库。您无需在实例上存储数据库密码。

要使用 IAM 角色来设置 IAM 数据库身份验证，请执行以下步骤：

### 1 - 在 RDS 数据库实例上激活 IAM 数据库身份验证。

您可以使用 Amazon RDS 控制台、AWS 命令行界面（AWS CLI）或 Amazon RDS API [启用 IAM 数据库身份验证](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.Enabling.html)。如果您使用 [Amazon RDS 控制台](https://console.aws.amazon.com/rds)修改数据库实例，则应选择**立即应用**激活 IAM 数据库身份验证。激活 IAM 身份验证需要短暂中断。有关哪些修改需要中断的详细信息，请参阅 [Amazon RDS 数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.DBInstance.html)。

**注意**： 如果您选择**立即应用**，则所有待处理的修改也会立即应用，而不是在维护时段内应用。这可能会导致您的实例长时间中断。有关详细信息，请参阅[使用“立即应用”设置](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.DBInstance.Modifying.html#USER_ModifyInstance.ApplyImmediately)。

### 2 - 创建使用 AWS 身份验证令牌的数据库用户账户。

运行以下命令连接到数据库实例或集群端点。输入主密码登录。

{% code overflow="wrap" %}

```
$ RDSHOST={database or cluster endpoint}
$ mysql -h RDSHOST -P 3306 -u admin -p
```

{% endcode %}

{% code overflow="wrap" %}

```

$ TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-east-1 --username admin)"
$ mysql -h RDSHOST -P 3306 -u admin -p
```

{% endcode %}

创建使用 AWS 身份验证令牌而不是密码的数据库用户账户：

```
CREATE USER {dbusername} IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
```

默认情况下，数据库用户在创建时不会获得任何权限。当您运行 **SHOW GRANTS FOR {dbusername}** 时，系统会显示 **GRANT USAGE**。如需要求用户账户使用 SSL 进行连接，请运行以下命令：

```
ALTER USER {dbusername} REQUIRE SSL;
```

运行 **exit** 命令关闭 MySQL。

### 3 - 使用 IAM 角色凭证和 SSL 证书连接到 RDS 数据库实例

如果是通过EC2连接RDS，则绑定IAM 角色到EC2，这个角色拥有管理RDS的权限。参考[IAM Roles for Amazon EC2](https://aws-gcr-wwso-security.gitbook.io/an-quan-zui-jia-shi-jian/1.-iam-shen-fen-shi-bie-yu-fang-wen-kong-zhi/aws-ren-zheng-he-shou-quan-iam-zui-jia-shi-jian/chang-jing-hua-iam-shi-jian-ying-yong-cheng-xu-an-quan/iam-roles-for-amazon-ec2).

如果是本地CLI配置连接RDS，则可以通过IAM Identity Center授权，设置aws configure sso的短期有效权限，之后就可以执行后续的步骤。参考[IAM Identity Center for human](https://aws-gcr-wwso-security.gitbook.io/an-quan-zui-jia-shi-jian/1.-iam-shen-fen-shi-bie-yu-fang-wen-kong-zhi/aws-ren-zheng-he-shou-quan-iam-zui-jia-shi-jian/chang-jing-hua-iam-shi-jian-ren-yuan-an-quan/iam-identity-center-for-human)。

#### 下载 SSL 根证书文件或证书捆绑包文件

[所有 AWS 区域的证书捆绑包](https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.CertificatesAllRegions)

[特定 AWS 区域的证书捆绑包](https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.RegionCertificates)

下载证书文件后，运行以下命令之一通过 SSL 连接到数据库实例。

{% hint style="warning" %}
**注意：**&#x5982;果您的应用程序不接受证书链，请运行以下命令下载证书捆绑包：
{% endhint %}

{% code overflow="wrap" %}

```
$ wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

RDSHOST="database-1.sjdhsgbs.us-east-1.rds.amazonaws.com"
TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-east-1 --username {db username})"
```

{% endcode %}

根据您使用的证书（根证书或捆绑包），运行以下命令之一：

根证书命令，比如我是在美东1安装的数据库，下载的是[美东1的证书](https://truststore.pki.rds.amazonaws.com/us-east-1/us-east-1-bundle.pem)，执行以下命令后成功连接到数据库：

{% code overflow="wrap" %}

```
mysql --host=$RDSHOST --port=3306 --ssl-ca=us-east-1-bundle.pem --enable-cleartext-plugin --user={db username} --password=$TOKEN
```

{% endcode %}

捆绑包命令：

{% code overflow="wrap" %}

```
mysql --host=$RDSHOST --port=3306 --ssl-ca=rds-combined-ca-bundle.pem --enable-cleartext-plugin --user='iamuser' --password=$TOKEN
```

{% endcode %}

在连接到MySQL数据库时，使用SSL可以增强安全性，保护数据传输的安全。首先，您需要根据您的证书类型（根证书或捆绑包）选择合适的连接命令。如果您使用根证书，应使用以下命令连接MySQL：

```
mysql --host=$RDSHOST --port=3306 --ssl-ca=rds-ca-2019-root.pem --enable-cleartext-plugin --user='iamuser' --password=$TOKEN
```

若您使用的是捆绑包，连接命令如下：

```
mysql --host=$RDSHOST --port=3306 --ssl-ca=rds-combined-ca-bundle.pem --enable-cleartext-plugin --user='iamuser' --password=$TOKEN
```

通过这些命令，您可以通过安全的SSL连接来访问您的MySQL数据库，确保数据在传输过程中的安全性和完整性。更多详细信息和帮助，请参考[AWS官方文档](https://repost.aws/zh-Hans/knowledge-center/users-connect-rds-iam)。

### 参考资料

<https://repost.aws/zh-Hans/knowledge-center/users-connect-rds-iam>
