如何允许用户使用他们的 IAM 凭证连接到 Amazon RDS MySQL 数据库实例?

上次更新时间:2020 年 5 月 29 日

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

简短描述

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

  • IAM 数据库身份验证令牌是使用您的 AWS 访问密钥生成的。您不需要存储数据库用户凭证。
  • 身份验证令牌的有效期为 15 分钟,因此您无需强制执行密码重置。
  • IAM 数据库身份验证需要使用 SSL 连接,因此传入和传出 RDS 数据库实例的所有数据都已加密。
  • 如果您的应用程序在 Amazon Elastic Compute Cloud (Amazon EC2) 上运行,您可以使用 EC2 实例配置文件凭证来访问数据库。您不需要在您的实例上存储数据库密码。

要将 IAM 数据库身份验证方式设置为使用 IAM 角色,请执行以下步骤:

  1. 在 RDS 数据库实例上启用 IAM 数据库身份验证。
  2. 创建一个使用 AWS 身份验证令牌的数据库用户账户。
  3. 添加一个 IAM 策略以将该数据库用户映射到该 IAM 角色。
  4. 将该 IAM 角色附加到该 EC2 实例。
  5. 生成一个 AWS 身份验证令牌来标识该 IAM 角色。
  6. 下载 SSL 根证书文件或证书捆绑包文件。
  7. 使用 IAM 角色凭证和身份验证令牌或 SSL 证书连接到 RDS 数据库实例。

如果您运行 PostgreSQL,请参阅###如何允许用户通过 pgAdmin 使用 IAM 身份验证连接到 Amazon RDS PostgreSQL 数据库实例?###

解决方法

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

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

您可以使用 Amazon RDS 控制台、AWS 命令行界面 (AWS CLI) 或 Amazon RDS API 来启用 IAM 数据库身份验证。如果您使用 Amazon RDS 控制台来修改数据库实例,请选择立即应用以立即启用 IAM 数据库身份验证。如果您有其他待处理的修改,但又选择了立即应用,这可能会导致故障。有关更多信息,请参阅使用“立即应用”参数

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

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

PostgreSQL

$ psql -h {database or cluster endpoint} -U {Master username} -d {database name}

MySQL

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

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

PostgreSQL

CREATE USER {db username};

MySQL

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

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

PostgreSQL

GRANT rds_iam to {db username};

MySQL

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

4.    运行 \q 命令关闭 PostgreSQL 或运行 exit 命令关闭 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) 命令生成身份验证令牌。复制并存储该身份验证令牌以备将来使用。

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

PostgreSQL

export
PGPASSWORD="$(aws rds generate-db-auth-token
--hostname={db endpoint} --port=5432
--username={db user} --region us-west-2)"

MySQL

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

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

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

PostgreSQL 和 MySQL

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

注意:如果您使用 2015 年根证书,它将在 2020 年到期。要迁移到 2019 年根证书,请参阅轮换 SSL/TLS 证书

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

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

PostgreSQL

如果您的应用程序不接受证书链,请运行以下命令下载包含旧根证书和新根证书的证书捆绑包:

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

export RDSHOST="rdspostgres.abcdefghijk.us-west-2.rds.amazonaws.com"
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname=$RDSHOST --port=5432 --username=jane_doe --region us-west-2)"

$ psql -h {DB endpoint} -p 5432 "dbname={db name} user={db user} sslrootcert=/home/ec2-user/rds-combined-ca-bundle.pem sslmode=verify-ca"

MySQL

如果您的应用程序不接受证书链,请运行以下命令下载包含旧根证书和新根证书的证书捆绑包:

$ 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 jane_doe )"

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

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

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

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