我将按照本教程从头到尾地讲解如何授予单个用户对存储桶的访问权限。
我的策略看起来和他们的一模一样:
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "AllowGroupToSeeBucketListInTheConsole",
"Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::*"]
},
{
"Sid": "AllowRootAndHomeListingOfCompanyBucket",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::my-company"],
"Condition":{"StringEquals":{"s3:prefix":["","/"],"s3:delimiter":["/"]}}
},
{
"Sid": "AllowListingOfUserFolder",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::my-company"],
"Condition":{"StringLike":{"s3:prefix":["home/${aws:username}/*"]}}
},
{
"Sid": "AllowAllS3ActionsInUserFolder",
"Action":["s3:*"],
"Effect":"Allow",
"Resource": ["arn:aws:s3:::my-company/home/${aws:username}/*"]
}
]
}
我有用户名bob
与策略妥善保存到他的IAM帐户。
我可以登录到帐户,并看到所有可用的桶与bob
作为一个用户。但是如果我尝试访问my-company
桶,我得到Site says : Access Denied
。
我在这里错过了什么?
这是由于一些第三方S3客户端发出ListBucket请求以列出bucket根,而根本没有提供"前缀"。这将导致"拒绝访问",因为这篇博文中的策略期望"前缀"是"、"home/"或用户的主目录,而不是完全不存在。
如果遇到这样的问题,添加以下块来授权此请求。
修复:
{
"Sid": "AllowRootListingWithoutPrefix",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-company"
],
"Condition": {
"Null": {
"s3:prefix": "true"
},
"StringEquals": {
"s3:delimiter": [
"/"
]
}
}
}