按存储桶策略列出 S3 存储桶

3

我在我的AWS账户中有400多个存储桶,其中一些可以被使用用户组dev-user-groupprod-user-group的用户访问。一些S3存储桶的策略如下:

"aws:arn": [
     "arn:aws:sts::123XXXXX43:assumed-role/dev-user-group/*"
     "arn:aws:sts::123XXXXX43:assumed-role/prod-user-group/*"
]

现在,我们想将其更改为以下内容。
"aws:arn": [
     "arn:aws:sts::123XXXXX43:assumed-role/dev-eid/*"
     "arn:aws:sts::123XXXXX43:assumed-role/dev-p-eid/*"
     "arn:aws:sts::123XXXXX43:assumed-role/prod-eid/*"
     "arn:aws:sts::123XXXXX43:assumed-role/prod-p-eid/*"
]

一些存储桶只有其中一个访问权限,而另一些则没有任何访问权限。我们希望使用脚本自动化更新存储桶策略的过程,使脚本检查存储桶策略中是否定义了dev-user-groupprod-user-group。如果是,则应将其删除并添加新的策略。希望我表达得更清楚了。请给我提出建议。

尝试使用Boto3,AWS SDK。使用它可以自动化这个过程。这是Boto3 AWS S3 python SDK的链接。 - anuragal
你想要给他们访问“每一个”存储桶的权限,还是只是一部分存储桶的权限?如果是一部分,如何识别它们(例如,它们是否都有相同的存储桶前缀)?目前你是根据员工ID来授予访问权限的吗?什么是P-EID? - John Rotenstein
@anuragal,我们能否根据S3存储桶策略中的内容来过滤S3存储桶? - Arvin
@JohnRotenstein,不完全是这样。这只适用于具有特定访问权限的存储桶。我已更新描述,请查看一下。 没有子集合,P-EID是一种类似于eid的特殊标识符。 - Arvin
2个回答

2
作为一般规则:
  • 使用IAM策略将存储桶权限分配给IAM实体(例如IAM用户、IAM角色、IAM组),或者
  • 使用Amazon S3存储桶策略授予公共内容访问权限
通常,通过在IAM实体上放置策略来授予IAM实体权限要容易得多,而不是在每个S3存储桶上添加权限。
因此,您可以创建将IAM策略添加到四个IAM角色中 (dev-eid, dev-p-eid, prod-eid, prod-p-eid),以授予它们对存储桶的权限。它看起来像这样:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::bucket1",
                "arn:aws:s3:::bucket2",
                "arn:aws:s3:::bucket3",
                "arn:aws:s3:::bucket4",
                "arn:aws:s3:::bucket5",
                "arn:aws:s3:::bucket6",
                "arn:aws:s3:::bucket7",
                "arn:aws:s3:::bucket8"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::bucket1/*",
                "arn:aws:s3:::bucket2/*",
                "arn:aws:s3:::bucket3/*",
                "arn:aws:s3:::bucket4/*",
                "arn:aws:s3:::bucket5/*",
                "arn:aws:s3:::bucket6/*",
                "arn:aws:s3:::bucket7/*",
                "arn:aws:s3:::bucket8/*"
            ]
        }
    ]
}

由于策略允许的大小限制,您可能会遇到限制,因此可能需要多个策略(或者根据您有这么多存储桶,根本无法工作)。更简单的方法是通过前缀引用存储桶。例如:
"arn:aws:s3:::dev-*"

以这种方式,您可以在任何以dev-*开头的存储桶上授予权限,因此策略实际上会非常简短(假设您的存储桶可以轻松地以这种方式分组)。

我同意这种做法。我们可以遵循用户的 IAM 策略,但我们需要更新策略以删除现有的权限。 这也是我寻找自动化脚本的另一个原因。 - Arvin

2
你需要创建一个快速脚本并使用aws cli。
该脚本将首先列出您在帐户中拥有的所有存储桶aws s3 ls,然后保存该列表并使用以下命令循环遍历存储桶列表,该命令将以json文件输出策略。
aws s3api get-bucket-policy --bucket mybucket --query Policy --output text > policy.json

您可以根据需要修改policy.json文件。最后,您可以通过运行以下命令将修改后的策略应用于S3存储桶:
aws s3api put-bucket-policy --bucket mybucket --policy file://policy.json

来源


如果我只依赖策略检索,这将非常有用。因为我正在寻找更新策略,所以我必须再次浏览每个文件并进行更新,这似乎不是一个自动化的解决方案。 如果有任何自动化解决方案可以列出按存储桶策略过滤的存储桶并进行更新,我将非常高兴。 - Arvin
1
我不确定是否有一个自动化的解决方案,可以为您找到一个定制的解决方案,但是我提到的是如果您创建自己的脚本来自动化这个过程的方法。列出存储桶并将列表保存为文件>编写一个函数循环遍历存储桶列表,获取每个存储桶的策略,如果符合特定条件,则将其放入一个单独的列表中,然后使用第三个函数仅更新目标列表的策略。我理解您可能在时间上有压力,需要自己实现这个功能,因为编写脚本可能需要几个小时。 - Abba
然而,话虽如此,我绝对同意@John-Rotenstein提到的另一个答案,他建议使用IAM策略来管理AWS中的权限,因为这是正确的组织方法。 - Abba
我会尝试弄清楚我们是否可以用boto3实现,或者遵循上述的做法。获取存储桶策略>输出到文件>读取JSON文件>进行必要的更改>设置存储桶策略。 谢谢您的时间。 - Arvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接