当我尝试使用 IAM 身份验证连接到 Amazon RDS for MySQL 时,为什么会出现“访问被拒绝”错误?

2 分钟阅读
0

我想使用 AWS Identity and Access Management(IAM)身份验证连接到我的 Amazon Relational Database Service(Amazon RDS)for MySQL 实例。但是,我收到“访问被拒绝”错误: “错误 1045(28000): 用户 'root'@'10.0.4.253' 的访问被拒绝(使用密码: 是)”

简短描述

以下解决方法确定了您无法使用 IAM 身份验证连接 Amazon RDS for MySQL 或 Aurora 数据库实例的可能原因。

解决方法

IAM 身份验证已关闭

默认情况下,IAM 身份验证处于关闭状态。查看 Amazon RDS for MySQL 集群的配置设置,并确保已关闭 IAM 身份验证。在 Amazon RDS 控制台中,通过选择数据库身份验证来修改实例。然后,选择密码和 IAM 数据库身份验证,然后选择继续以更新您的配置设置。

注意:如果在更新集群配置设置时您选择立即应用,则所有待处理的修改都将立即应用,而不是在维护时段内应用。此操作可能会导致 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 管理控制台中选择资源选项卡。然后,选择配置选项卡以查看资源 ID。

有关详细信息,请参阅创建和使用适用于 IAM 数据库访问的 IAM 策略

如果您使用 SCP 策略,请确保您的策略允许连接到数据库实例。有关详细信息,请参阅创建、更新和删除服务控制策略

数据库用户配置不正确

使用 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 语句(在 MySQL 网站上)。

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 进行数据库连接。配置数据库用户时需要该插件。如果 AWSAuthenticationPlugin 配置不正确,则 IAM 身份验证将不起作用。在这种情况下,当您尝试连接到数据库时,您会看到访问被拒绝错误。

注意: 如果您使用的是 MariaDB 客户端,则不需要 --enable-cleartext-plugin 语法。首先,将令牌保存到环境变量中。然后,在连接到 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=db-user-name --password=$TOKEN

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

相关信息

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

IAM 数据库身份验证

适用于 MariaDB、MySQL 和 PostgreSQL 的 IAM 数据库身份验证