我对用户制定了以下 IAM 策略
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1395161912000",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:*"
],
"Resource": [
"arn:aws:s3:::bucketname"
]
},
{
"Sid": "list",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}
目标是让用户将文件上传到存储桶,但不能覆盖或删除。它用于备份。我开始使用和ListBucket
,PutObject
但添加了,*
因为它不起作用。甚至不让*
用户上传文件,只是获取Access Denied
。
当我尝试模拟器时,它返回Denied - Implicitly denied (no matching statements found).
,ListBucket
这看起来很奇怪,因为我已经隐式允许这样做。
我已尝试使用 Cyberduck 和 3Hub 作为 S3 客户端。
知道什么地方出了问题吗?
答案1
制作时亚马逊 IAM政策亚马逊 S3,你需要知道之间的区别服务上的操作(例如列出所有我的存储桶),桶上的操作(例如列表桶) 和对象操作(例如获取对象)。
具体来说,Resource
你的策略规范需要根据以下模式针对适当的目标实体(例如,参见各种Amazon S3 的示例策略):
- 服务操作 -
arn:aws:s3:::*
- 存储桶上的操作 -
arn:aws:s3:::<bucket>
- 对象操作 -
arn:aws:s3:::<bucket>/<object>
解决方案
您遇到的Access Denied
原因是,您为指定了存储桶级别资源PutObject
,而这需要对象级别资源规范,例如arn:aws:s3:::<bucket>/*
- 因此,以下策略应该涵盖您的示例用例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": [
"arn:aws:s3:::*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucketname"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::bucketname/*"
]
}
]
}