AWS 存储桶策略错误:策略具有无效操作

10
我有一个非常基本的目标:将我的存储桶中的所有内容分享给一组特定用户,只读。以前可以用一个名为 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"
            ]
          }
        }
      ]
    }

并得到了另一个错误提示"Action does not apply to any resource(s) in statement"。对我来说这两个错误都没有意义。如果我理解有误,请纠正我。如果我走错了方向,请帮助我。
顺便说一下,我试图按照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”时,我收到了一个错误信息。错误信息是“An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied”。
这让我感到困惑。如果我添加 ListObjects,就会得到一个“无效”的错误。如果我删除ListObjects,另一个用户就无法读取我的存储桶内容。
我该怎么办?

1
就像打打地鼠一样。 - Epirocks
2个回答

12

我怀疑策略编辑器在处理对桶的操作时变得更加智能,而不是在桶内部进行操作。

此外,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 操作的是 Bucket 中的内容

在策略中,可以将它们分别写成两个独立的语句(一个作用于 Bucket,一个作用于 Bucket 的内容),但通常以上述方式编写更为简单。


8
S3:ListObjects 看起来是文档中的错误。S3:ListBucket 是允许列出存储桶对象的操作的不幸命名。我在文档反馈中提交了这个问题。 - Michael - sqlbot
谢谢!我按照您的代码操作,现在S3接受了我的存储桶策略。但是,我仍然无法让第三个用户访问我的存储桶。我尝试运行的命令是“aws s3 ls s3://examplebucket”,我得到的错误是“调用ListObjects操作时发生错误(AccessDenied):拒绝访问”。第三个用户需要做些什么吗? - fanchyna
1
继续我的上一个评论,s3:ListObjects 显然是文档错误。该操作不再出现在链接页面上。 - Michael - sqlbot

3

授予另一个账户用户访问存储桶的权限有两个部分。

  1. 在存储桶上设置正确的策略。
  2. 允许其他账户中的IAM用户对存储桶执行必要的操作。

这似乎是冗余的,但两者都是必需的。

此外,ListObjects操作有些具有迷惑性,特别是awspolicygen工具也将其列为一项权限。然而,在S3权限文档中,您会发现ListObjects实际上是由ListBucket权限控制的操作。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接