在 IAM 角色策略中定位联合 SAML 用户

Targetting federated SAML users in IAM role policies

我们目前正在使用 G Suite 作为我们的 AWS SAML 访问的 IDP,它在少数账户中承担一个角色,让我们的 G Suite 用户可以访问某些 AWS 资源。每个帐户都有一个名称相似的角色,G Suite 用户可以担任该角色,以授予他们访问该帐户中某些资源的权限,这些资源都按预期工作。

我正在研究是否可以配置该代入角色,以便为某些用户提供对某些资源的更细粒度的访问权限,而不必在 G Suite 本身内为不同用户分配完全不同的角色。

例如,如果在帐户中承担的角色称为 "assumed_gsuite_ro" 并且不授予对 IAM 的访问权限,您会在 IAM 控制台中收到如下错误:

User: arn:aws:sts::0012345678900:assumed-role/assumed_gsuite_ro/matt@domain.com is not authorized to perform: iam:GetAccountSummary on resource: *

所以我想在 assumed_gsuite_ro 角色策略中添加这样的内容,以便仅允许我的联合用户访问 IAM 中的内容:

...
{
    "Sid": "IAMTest",
    "Effect": "Allow",
    "Action": [
        "iam:GetAccountSummary",
        "iam:ListAccountAliases"
    ],
    "Resource": "*",
    "Condition": {
        "ArnEquals": {
            "aws:SourceArn": "arn:aws:sts::0012345678900:assumed-role/assumed_gsuite_ro/matt@domain.com"
        }
    }
}
...

但是,这不起作用,因为显然 SourceArn 不匹配。我可以使用的条件值是否允许我定位 AWS 似乎知道的特定联合用户?我在想 aws:userid 或 aws:username 之类的东西可能会起作用,但我不确定在这种情况下它们的值是什么。

深入研究并在 AWS 文档中找到 this page,其中描述了 aws:userid 的值是如何在 SAML/federated 上下文中构成的,我确定了以下内容作品:

"Condition": {
    "StringLike": {
        "aws:userid": "AROAROLEID:matt@domain.com"
    }
}

其中 AROAROLEID 是您担任的角色名称的 "role ID" 的值(在我的示例中为 assumed_gsuite_ro),根据 this page 您只能从对 AWS CLI 的 get-role 调用中获取(它是 RoleId 的值)。