使用IAM认证连接AWS RDS PostgreSQL报root密码认证失败错误
问题描述
我在AWS上创建了RDS实例,参考官方文档创建了如下权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds-db:connect" ], "Resource": [ "arn:aws:rds-db:us-east-2:1234567890:dbuser:db-ABCDEFGHIJKL01234/db_user" ] } ] }
我创建了配置专属密码的通用数据库用户,尝试参考Java连接官方指南,使用生成的IAM auth token替代常规密码登录数据库,相关实现代码如下:
private static Properties setMySqlConnectionProperties() { Properties mysqlConnectionProperties = new Properties(); mysqlConnectionProperties.setProperty("verifyServerCertificate","true"); mysqlConnectionProperties.setProperty("useSSL", "true"); mysqlConnectionProperties.setProperty("user",DB_USER); mysqlConnectionProperties.setProperty("password",generateAuthToken()); return mysqlConnectionProperties; } public static String generateAuthToken(String region, String hostName, int port, String username) { RdsIamAuthTokenGenerator generator = RdsIamAuthTokenGenerator.builder() .credentials(new DefaultAWSCredentialsProviderChain()) .region(region) .build(); String authToken = generator.getAuthToken( GetIamAuthTokenRequest.builder() .hostname(hostName) .port(port) .userName(username) .build()); return authToken; }
我实际使用的数据库为PostgreSQL,连接时返回如下错误:
"FATAL: password authentication failed for user \"root\"","error.stack_trace":"org.postgresql.util.PSQLException: FATAL: password authentication failed for user \"root\"
我已为root用户配置了IAM认证支持,需要逐一校验哪些配置项才能修复该问题?
下方为AWS控制台中已配置完成的策略截图:
排查校验项
按优先级从高到低依次校验以下配置:
- 校验IAM策略的资源ARN匹配度:你当前策略授权的数据库用户是
db_user,但实际连接使用的是root用户。IAM策略的资源段固定格式为arn:aws:rds-db:<区域>:<账号ID>:dbuser:<RDS实例资源ID>/<数据库用户名>,必须将ARN末尾的用户名替换为实际使用的root,同时逐一确认区域、账号ID、RDS实例资源ID和实际实例完全匹配——注意实例资源ID是控制台显示的db-开头的标识符,不是实例访问端点。 - 校验RDS实例的IAM认证开关:进入RDS实例详情页,确认IAM database authentication选项已设置为
Enabled,该选项关闭时实例完全不接受IAM token认证,所有登录请求都会走普通密码校验逻辑。 - 校验数据库内用户的IAM角色授权:登录PostgreSQL数据库执行
GRANT rds_iam TO root;为root用户赋予内置的IAM认证角色,没有该角色的用户即使IAM策略配置正确也无法通过token登录,会直接返回密码错误。注意不要给绑定了rds_iam角色的用户设置普通密码,PostgreSQL RDS的IAM认证逻辑下,绑定该角色的用户会强制走IAM校验,原有普通密码会直接失效。 - 校验连接参数的数据库适配性:你当前的连接属性方法命名为
setMySqlConnectionProperties,存在直接套用MySQL配置的问题。PostgreSQL的SSL连接参数和MySQL不兼容,不需要verifyServerCertificate参数,需替换为PostgreSQL适配参数:sslmode=verify-full、sslrootcert=<RDS根证书本地存储路径>。 - 校验Auth Token生成参数:确认传入
generateAuthToken方法的四个参数完全准确:区域和RDS实例部署区域一致、hostname为RDS实例的官方读写端点(不能用只读端点、自定义域名或IP地址)、端口为数据库实际监听端口(PostgreSQL默认5432)、username参数传入值为root无拼写错误。 - 校验代码运行身份的权限绑定:确认
DefaultAWSCredentialsProviderChain实际加载到的身份(EC2实例角色、本地配置的AK/SK、EKS服务角色等)确实绑定了你创建的IAM策略,可以在代码中打印当前加载身份的ARN,和你配置策略的目标身份做比对,避免身份错配。 - 校验SSL证书有效性:连接时使用的SSL证书必须是AWS对应区域的官方RDS CA证书,证书过期、不匹配会导致SSL握手异常,最终抛出认证失败错误。
- 校验网络访问规则:确认运行代码的客户端IP在RDS实例安全组的入站允许范围内,数据库端口连通性正常,避免网络拦截导致token未被正确传递到数据库端。
内容的提问来源于stack exchange,提问作者Hard Worker
相关产品推荐
相关产品推荐

