【问题标题】:How to write an AWS policy which can be assumed by other accounts but gives different permissions depending on which account is assuming the role?如何编写可由其他账户承担但根据承担角色的账户授予不同权限的 AWS 策略?
【发布时间】:2018-01-11 05:42:42
【问题描述】:

我有 2 个 ID 为 111111 和 222222 的 AWS 账户,我正在尝试以下操作

  • 两个账户应通过担任相同角色访问 AWS
  • 假定角色授予每个访问权限以读取/写入帐户 111111 上的 s3 存储桶
  • 帐户 111111 可以在除/production/* 之外的任何地方写信
  • 帐户 222222 只能写入 /production/*

我在账户 111111 上创建了名为 myBucket 的 s3 存储桶,并在其中设置了以下存储桶策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": "arn:aws:iam::222222:root"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetObjectVersion",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::myBucket/production/*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111111:root",
                    "arn:aws:iam::222222:root"
                ]
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::myBucket"
        }
    ]
}

然后我使用以下 IAM 策略在账户 111111 上创建一个用户

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "s3:RestoreObject",
                "s3:PutObjectAcl",
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::myBucket/*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::myBucket"
        }
    ]
}

以上内容应该足以让帐户 111111 担任该角色并能够写入 /myBucket/*/myBucket/production/* 除外,这工作正常。

当账户 222222 担任该角色时,问题就出现了。它可以做与账户 111111 相同的事情(写到 /myBucket/* 除了/myBucket/production/*),这不是本意。

我怀疑这里的问题是一旦帐户 222222 担任该角色,它似乎来自同一个帐户,但我不确定。

在这种情况下如何识别源帐户,以便我可以在帐户 222222 上设置策略,即使它已在帐户 111111 上担任角色?

【问题讨论】:

  • 第二个代码 sn-p 与第一个代码相矛盾,它允许 myBucket 下的所有内容。您说第二个是允许 1111111 采取策略,但它只是提供对存储桶的无限制访问。
  • 实际上第二个是在用户身上,虽然它确实为账户 111111 上的该用户提供了不受限制的访问权限,但 AWS DENY 策略始终优先于 ALLOW,因此用户无法在 /myBucket/production/* 下写入

标签: amazon-web-services amazon-s3 amazon-iam amazon-policy


【解决方案1】:

是的,一旦担任该角色,谁或什么担任该角色就无关紧要了。所有进一步的身份验证都基于角色,并且角色在帐户 1111111 中。

我感觉到这里有一个 XY 问题。你的要求似乎很奇怪。为什么要让两个帐户都担任该角色。这就像说您希望 2 个人让 2 个人共享钥匙,但锁的行为会因持有钥匙的人而异。更合乎逻辑的解决方案是给那里的每个人自己的钥匙。

【讨论】:

  • 原因是调用 API 的应用程序将在 2 个不同 AWS 账户上的 2 台不同机器上运行,并且该应用程序不够灵活,无法允许诸如环境变量之类的东西来配置应用程序是否应承担一个角色(在账户 222222 上运行时)或不(在账户 111111 上运行时),因此最简单的选择是让应用程序始终承担该角色并根据调用源引导 AWS 上的访问。这有意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多