我因以下政策而被拒绝访问:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "InsideUserBucket",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::cbd-backup-us-east-1/${aws:userid}", "arn:aws:s3:::cbd-backup-us-east-1/${aws:userid}/*"
]
},
{
"Sid": "ListBucketPolicy",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::cbd-backup-us-east-1"
],
"Condition": {"StringLike": {"s3:prefix": ["${aws:userid}/*"]}}
}
]
}
我使用成功连接的客户端“m_client”通过.NET AWSSDK连接,该客户端使用IAM用户凭据连接。用户在一个组中,该组具有上述策略。我没有使用ACL。我试过没有设置前缀。
ListObjectsRequest listRequest = new ListObjectsRequest();
listRequest.BucketName = "cbd-backup-us-east-1";
listRequest.Prefix = "AKIAJ5GQCDM2IBBVJNWA/";
using (ListObjectsResponse listResponse = m_client.ListObjects(listRequest))
{
...
}
我能让它工作的唯一方法是手动将userid放入策略中代替$ {aws:userid},或者通配一切,以便用户可以访问任何存储桶。我已经验证了我的存储桶存在且没有附加政策。
似乎aws可能没有正确扩展$ {aws:userid}变量,但我无法找到一种方法来调试它。有什么想法吗?
答案 0 :(得分:0)
您的listRequest.Prefix
设置为访问密钥(AKIAJ5GQCDM2IBBVJNWA)。
但是,{aws:userid}
解析为用户ID,这将是您的IAM用户的友好名称(例如“Ryan”)。
所以,只需设置listRequest.Prefix='Ryan/'
。
答案 1 :(得分:0)
这似乎是AWS文档中的错字。设置策略时,您需要使用aws:userId
(注意大写的I
)。因此,您的条件声明应为:
"Condition": {"StringLike": {"s3:prefix": ["${aws:userId}/*"]}}