为什么不aws:userid按照s3存储桶策略示例工作?

时间:2015-01-15 04:17:22

标签: amazon-web-services amazon-s3 amazon-iam

我因以下政策而被拒绝访问:

{
  "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}变量,但我无法找到一种方法来调试它。有什么想法吗?

2 个答案:

答案 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}/*"]}}