问题描述
在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文档以确保您拥有最准确和最新的信息。
正文完