我有一个客户端,我希望能够上传文件,但不能在我的 S3 存储桶中自由导航。我为他们创建了一个 IAM 用户账户,并应用了以下策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1416387009000",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": [
"arn:aws:s3:::*"
]
},
{
"Sid": "Stmt1416387127000",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::progress"
]
},
{
"Sid": "Stmt1416387056000",
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::progress/*"
]
}
]
}
有三种说法:
- 能够列出所有存储桶(否则他们在登录时无法在 S3 控制台中看到任何内容)
- 能够列出进度存储桶的内容
- 能够将对象放入进度存储桶
用户可以使用其用户名和密码(以及我的自定义账户 URL,即 https://account.signin.aws.amazon.com/console)登录 AWS 控制台。他们可以转到控制台的 S3 部分,并查看我所有存储桶的列表。但是,如果他们单击进度,则只会收到以下错误消息:
不好意思!您被拒绝执行此操作。
我已经通过 IAM 策略模拟器检查了用户是否对存储桶的 ARN (arn:aws:s3:::progress
) 具有ListBucket
权限,并且策略模拟器说应该允许用户。
我已经注销并再次作为目标用户登录,以防策略仅在注销时刷新,但仍然没有乐趣。
我做错了什么?我错过了什么吗?
我的猜测是,在使用 AWS 控制台时,会进行另一个调用以获取存储桶位置,然后才能列出该存储桶中的对象,并且用户无权进行该调用。您还需要授予他的帐户访问权限 GetBucketLocation
.文档中的相关文本
当您使用 Amazon S3 控制台时,请注意,当您单击存储桶时, 控制台首先发送 GET 存储桶位置请求以查找 部署存储桶的 AWS 区域。然后控制台使用 存储桶用于发送 GET 存储桶的区域特定终端节点 (列表 对象)请求。因此,如果用户要使用控制台, 您必须授予 s3:GetBucketLocation 操作的权限,如下所示 在以下策略声明中:
{
"Sid": "RequiredByS3Console",
"Action": ["s3:GetBucketLocation"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::*"]
}