如何允许用户使用其 IAM 凭证向 Amazon RDS MySQL 数据库实例进行身份验证?

上次更新时间:2020 年 11 月 17 日

我想连接到一个运行 MySQL 的 Amazon Relational Database Service (Amazon RDS) 数据库实例。但我想使用 AWS Identity and Access Management (IAM) 凭证,而不使用原生身份验证方法。该如何操作?

简短描述

用户可以使用 IAM 用户或角色凭证以及身份验证令牌连接到 Amazon RDS 数据库实例或集群。IAM 数据库身份验证比原生身份验证方法更安全,这是因为:

  • IAM 数据库身份验证令牌是使用您的 AWS 访问密钥生成的。您不需要存储数据库用户凭证。
  • 身份验证令牌的生命周期为 15 分钟,因此您不需要进行密码重置。
  • IAM 数据库身份验证需要安全套接字层 (SSL) 连接。这意味着与数据库实例之间传输的所有数据都经过加密。
  • 如果您的应用程序是在 Amazon Elastic Compute Cloud (Amazon EC2) 上运行,则您可以使用 EC2 实例配置文件凭证来访问数据库。您不需要在您的实例上存储数据库密码。

要使用 IAM 角色设置 IAM 数据库身份验证,请按照以下步骤操作:

1.    在数据库实例上启用 IAM 数据库身份验证。

2.    创建一个使用 AWS 身份验证令牌的数据库用户账户。

3.    添加一个 IAM 策略以将该数据库用户映射到该 IAM 角色。

4.    将该 IAM 角色附加到该 EC2 实例。

5.    生成一个 AWS 身份验证令牌以标识该 IAM 角色。

6.    下载 SSL 根证书文件或证书捆绑包文件。

7.    使用 IAM 角色凭证和身份验证令牌或 SSL 证书来连接到数据库实例。

解决方法

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI

在开始之前,请确保您已经启动了一个支持 IAM 数据库身份验证的数据库实例以及一个要连接到该数据库的 EC2 实例。

在 RDS 数据库实例上启用 IAM 数据库身份验证

您可以使用 Amazon RDS 控制台、AWS 命令行界面 (AWS CLI) 或 Amazon RDS API 来启用 IAM 数据库身份验证。如果您使用 Amazon RDS 控制台来修改数据库实例,请选择 Apply Immediately (立即应用)以立即启用 IAM 数据库身份验证。启用 IAM 身份验证需要短暂停机。有关哪些修改需要停机的更多信息,请参阅数据库实例的设置

注意:如果选择 Apply Immediately(立即应用),则在维护时段内也会立即应用任何待处理修改。这可能会导致您的实例长时间停机。有关更多信息,请参阅使用“立即应用”设置

创建一个使用 AWS 身份验证令牌的数据库用户账户

1.    通过运行以下命令以连接到该数据库实例或集群终端节点。输入主密码以登录。

$ mysql -h {database or cluster endpoint} -P {port number database is listening on} -u {master db username} -p

2.    创建一个使用 AWS 身份验证令牌而不是密码的数据库用户账户:

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

3.    (可选)运行以下命令以要求用户通过 SSL 连接到数据库:

GRANT USAGE ON *.* TO '{dbusername}'@'%'REQUIRE SSL;

4.    运行退出命令以关闭 MySQL。然后,退出数据库实例。

创建一个允许 Amazon RDS 访问的 IAM 角色

1.    打开 IAM 控制台,然后从导航窗格中选择 Roles(角色)。

2.    依次选择创建角色AWS 服务EC2

3.    对于选择使用案例,请选择 EC2,然后选择下一步: 权限

4.    在搜索栏中输入 RDS。然后,选择基于身份的策略,例如 AmazonRDSFullAccess。 或者,使用自定义的授予更少权限的 Amazon RDS IAM 策略

5.    选择下一步:审核。

6.    对于角色名称,输入此 IAM 角色的名称。

7.    选择 Create Role(创建角色)。

添加一个 IAM 策略,将该数据库用户映射到 IAM 角色

1.    从 IAM 角色列表中,选择新创建的 IAM 角色。

2.    选择添加内联策略

3.    输入创建和使用 IAM 策略以进行 IAM 数据库访问中的策略。

注意:请务必使用您的数据库资源的详细信息来编辑资源值,例如您的数据库实例标识符和数据库用户名。

4.    选择查看策略

5.    对于 Name (名称),输入策略名称。

6.    选择 Create policy(创建策略)。

将 IAM 角色附加到 EC2 实例

1.    打开 Amazon EC2 控制台

2.    选择您将用于连接到 Amazon RDS 的 EC2 实例。

3.    附加新创建的 IAM 角色至 EC2 实例。

4.    使用 SSH 连接到您的 EC2 实例

生成 AWS 身份验证令牌以标识 IAM 角色

连接到您的 EC2 实例后,请运行以下 AWS 命令行界面 (AWS CLI) 命令以生成身份验证令牌。复制并存储身份验证令牌以备将来使用。

$ aws rds generate-db-auth-token --hostname {db or cluster endpoint} --port 3306 --username {db username}

注意:创建 15 分钟后,此令牌将过期。

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

运行以下命令以下载适用于所有区域的根证书:

$ wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem

使用 IAM 角色凭证和身份验证令牌连接到 RDS 数据库实例

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

注意 :如果您的应用程序不接受证书链,则运行以下命令以下载证书捆绑包:

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

RDSHOST="rdsmysql.abcdefghijk.us-west-2.rds.amazonaws.com"
TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-west-2 --username {db username})"

根据您正在使用的证书(RootCA 或 Bundle),运行以下命令之一:

RootCA 命令:

mysql --host=$RDSHOST --port=3306 --ssl-ca=/sample_dir/rds-ca-2019-root.pem --enable-cleartext-plugin --user={db username} --password=$TOKEN

Bundle 命令:

mysql --host=$RDSHOST --port=3306 --ssl-ca=/sample_dir/rds-combined-ca-bundle.pem --enable-cleartext-plugin --user={db username} --password=$TOKEN

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

下载证书文件后,请通过 SSL 连接到该数据库实例。有关更多信息,请参阅连接到运行 MySQL 数据库引擎的数据库实例