amazon-web-services - 错误 1045 (28000):使用 IAM 数据库身份验证连接到 RDS 数据库实例时,用户 'db_user'@'ip' 的访问被拒绝(使用密码:YES)
问题描述
以下是对该问题的快速总结。阅读完整描述部分以了解基本细节。
精简说明:
假设您已经有一个 IAM 用户并且该用户已经能够访问其他 AWS 服务,例如 S3、CloudFront、ECS、EC2...
假设我们需要为用户提供对 RDS 集群的只读访问权限,并同时设置 IAM DB 身份验证。
我们按照官方指南在我们的本地系统中执行所有提到的步骤,它运行良好,我们能够为db_user
.
然而,有趣的地方在这里..当用户尝试db_user
从他们的本地机器生成帐户的令牌时..用户将被拒绝访问。
详细描述:
设置:
我的 RDS 集群实例运行 Aurora MySQL 引擎。引擎版本:5.6.10a
我一直在关注 AWS 知识中心指南,了解如何允许用户使用 IAM 凭证连接到 Amazon RDS?
该指南没有明确提及,但在生成身份验证令牌时,AWS CLI 使用本地存储的 IAM 凭证来签署请求。
我想强调一下,在下面提到的代码段中,admin是 AWS CLI 为我的 admin IAM 用户存储的配置文件名称,而db_user是 IAM 用户(具有rds-db:connect
特权)。
TOKEN="$(aws --profile admin rds generate-db-auth-token -h.. .. .. -u db_user)
使用上面的代码片段,我可以使用生成的令牌进行身份验证并连接到集群。
如果--profile
未提及属性,它会读取保存在凭证文件中的默认配置文件。
问题:
而不是使用--profile admin
我正在寻找使用已经存在的非管理员 IAM 配置文件来生成身份验证令牌。
例如,假设 IAM 用户名为developer,具有 RDS 只读权限和本地存储在配置文件rds_read_only下的凭证
TOKEN="$(aws --profile rds_read_only rds generate-db-auth-token -h.. .. .. -u db_user)
如果我使用上述令牌,则会收到以下错误:
ERROR 1045 (28000): Access denied for user 'db_user'@'ip' (using password: YES)
经过数小时的故障排除后,我能够得出结论,我的rds_read_only配置文件无法生成有效的身份验证令牌,这可能是因为 IAM 用户开发人员缺少一些必需的策略。
我尝试将RDS
and下的所有可用策略RDS Data API
(单独以及组合)附加到 IAM user developer,但没有任何运气。如果我将AdministrativeAccess
策略附加到 IAM 用户developer,那么它才能成功生成令牌。
问题:
非管理员 IAM 用户成功生成身份验证令牌所需的强制性策略是什么?
解决方案
这回答了@Ronnie 关于代币生成的具体问题。
罗尼我回来了。我在我的 AWS 账户中使用了以下策略:Sandbox 我是具有 AssumeRole 权限的 AWS 联合用户,所以Admin
您必须非常小心,因为正如您所说,该文章与以下内容没有区别:
AWS IAM USER 使用生成的令牌访问数据库和
具有生成有效令牌的正确管理策略的 AWS IAM 用户/角色
我将举例说明如何识别正确生成的令牌。出于某种原因,AWS 会生成一个值,但它不会告诉您是否是有用的令牌:-\
没有管理员特殊访问权限的令牌 = 将不起作用
sandboxdb.asdasdffw.ap-southeast-2.rds.amazonaws.com:3306/?Action=connect&DBUser=human_user&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA5XZIHS3GYVMRPRZF%2F20200424%2Fap-southeast-2%2Frds-db%2Faws4_request&X-Amz-Date=20200424T035250Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=3efd467d548ea05a8bdf097c132b03661680908f723861e45323723c870ef646
具有 Access= 的令牌 将起作用!仔细看,它包含X-Amz-Security-Token=
sandboxdb.ras21th1z8.ap-southeast-2.rds.amazonaws.com:3306/?Action=connect&DBUser=human_user&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIA5XZIHS3GSAQI6XHO%2F20200424%2Fap-southeast-2%2Frds-db%2Faws4_request&X-Amz-Date=20200424T040756Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEEQaDmFwLXNvdXRoZWFzdC0yIkgwRgIhAOzVIondlMxYkJG5nWNeQlxS0M6B1pphgD1ewFwx2VfKAiEAkcp2jNHHmNMgwqUholnW545MwjzoEjS1uh4BHI4R4GAqvgMIbRABGgw5NDQ0NDAzMTc2NDUiDEvFkyEy833kd%2By4nyqbAybqK5dcP0nTlqZ19I2OVZxzwzz%2BUv9RVdVLMPHE5b%2FqXQGVG1CRtw90r9Lt4QkzTBeIVzdtIkXbpwFtqFh24Djb%2BiZHfvElj%2Fhz29ExzStU0fPYMewEB1u%2F2Osi72Fw6KbZ6TDy5EjuWcrrS08PZQ9CHc%2Fc8iDAIKs28vJ70KKcmow0SInVZGHGpD2JAgIL7jvnadVlcAW7lN2OAnxS72Kb4neqNuHcWzfPLfbXaOP1OaOs7vCR7zDlTTxX2aHoVflC69K9K67BqzdnDnnju%2F4XWQWU3r%2ByXylExwOsiG3y4Qq6wv002l%2BpQmF5%2BMXdTrFR5ewpfrcHf8TZLI5eq8HLA2gG1%2B255L%2Bqt%2BD80T%2FCzEdKSJPjppdYSq9FdeCMRSsqp5PpXP%2BDbQZwmhxiE2RmrbOKwNsFPJqUUnemQHXYLB8lily56nnswT2PYmQOGHqnZWRrv%2FTlGOAGlThuiR%2BLhQLBC08nBEGbBqK%2FjU4JwFMY4JfhgUHr8BA9CuGwAu0qIAFzG71M3HzCNX6o56k1gYJB%2F3%2FJaKlp7TCIxIn1BTrqASqywcfKrWhIaNX3t%2BV%2FZoYYO%2FtGVBZLyr3sSmByA%2Fwq538LiPHA0wDE3utOg%2FwNP%2BQGTcXhk1F%2BI0HOHztAQ2afnKW8r1oRbXxYAzb2j2b8MNEwrsaBju2gHFRgZHkM8YI%2FP5cvYr%2F8FQXWcE9eqjdme0hOo3rPETzxZfRwNQTHEntBbVVD1ec0d7DblfSEDZhLk%2By1%2BFMAYf7NeBIfU6GNsAN2hTdSkPPuto2fQKzRybRAwxQz5P3cO5CClUNIxu4J3bM1MUUTux%2BtMjqRvjGxDhB4yLIJmIPOOYLDSOXl3aWO2y4v89wu5A%3D%3D&X-Amz-Signature=1c6fcc472bb2af09055117075ca21d4a5f715910443115116c9230905721e79d
数据库用户连接到 AWS RDS 数据库实例的 AWS IAM 策略
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "rds-db:connect",
"Resource": "*"
}
]
}
为了避免弄乱本地配置,我使用了以下测试过程:
- 从与数据库在同一 VPC 中运行的 AWS EC2 实例生成令牌。生成成功
- 使用带有AWS CLI令牌生成的 Docker 容器从本地计算机生成令牌是成功的。
当然,我的用户是使用以下命令在 MySQL DB 中创建的
mysql -h $HOSTNAME -u$ADMIN_USER -p$ADMIN_PASS <<EOF
CREATE USER db_human_user IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
GRANT SELECT ON $SPECIFIC_GIVEN_DB.* TO 'db_human_user';
EOF
推荐阅读
- reactjs - 如何在没有反应路由器的情况下创建新页面
- python - 使用rest API时数据在颤动中消失
- javascript - 在 Discord.js 中创建动态查询 .addField
- python - Python 正则表达式在正则表达式测试器中工作,但在实际中不起作用
- c# - 无法映射 byte[] 或 byte[]?(可为空的字节 [])使用 AutoMapper ForCtorParam 函数
- python - Python:如何生成 2 的倍数的日期?
- python - 为处理来自 html(网页)的输入而开发的 Python 脚本未执行 shell 命令
- python-3.x - 提交后Django表单字段未设置值
- installation - 使用 pip 安装 dlib 时遇到问题
- python-3.x - pandas groupby 并用有序列扩大数据框