AWS Bucket Policy Error:策略的行为无效

时间:2017-12-08 04:33:18

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

我有一个非常基本的目标:将我的存储桶的所有内容分享到特定用户列表,只读。这曾经使用一个名为s3cmd的工具。我需要做的就是将用户(通过电子邮件识别)添加到具有读取权限的访问控制列表中,他们可以顺利地列出或下载数据。

但是最近,这突然间不再起作用了。系统只是拒绝任何访问我的存储桶的尝试。

然后我开始考虑编辑存储桶策略。以下是我的策略草案,由策略生成器生成(敏感信息是匿名的):

{
  "Id": "Policy123456789",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1512705836469",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:ListObjects"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::mybucketname",
      "Principal": {
        "AWS": [
          "arn:aws:iam::anotheruserid:user/admin"
        ]
      }
    }
  ]
}

当我点击“保存”时,我收到“策略有无效操作”错误。然后我尝试删除“ListObjects”,以便策略变为

{
  "Id": "Policy123456789",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1512705836469",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::mybucketname",
      "Principal": {
        "AWS": [
          "arn:aws:iam::anotheruserid:user/admin"
        ]
      }
    }
  ]
}

并收到另一条错误消息“操作不适用于语句中的任何资源”。这两个错误对我来说没有意义。如果我错了,请纠正我。如果我没有朝着正确的方向前进,请帮助我。

顺便说一下:我试着按照教程进行操作 http://docs.aws.amazon.com/AmazonS3/latest/dev/example-walkthroughs-managing-access-example2.html 但没有成功。通过使用以下存储桶策略:

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "Example permissions",
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::AccountB-ID:root"
         },
         "Action": [
            "s3:GetBucketLocation",
            "s3:ListBucket"
         ],
         "Resource": [
            "arn:aws:s3:::examplebucket"
         ]
      }
   ]
}

使用AccountB的awscli执行“aws s3 ls s3:// examplebucket”时收到错误消息。错误消息是“调用ListObjects操作时发生错误(AccessDenied):访问被拒绝”。这让我很困惑。如果我添加ListObjects,我收到“无效”错误。如果我删除“ListObjects”,则另一个用户无法读取我的存储桶内容。

我该怎么办?

2 个答案:

答案 0 :(得分:6)

我怀疑策略编辑器在运行在存储桶上的操作时变得更聪明,而不是在存储桶中

此外,ListObjects似乎让人感到不安,所以请不要这样做。

此策略允许列出存储桶的内容和检索的对象:

{
    "Id": "Policy1",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ],
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/user-name"
            }
        }
    ]
}

ListBucket在Bucket上运作。

GetObject对存储桶的内容进行操作。

它可以写成策略中的两个单独的语句(一个在存储桶上,一个在存储桶的内容上),但通常更容易按上面的方式编写它。

答案 1 :(得分:2)

granting bucket access to a user in another account分为两部分。

  1. 在存储桶上设置正确的策略。
  2. 允许其他帐户中的IAM用户对存储桶执行必要的操作。
  3. 这似乎是多余的,但两者都是必需的。

    此外,ListObjects操作是欺骗性的,尤其是awspolicygen tool也将其列为权限。但是,在documentation about S3 permissions中,您会发现ListObjects实际上是由ListBucket权限控制的操作。

    在您提供的第二个示例中,我怀疑您不成功的原因是因为请求用户可能没有您的存储区的ListBucket权限。此外,我确实认为您的方案并不严格要求GetBucketLocation,但是如果您希望他们从存储桶中获取项目,则需要授予GetObject权限。