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

上次更新时间:2020 年 8 月 14 日

我想连接到一个运行 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 证书来连接到数据库实例。

解决方法

在开始之前,请确保您已经启动了一个支持 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 控制台,然后从导航窗格中选择角色

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

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

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

5.    选择下一步:审核。

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

7.    选择创建角色

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

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

2.    选择添加内联策略

3.    从创建和使用适用于 IAM 数据库访问的 IAM 策略进入该策略。

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

4.    选择查看策略

5.    在名称中,输入策略名称。

6.    选择创建策略

将该 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})"

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

注意:对于需要 PKCS7 文件的 Windows 平台应用程序,请参阅使用 SSL/TLS 加密与数据库实例的连接来下载适当的证书。

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

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