当我尝试使用 IAM 身份验证连接到 Amazon RDS for MySQL 时,收到“访问遭拒”错误

上次更新时间:2021 年 8 月 20 日

我正在尝试使用 AWS Identity Access Management (IAM) 身份验证连接到 Amazon Relational Database Service (Amazon RDS) for MySQL 实例,但是一直收到“访问遭拒”错误:

ERROR 1045 (28000): Access denied for user 'root'@'10.0.4.253' (using password: YES)

如何排查此问题?

简短描述

如果您无法使用 IAM 身份验证连接到 Amazon RDS for MySQL 或 Aurora 数据库实例,请确认是否存在以下问题:

  • IAM 身份验证被禁用
  • IAM 角色权限不足
  • 数据库用户配置不当
  • 连接字符串错误

解决方法

IAM 身份验证被禁用

默认情况下,IAM 身份验证处于禁用状态。查看您的 Amazon RDS for MySQL 集群的配置设置,确保启用了 IAM 身份验证。在 Amazon RDS 控制台中,您可以通过选择 Database Authentication (数据库身份验证) 来修改实例。然后,选择 Password and IAM database authentication (密码和 IAM 数据库身份验证),并继续更新配置设置。

注意:如果在更新集群配置设置时选择 Apply Immediately (立即应用),则会立即(而不是在维护时段内)应用所有待处理的修改。此操作可能会导致您的 Amazon RDS for MySQL 实例中断时间延长。有关更多信息,请参阅使用“立即应用”设置

IAM 角色权限不足

要使用 IAM 数据库身份验证成功连接到 Amazon RDS for MySQL 实例,您必须有权访问 rds-db:connect 操作。rds-db:connect 操作允许连接到数据库实例。

例如:

{
    "Version": "2012-10-17",
    "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "rds-db:connect"
        ],
        "Resource": [
            " arn:aws:rds-db:region:account-id:dbuser:(DbiResourceId or DbClusterResourceId)/db-user-name"
        ]
    }]
}

注意:db-user-name 替换为与 IAM 身份验证关联的数据库账户用户。

此外,请确保您使用的是正确的资源 ID(而不是仅指定 ARN)。要查找数据库实例的资源 ID,请在 AWS 管理控制台中选择 Resource (资源) 选项卡。然后,选择 Configuration (配置) 选项卡以查看资源 ID。

有关示例 IAM 策略中列出的元素的更多信息,请参阅创建和使用适用于 IAM 数据库访问的 IAM 策略

数据库用户配置不当

使用 Amazon RDS for MySQL,IAM 身份验证由 AWSAuthenticationPlugin 进行处理。因此,要使用 IAM 身份验证连接到您的 Amazon RDS for MySQL 实例,必须使用 AWSAuthenticationPlugin。要确认此插件是否与您的 IAM 角色相关联,请运行以下命令:

select user,plugin,host from mysql.user where user like '%db-user-name%';

输出如下所示:

+------+-------------------------+------+
| user | plugin | host |
+------+-------------------------+------+
| root | AWSAuthenticationPlugin | % |
+------+-------------------------+------+
1 row in set (0.00 sec)

如果 IAM 角色仅限于使用特定主机,请确保您使用的是正确的主机名。此外,请确保您拥有访问指定数据库的适当权限。

要查看授予用户的权限,请使用以下命令语法:

show grants for <user>;

要向其他用户授予权限,请使用以下命令语法:

grant select on <mydb>.<mytable> to <user>;

连接字符串错误

当您连接到 Amazon RDS for MySQL 数据库时,必须在连接字符串中使用 --enable-cleartext-plugin 选项。--enable-cleartext-plugin 语法用于传递密码,充当身份验证令牌

例如:

$ mysql -h <endpoint> -P 3306 --enable-cleartext-plugin --user=RDSConnect --password=$

--enable-cleartext-plugin 语法还表示必须使用 AWSAuthenticationPlugin 连接数据库。配置数据库用户时需要该插件,IAM 身份验证正常工作也需要该插件。如果 AWSAuthenticationPlugin 配置不正确,那么 IAM 身份验证就无法正常工作。因此,当您尝试连接到数据库时,会收到访问遭拒错误。

另外,由于身份验证令牌由多个字符(在命令行中可能很难处理)组成,因此请改为将令牌保存到环境变量中。然后,在连接到 MySQL 数据库实例时使用该变量。例如:

RDSHOST="rdsmysql.123456789012.us-west-2.rds.amazonaws.com"
TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-west-2 --username db-user-name)"
mysql --host=$RDSHOST --port=3306 --enable-cleartext-plugin --user=jane_doe --password=$TOKEN

有关如何使用环境变量连接到 MySQL 数据库实例的更多信息,请参阅连接到数据库实例