【发布时间】:2019-11-05 04:26:44
【问题描述】:
我因以下政策而被拒绝访问:
{
"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))
{
...
}
我可以让它工作的唯一方法是手动将用户 ID 放入策略中以代替 ${aws:userid},或者对所有内容进行通配符,以便用户可以访问任何存储桶。我已验证我的存储桶存在并且没有附加任何政策。
似乎 aws 可能没有正确扩展 ${aws:userid} 变量,但我想不出一种调试方法。有什么想法吗?
【问题讨论】:
-
另外,我应该提到它在模拟器中有效,但在我使用 AWSSDK 时无效。我不知道如何使用 .NET SDK 查看 arn,所以我无法验证有什么区别。它们是两个完全不同的界面。
-
更新:我意识到我使用的是旧版本的 AWSSDK,所以我尝试更新我的 AWSSDK 并修复我的代码以匹配,但我仍然遇到同样的问题。
标签: amazon-web-services amazon-s3 amazon-iam