S3 Bucket策略中是否有必要指定资源?

43次阅读
没有评论

问题描述

在S3 Bucket策略的语句中,是否有必要包含一个资源(resource)属性?访问策略语言概述似乎暗示了资源属性总是被包含在内,尽管没有明确说明它是必需的。考虑一下在语言概述页面上显示的示例策略。

{
  "Version": "2012-10-17",
  "Id": "ExamplePolicy01",
  "Statement": [
    {
      "Sid": "ExampleStatement01",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::Account-ID:user/Dave"
      },
      "Action": [
        "s3:GetObject",
        "s3:GetBucketLocation",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::examplebucket/*",
        "arn:aws:s3:::examplebucket"
      ]
    }
  ]
}

策略被分配给一个S3 Bucket,因此看起来策略总是在分配给的桶的上下文中进行评估。基于这一点,似乎应该有可能省略资源属性。

如果资源属性确实是必需的,是否可以使用像这样的通配符ARN?这是否会带来任何风险,还是只会允许像在策略中指定了桶一样访问该桶?

(为了更清楚,我在这个问题中不是在谈论IAM策略。)

解决方案

请注意以下操作可能存在版本差异,请在操作前做好备份。

答案

在S3 Bucket策略中,资源(resource)属性是必需的。如果省略了资源属性,API将会响应类似下面的错误。

status code: 400Error putting S3 policy: MalformedPolicy: Statement is missing required element

之所以需要资源属性,是因为每个语句可以适用于桶本身、桶的内容,或桶内容的某个子集,用户需要进行明确的声明。理论上,AWS可以提供一个默认设置,包括桶及其所有内容,但可能没有选择这种设计,因为这样做会让桶策略比预期更广泛。

此外,在S3 Bucket策略的资源元素中不允许使用通配符。试图这样做会导致类似以下的错误。

Error putting S3 policy: MalformedPolicy: Policy has invalid resource

总之,资源属性的明确定义是确保策略行为的关键因素,同时,S3策略不支持使用通配符作为资源来简化授权范围。

(根据最佳回答进行整理。)

请注意,本解决方案中的操作可能因AWS的更新或策略变化而有所不同。在进行任何更改之前,请务必查阅最新的AWS文档以确保您拥有最准确和最新的信息。

正文完