使用AWS策略进行AssumeRole,带有用户名条件的问题

79次阅读
没有评论

问题描述

在尝试使用AWS策略来强制执行AssumeRole会话名称包含承担者的用户名的技巧时遇到了问题。该技巧是根据AWS官方博客文章和其他第三方博客文章中提到的,具体请参见 这里这里

所使用的技巧是直接来自上述官方AWS博客文章,通过使用StringLike条件来实现:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<AccountNumber>:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringLike": {
          "sts:RoleSessionName": "${aws:username}"
        }
      }
    }
  ]
}

然而,尽管应用了该策略并尝试使用与用户名匹配的会话名称进行Assume Role操作,却出现了未授权错误。

aws sts assume-role --role-arn <roleARN> --role-session-name <MyUserName>

用户甚至尝试了从get-caller-identity中获取的输出,如下所示:

username=$(aws sts get-caller-identity --output text --query 'Arn' | cut -f 2 -d '/')aws sts assume-role --role-arn <roleARN> --role-session-name $username

尽管调用者身份完全是用户名,但仍然没有成功。

异常奇怪的是,当将条件设置为静态的用户名时,如果提供与该字符串完全匹配的字符串,可以成功执行Assume Role操作,这表明策略没有错误配置。

如果有其他人也遇到了这个问题,我非常好奇他们是如何解决的。能够强制执行这种策略将会非常有用。谢谢。

解决方案

问题分析

从问题描述中,我们可以看出用户遇到了一个使用AWS策略来实现AssumeRole会话名称与用户名相关的问题。用户尝试了已知的方法,但似乎没有成功。接下来,我们将提供两种可能的解决方案。

方案1:解决Policy匹配问题

用户尝试了使用${aws:username}来匹配会话名称,但似乎并没有按预期工作。问题可能出在如何在Policy中引用用户名上。

  1. 首先,确保${aws:username}是正确的引用方式,可尝试使用${aws:userid}来查看是否能解决问题。
  2. 此外,您还可以尝试在条件中使用硬编码的用户名来验证策略的有效性,如下所示:
"Condition": {
  "StringEquals": {
    "sts:RoleSessionName": "HardcodedUsername"
  }
}

如果这样的硬编码方式能够成功,那么问题可能确实出在如何正确引用用户名上。您可以查阅官方文档以确认正确的引用方式。

方案2:联系AWS支持

如果以上方案无法解决问题,您可以考虑与AWS支持团队联系。他们可以提供更深入的分析和指导,帮助您找到问题的根本原因以及可能的解决方案。

结论

尝试使用AWS策略来强制执行AssumeRole会话名称与用户名相关的操作是一个有趣的技巧,但在实际应用中可能会遇到一些问题。您可以尝试上述的两种解决方案,如果问题仍然存在,建议您与AWS支持团队取得联系以获取进一步的帮助和指导。这将有助于您充分利用AWS的安全功能。

注意: 本解决方案仅供参考,具体操作可能因AWS服务版本和配置不同而有所变化。在进行任何更改之前,请确保在非生产环境中进行测试,并且在尝试更改策略时要非常谨慎。

*请注意:以上解决方案仅供参考。在实际操作中,请根据您的环境和需求进行适当的调整。在进行任何安全相关的更改时,请务必谨慎,并在非生产环境中进行测试。*

正文完