使用IAM角色连接RDS Aurora MySQL时遭遇访问拒绝求助
问题详情
- 环境:RDS Aurora MySQL实例
- 已完成配置:
- 定义IAM策略允许数据库用户
jane_doe执行rds-db:connect操作 - 在MySQL中创建
jane_doe用户,认证类型设为AWSAuthenticationPlugin - 为
jane_doe启用SSL强制要求,已下载AWS官方证书包
- 定义IAM策略允许数据库用户
- 正常情况:本地终端使用admin账号密码可成功连接,命令如下:
mysql --host=db-test-instance-1.somethinghere.us-west-2.rds.amazonaws.com --port=3306 --ssl-ca=~/Downloads/global-bundle.pem --enable-cleartext-plugin --user=admin --password=my_password
- 异常情况:使用IAM认证令牌连接
jane_doe时触发权限拒绝,命令及错误:
TOKEN="$(aws rds generate-db-auth-token --hostname db-test-instance-1.somethinghere.us-west-2.rds.amazonaws.com --port 3306 --username jane_doe --region=us-west-2b)" mysql --host=db-test-instance-1.something here.us-west-2.rds.amazonaws.com --port=3306 --ssl-ca=~/Downloads/global-bundle.pem --enable-cleartext-plugin --user=jane_doe --password=$TOKEN
错误信息:ERROR 1045 (28000): Access denied for user 'jane_doe'@'1.16.14.7' (using password: YES)
- 已确认:
jane_doe用户存在且持有必要数据库权限
排查与解决步骤
修正令牌生成的Region参数
生成认证令牌时,--region需指定AWS区域(如us-west-2),而非可用区(us-west-2b)。修正后的命令:TOKEN="$(aws rds generate-db-auth-token --hostname db-test-instance-1.somethinghere.us-west-2.rds.amazonaws.com --port 3306 --username jane_doe --region=us-west-2)"验证IAM实体的策略关联
确保执行令牌生成操作的IAM用户/角色(而非数据库用户jane_doe)已关联正确的权限策略,示例策略:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rds-db:connect", "Resource": "arn:aws:rds-db:us-west-2:你的AWS账号ID:dbuser:实例资源ID/jane_doe" } ] }注意:实例资源ID可在RDS控制台实例详情的「配置」标签中获取,格式为
db-XXXXXXXXXXXXXXXXX。确认数据库用户的认证插件配置
登录数据库执行以下命令,检查jane_doe的认证插件是否正确:SELECT user, plugin FROM mysql.user WHERE user = 'jane_doe';需确保返回的
plugin值为mysql_clear_password(AWSAuthenticationPlugin对应的底层插件)。若不符,重新创建用户:CREATE USER 'jane_doe'@'%' IDENTIFIED WITH mysql_clear_password AS 'RDS'; GRANT 所需权限 ON 目标数据库.* TO 'jane_doe'@'%'; FLUSH PRIVILEGES;修正连接命令的主机名
连接命令中的主机名存在空格(something here),需修正为与令牌生成命令一致的正确主机名:db-test-instance-1.somethinghere.us-west-2.rds.amazonaws.com。验证本地AWS CLI身份权限
执行aws sts get-caller-identity确认当前CLI使用的IAM实体,该实体必须拥有生成认证令牌及rds-db:connect的权限,否则生成的令牌无效。检查SSL连接有效性
尽管已启用SSL强制,可在连接命令中添加--ssl-mode=REQUIRED强制验证SSL连接,确保SSL配置无问题:mysql --host=db-test-instance-1.somethinghere.us-west-2.rds.amazonaws.com --port=3306 --ssl-ca=~/Downloads/global-bundle.pem --ssl-mode=REQUIRED --enable-cleartext-plugin --user=jane_doe --password=$TOKEN
内容的提问来源于stack exchange,提问作者SeaSky

