【问题标题】:Are AWS IAM role trust relationships comparable to resource based policies?AWS IAM 角色信任关系是否与基于资源的策略相当?
【发布时间】:2022-01-19 14:03:27
【问题描述】:

tl;如果您熟悉 IAM 角色在信任关系方面的行为,请在底部阅读。

我为描述我的问题而创建的设置:

四个角色

arn:aws:iam::<account-id>:role/A
arn:aws:iam::<account-id>:role/B
arn:aws:iam::<account-id>:role/X
arn:aws:iam::<account-id>:role/Y

还有一个用户 arn:aws:iam::&lt;account-id&gt;:user/Test 能够通过信任关系直接担任角色 AB

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<account-id>:user/Test"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

用户Test 只是为了让我轻松切换到角色AB。在下文中,我使用“担任角色 AB”作为起点,这很容易通过 CLI 上的 aws sts assume-role 完成。

角色A配置

内联政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::<account-id>:role/X",
                "arn:aws:iam::<account-id>:role/Y"
            ]
        }
    ]
}

信任关系如上所述,不应该相关。

角色 B 配置

除了上面不相关的信任关系外,没有任何额外的配置。

角色 X 配置

信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<account-id>:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

角色 Y 配置

信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<account-id>:role/B"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

总结差异:A 有权访问 XY 作为内联策略。 B 没有类似的东西,但BY 的信任关系中被明确授予。 X 只允许帐户访问,不允许特定用户访问。

A 测试

如果您假设 A 调用 aws sts get-caller-identity 应该返回类似

{
    "UserId": "<role-id>:test-session-A",
    "Account": "<account-id>",
    "Arn": "arn:aws:sts::<account-id>:assumed-role/A/test-session-A"
}

如果您现在执行aws sts assume-role --role-arn arn:aws:iam::&lt;account-id&gt;:role/X --role-session-name a-assume-x,您确实会收到带有凭据的有效响应。如果您对Y 执行相同操作,则会得到AccessDenied [...] User [...] is not authorized to perform: sts:AssumeRole [...]

这是有道理的,因为YA 没有信任关系。

与 B 的测试

如果您假设 B 调用 aws sts get-caller-identity 应该返回类似

{
    "UserId": "<role-id>:test-session-B",
    "Account": "<account-id>",
    "Arn": "arn:aws:sts::<account-id>:assumed-role/B/test-session-B"
}

现在情况正好相反。如果您尝试假设X,您会得到Access Denied 并假设Y 有效。

假设Y 工作是因为明确授予角色B。当我们首先假设 AB 与用户 Test 时,我们也会使用它。令我困惑的是,假设 X 不起作用。行为本身是有道理的。您允许帐户中的任何内容假定为 X,但您需要一个策略来授予特定用户访问权限。

tl;dr - 我的问题

如果您明确授予某个特定委托人对某个角色的访问权限,则该委托人将获得直接访问权限 - 无需额外的策略。这类似于基于资源的策略。

但是,如果您将整个帐户添加为信任关系,则其行为类似于权限边界。您可以获得访问权限,但您必须为边界内的主体创建一个策略才能实际承担。

这让我很困惑。什么是信任关系?这种行为背后的规则是什么?

额外问题:这是否也适用于其他可以建立信任关系的服务,如 Lambda 或 RDS?

【问题讨论】:

  • 不知道你对那个奖金问题的意思。您是在问其他服务的政策是否表现相同?
  • 如果您有类似 "Service": "rds.amazonaws.com" 作为主体,您还必须将角色附加到 rds 实例,然后它才能实际执行角色包含的权限。也有道理。如果也有相反的情况,那会很有趣。就像你指定了一个特定的功能而没有添加角色或承担另一方角色的权利。

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


【解决方案1】:

不确定如何回答这个问题,因为您基本上已经知道什么是信任关系。
他们指定了如何承担一个角色,特别是他们可以

  • 授予对特定实体的访问权限:角色、用户、idp、...和/或
  • 授予对特定帐户的访问权限以委派访问权限

在第一种情况下,这就是你所需要的。

在第二种情况下,您还需要一个附加策略,允许您进行assumeRole 操作。该帐户授予包括您自己的帐户。没有信任关系的角色不能由任何人担任,不在同一个帐户中,也不是跨帐户。不知道为什么会这样决定,我可以想象原因基本上是“只是因为角色在您的帐户中,并不是该帐户中的每个人都应该能够承担它”

这与例如KMS 密钥策略有效。


它们不完全符合the policy evaluation docs 中基于资源的策略的工作方式,但如果您将它们视为cross-account resource-based policies,则它们最适合,此时双方都需要授予操作权限才能真正被允许。

【讨论】:

  • 第二种情况是指主体是“arn:aws:iam:::root”,对吗?我同意在这种情况下实际上允许帐户中的任何内容都很难。但是,我认为没有其他选择。就像aws.amazon.com/de/blogs/security/… 中的声明一样,没有通配符(只有 * 除外)或类似“以 开头的角色”之类的东西 - 只有条件是可能的。因此,我的问题是这背后的规则是什么。它不是基于身份的,也不是基于资源的,两者兼而有之。感觉好像少了点什么。
  • @Bambino 在我看来,信任关系(可能还有 KMS 密钥策略)的目标可能只是更加严格,因为它们对安全至关重要,并且永远不允许每个人都使用他们只是迫使这些系统的用户始终更加具体,并考虑允许哪些用户做什么。我完全可以理解您的困惑,我只是接受这些政策的行为方式,对我来说这是有道理的。
  • @Bambino afaik 在跨账户设置中基于资源的策略要求双方都允许访问,例如存储桶所在的帐户都需要授予我访问权限,但我的角色还需要一个策略来授予我对该存储桶的 S3 操作。从这个意义上说,信任关系可以被认为类似于这种基于资源的跨账户策略。
  • 我喜欢您与跨账户设置的比较。 Afaik 它的工作原理相同,是的。另一个参考可能有助于我的困惑来自:docs.aws.amazon.com/IAM/latest/UserGuide/… - 信任关系不会出现在评估逻辑中。最接近的还是基于资源的政策。
  • @Bambino 让他们不出现是有道理的,因为最后他们只是一些特别的东西,不应该因为所有其他交互而弄乱文档。 会考虑使用具有特殊跨账户处理功能的基于资源的策略,即使这并不完美。
猜你喜欢
  • 2018-11-02
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 2020-05-29
  • 2018-06-08
  • 2020-07-28
相关资源
最近更新 更多