如何解决使用 IAM 身份验证连接 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 集群时出现的问题?

2 分钟阅读
0

我想连接至自己的 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 实例或兼容 Amazon Aurora PostgreSQL 的集群。尝试使用 AWS Identity Access Management (IAM) 身份验证进行连接时,我收到“用户 PAM 身份验证失败”错误。

简短描述

由于以下原因之一,您可能无法使用 IAM 身份验证连接 Amazon RDS for PostgreSQL 或 Aurora 数据库实例:

  • IAM 身份验证已关闭
  • IAM 角色权限不足或策略不正确
  • 数据库用户配置不当
  • 连接字符串错误
  • IAM 实体不正确

解决方法

IAM 身份验证已关闭

IAM 身份验证会被默认关闭。查看适用于 RDS for PostgreSQL 实例或 Aurora PostgreSQL 集群的配置设置。确保 IAM 身份验证已开启。在 Amazon RDS 控制台 中,您可以通过选择 Database Authentication(数据库身份验证)来修改 Aurora 集群或 RDS 实例。然后选择 IAM database authentication(IAM 数据库身份验证)和 Continue(继续)以更新配置设置。

**注意:**如果在更新集群配置设置时选择了 Apply Immediately(立即应用),则会立即应用所有待处理的修改。此操作不会导致停机。

IAM 角色权限不足

要使用 IAM 数据库身份验证成功连接到您的数据库实例,您必须有权访问 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 for RDS PostgreSQL or DbClusterResourceId for Aurora PostgreSQL)/db_user_name"
        ]
    }]

**注意:**将 db_user_name 替换为与 IAM 身份验证关联的数据库账户用户。

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

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

注意:IAM 身份验证不支持可在策略声明条件元素中使用的特定服务上下文键。IAM 身份验证也不支持所有全局条件上下文键。有关全局条件上下文键的更多信息,请参阅 IAM 用户指南中的 AWS 全局条件上下文键

数据库用户配置不当

要在 PostgreSQL 中使用 IAM 身份验证,请向数据库用户授予 rds_iam 角色。要确认此角色与用户关联,请运行以下命令:

**注意:**此命令只能在 PostgreSQL 客户端中运行。

\du

您的输出应会与以下类似:

List of roles
   Role name    |                         Attributes                         |                          Member of                          
-----------------+------------------------------------------------------------+-------------------------------------------------------------
db_user_name    |                                                            | {rds_iam}                                
postgres        | Create role, Create DB                                    +| {rds_superuser}          
                | Password valid until infinity                              |

也可以使用此查询,该查询可以在任何平台上运行:

SELECT r.rolname,
ARRAY(SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid) memberof
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;

要创建用户并授予 rds_iam 角色,请运行以下命令:

CREATE USER db_user_name WITH LOGIN; 
GRANT rds_iam TO db_user_name;

连接字符串错误

身份验证令牌由多个字符组成,这些字符在命令行上可能难以使用。改为将令牌保存到环境变量中,然后在连接到 PostgreSQL 数据库实例时使用该变量。

例如:

export RDSHOST='aurorapostgresql.cluster-abcdef12ghi.us-east-1.rds.amazonaws.com'
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-east-1 --username db_user_name)"
psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=global-bundle.pem dbname=postgres user=db_user_name password=$PGPASSWORD"

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

如果您遇到与本示例类似的错误,则表明客户端尝试在没有 SSL 的情况下连接到数据库实例。

FATAL: no pg_hba.conf entry for host "host.ip", user "<username>", database "postgres", SSL off 
FATAL: password authentication failed for user "db_user_name"

IAM 数据库身份验证需要 SSL 连接,并且传输至数据库实例或从中传输出的所有数据都是加密的。为避免此错误,请确保连接正在使用 SSL。最佳实践是将 sslmode 选项用作 verify-full 并在连接字符串的 sslrootcert 选项中提供证书。

要下载最新的 CA 证书,请参阅使用 SSL/TLS 加密数据库集群的连接

IAM 实体不正确

确保身份验证令牌由正确的 IAM 角色生成。要检查当前 IAM 用户担任的角色,请运行以下命令:

aws sts get-caller-identity

如果担任的角色不正确,您可以切换到正确的 IAM 用户/角色担任正确的角色。确保使用正确的 IAM 角色生成身份验证令牌。

如果您仍然收到类似“用户的 PAM 身份验证失败”等错误,请检查 AWS 账户是否属于 AWS Organizations 组织。如果账户是组织的一部分,则将 rds-db:* 添加到组织的 SCP。有关更多信息,请参阅创建、更新和删除服务控制策略

如果账户属于某个组织,请检查 IAM 用户是否有层次结构不具备 rds-db 权限。有关更多信息,请参阅如何使用服务控制策略设置您在 AWS Organizations 中的跨账户权限防护机制

如果您对 IAM 实体使用权限边界,请确保允许您的 IAM 用户/角色执行 rds-db:connect 操作。有关权限边界的更多信息,请参阅 IAM 实体的权限边界。要修改用户的权限边界,请参阅更改用户的权限边界


AWS 官方
AWS 官方已更新 1 年前