【问题标题】:Setting up RDS (MySQL) database access using IAM to generate access tokens使用 IAM 设置 RDS (MySQL) 数据库访问以生成访问令牌
【发布时间】:2017-12-24 15:41:07
【问题描述】:

我已按照说明设置 AWS 和 MySQL,这样我应该能够使用 mysql-client 和用户(名为 aws_iam)登录 mysql,无需密码,但使用由 @987654324 生成的令牌@ 将角色附加到我的 EC2 实例。

指令are here

所以我拥有的是:

  • 具有允许我生成 RDS 凭据的角色的 EC2 实例
  • 运行 MySQL 的 RDS 实例,用户 aws_iamAWSAuthenticationPlugin 标识
  • 通过 SSH 登录到 EC2 实例后,我可以运行 mysql -h mydb.randomstring.region.rds.amazonaws.com -u root -p 并输入 RDS 设置中的主密码以获取 mysql shell。
  • 此外,当通过 SSH 登录到 EC2 实例时,我可以运行 aws rds generate-db-auth-token --hostname mydb.randomstring.region.rds.amazonaws.com --port 3306 --username aws_iam,并且在运行此程序时,我会得到一个如下所示的令牌:

mydb.randomstring.region.rds.amazon.aws.com:port-number/?Action=connect&DBUser=aws_iam&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900&X-Amz-Date=current_time&X-Amz-SignedHeaders=host&X-Amz-Security-Token=really-long-url-encoded-string&X-Amz-Credential=string/region/rds-db/aws4_request&X-Amz-Signature=long-hash

然后我运行一个连接命令:

mysql -h mydb.randomstring.region.rds.amazonaws.com --ssl-ca=rds-ca-2015-eu-west-1.pem --ssl-mode=VERIFY_IDENTITY -u aws_iam --enable-cleartext-plugin --password=TOKEN

然后我就明白了

ERROR 1045 (28000): Access denied for user 'aws_iam'@IP (using password: YES)

我注意到的一些事情:

  • “令牌”最初是 url 编码的;但是解码它也不起作用
  • token有很多url格式的参数;可能只有这些参数之一是实际令牌,但文档中没有提到这一点
  • 如果您的 EC2 角色没有“rds-db”策略,您仍然可以生成令牌。这可能意味着令牌生成并不能证明您的策略有效;但除此之外没有其他方法可以调试它

那么有人启用了这个功能吗?有什么我遗漏的吗?

【问题讨论】:

    标签: amazon-web-services amazon-rds amazon-iam


    【解决方案1】:

    原来我的角色没有正确的权限。不幸的是,那些错误的权限被及时丢失了,但我似乎记得“资源”键是错误的。

    这是您需要替换以下变量的策略:

    • AWS_ROLE_NAME:分配给实例的角色名称
    • AWS_ACCOUNT_ID:您的整体账户 ID(从账户或账单页面查看)
    • RDS_REGION:您的实例所在的区域,例如"us-east-1"(单个AZ不需要指定AZ)
    • RDS_RESOURCE_ID:RDS Web 控制台中标题“资源 ID”下的代码,用于您希望访问的实例(格式应为 db-([A-Z0-9]+)

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds-db:connect" ], "Resource": [ "arn:aws:rds-db:RDS_REGION:AWS_ACCOUNT_ID:dbuser:RDS_RESOURCE_ID/AWS_ROLE_NAME" ] } ] }

    我已经为 sqlbot 提供了正确答案,因为他们很快就提供了有用的信息,但这项政策应该可以帮助一些人。

    【讨论】:

    • 不确定需要哪些未记录的权限,但这仅适用于用户还具有 AdminAccess 权限或操作更改为“rds-db:*”的情况
    【解决方案2】:

    文档似乎很少。

    乍看之下似乎很荒谬,但它看起来整个事情,连同它的 url 转义,是“身份验证令牌”......你只需要将它括在 ' 单引号中命令行。

    我是这样得出这个结论的:

    我尝试解决此问题的第一步是查看 RDS API 参考。没有GetDbAuthToken 操作。好奇。

    然后,我注意到aws rds generate-db-auth-token 不需要区域。怎么可能?

    除非……

    从字里行间看,这里的操作术语似乎是 generate...不是 get 的同义词(通过 API 请求)。

    这看起来完全是本地操作,这意味着可以成功“生成”一个完全无效的身份验证令牌...与生成语法上有效但访问仍被拒绝的预签名 URL 完全相同的方式,因为请求签名者缺乏必要的许可。

    如果您的 EC2 角色没有“rds-db”策略,您仍然可以生成令牌。这可能意味着令牌生成并不能证明您的策略有效。

    在这里,我将其称为我断言的进一步证明。根据我所看到的,我想说成功的代币生成根本证明不了任何事情。

    您只是生成他们所谓的“令牌”——也就是说,在形式上,与 AWS4-HMAC-SHA256(“签名版本 4”)签名的 URL 没有什么不同...用您的凭据签名。

    RDS 采用这一整行,并使用与面向外部的服务 API 使用的机制基本相同的机制将其传递给 IAM,以对其进行验证。这也解释了为什么令牌只能使用 15 分钟……这就是大多数查询 API 的工作方式。签名请求仅适用于 +/- 15 分钟。它还解释了为什么他们建议每秒不超过 20 个新连接 - 当您尝试使用它登录时,您的 RDS 实例正在发出内部 API 请求以实际验证令牌。

    我会回顾所有setup steps,但在测试时使用 IAM 用户而不是实例角色,只是为了消除一点复杂性。

    RDS 实例的错误日志可能包含更多信息。您可能需要在参数组中将 log_warnings 设置为 2 或更高,这可能是个好主意。

    【讨论】:

    • 谢谢迈克尔。我终于设法解决了它,你的钱。今天我会写一个完整的答案。您可以在没有角色的情况下生成令牌这一事实在调试时绝对是一个巨大的干扰。某种令牌测试器会很有用。
    • 这是一篇很棒的帖子,确实很有帮助,某种令牌测试器会非常有用。 @M1ke .. 请发布您的解决方案。
    • @M1ke 你能发布你的解决方案吗?现在我已经确定问题出在权限上。如果我将我的用户添加到管理员组,他们突然能够连接。
    • @VictorioBerra 解决方案现在发布在下面
    • @WarrickFitzGerald 请参阅下面的解决方案
    猜你喜欢
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2017-06-22
    • 2021-03-31
    • 2015-09-27
    • 2021-06-19
    相关资源
    最近更新 更多