首页 文章

AWS Bucket Policy Error:策略具有无效操作

提问于
浏览
4

我有一个非常基本的目标:将我的存储桶的所有内容分享给特定用户列表,只读 . 这曾经使用一个名为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 回答

  • 6

    我怀疑当涉及到操作 on buckets 而不是 within buckets 的操作时,策略编辑器变得更聪明了 .

    此外, 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 对存储桶的内容进行操作 .

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

  • 2

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

    • 在存储桶上设置正确的策略 .

    • 允许其他帐户中的IAM用户对存储桶执行必要的操作 .

    这似乎是多余的,但两者都是必需的 .

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

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

相关问题