【问题标题】:List S3 buckets by bucket policies按存储桶策略列出 S3 存储桶
【发布时间】:2021-01-19 23:05:45
【问题描述】:

我的 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 开发工具包。使用它,您可以自动化该过程。这是Boto3 AWS S3 python SDK的链接
  • 您是要授予他们对每个存储桶的访问权限,还是仅授予对存储桶子集的访问权限?如果它是一个子集,如何识别它们(例如它们是否都具有相同的桶前缀)?您目前如何根据员工 ID 授予访问权限?什么是 P-EID?
  • @anuragal,我们可以根据 S3 存储桶策略中的内容过滤 S3 存储桶吗?
  • @JohnRotenstein,不完全是。它仅适用于具有特定访问权限的存储桶。我更新了描述,请看一下。没有子集,P-EID 是某种特殊的 id,就像 eid 一样。

标签: amazon-web-services amazon-s3 boto3 aws-policies


【解决方案1】:

您需要创建快速脚本并为此使用 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

Source

【讨论】:

  • 如果我只依赖策略检索,这会很有用。因为,我正在寻找更新策略,所以我再次检查了每个文件并更新它,这似乎不是一个自动化的解决方案。如果有任何自动化解决方案可以列出按存储桶策略过滤的存储桶并更新它们,我会很高兴。
  • 我不确定是否有一个自动化的解决方案,你会找到量身定制的,但我提到的是,如果你创建自己的脚本来自动化它,你可以如何去做。列出存储桶并将列表另存为文件> 有一个函数,然后循环遍历存储桶列表,获取每个存储桶的策略,如果它匹配某个条件,则将它们放在单独的列表中,然后你有第三个函数来仅更新目标列表的策略。我可以理解,您自己实现此功能可能会面临时间压力,因为编写脚本可能需要几个小时。
  • 但是,话虽如此,我肯定会同意@John-Rotenstein 发布的另一个答案,他提到使用 IAM 策略,因为这将是在 AWS 中管理权限的正确组织方法。
  • 我会尝试并弄清楚我们是否可以使用 boto3 来实现它,或者会遵循上述做法。 get-bucket-policy>输出到文件>rea​​d-json-files>make-required-changes>put-bucket-policy。感谢您的宝贵时间
【解决方案2】:

作为一般规则:

  • 使用 IAM 策略 将存储桶权限分配给 IAM 实体(例如 IAM 用户、IAM 角色、IAM 组),
  • 使用 Amazon S3 存储桶策略 授予对内容的公开访问权限

通过将策略放在 IAM 实体上,而不是在每个 S3 存储桶上添加权限,通常更容易授予 IAM 实体权限。

因此,您可以创建将 IAM 策略添加到四个 IAM 角色dev-eiddev-p-eidprod-eidprod-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 政策,但我们需要更新政策以删除现有权限。这是另一个原因,我正在寻找自动化脚本。
猜你喜欢
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 2023-03-31
  • 2021-03-31
  • 2020-11-05
  • 2013-12-21
相关资源
最近更新 更多