【问题标题】:why doesn't aws:userid work as per the s3 bucket policy example?为什么 aws:userid 不能按照 s3 存储桶策略示例工作?
【发布时间】: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


【解决方案1】:

您的 listRequest.Prefix 已设置为访问密钥 (AKIAJ5GQCDM2IBBVJNWA)。

但是,{aws:userid} 解析为用户 ID,这将是您的 IAM 用户的友好名称(例如“Ryan”)。

所以,只需设置listRequest.Prefix='Ryan/'

【讨论】:

  • 据我所知,从稀疏文档中可以看出,${aws:userid} 应该是用户访问密钥,而 ${aws:username} 是友好名称,例如。像你提到的瑞恩。所以我认为我的那部分是正确的,因为我想使用唯一的访问密钥?
  • 你可以在docs.aws.amazon.com/IAM/latest/UserGuide/PolicyVariables.html底部的表格中看到这个
  • 如果我切换到使用 ${aws:username} 并提供简单的用户名而不是大 ID,这一切实际上都有效,这样进一步让我相信,当涉及到 ${aws 时,aws 存在错误:userid}
  • @Ryan,${aws:userid} 不是指访问密钥,而是用户的单独唯一 ID。访问密钥可以循环使用,但唯一 ID 始终相同。 docs.aws.amazon.com/IAM/latest/UserGuide/…
【解决方案2】:

这似乎是 AWS 文档中的一个错字。设置策略时,您需要使用aws:userId(注意大写I)。所以你的条件语句应该是:

"Condition": {"StringLike": {"s3:prefix": ["${aws:userId}/*"]}}

【讨论】:

猜你喜欢
  • 2017-05-28
  • 2021-01-19
  • 2021-08-04
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
相关资源
最近更新 更多