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

Posted

技术标签:

【中文标题】AWS 存储桶策略错误:策略具有无效操作【英文标题】:AWS Bucket Policy Error: Policy has invalid action 【发布时间】:2018-05-22 07:26:34 【问题描述】:

我有一个非常基本的目标:将我存储桶中的所有内容共享给特定用户的列表,只读。这曾经与一个名为 s3cmd 的工具一起工作。我只需要在Access Control List with Read Permission添加一个用户(通过电子邮件识别),他们就可以顺利列出或下载数据了。

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

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

    
      "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"
            ]
          
        
      ]
    

当我点击 save 时,我收到“Policy has invalid action”错误。然后我尝试删除“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,我会得到一个 "invalid" error。 如果我删除“ListObjects”,其他用户将无法读取我的存储桶内容。

我该怎么办?

【问题讨论】:

这就像打地鼠 【参考方案1】:

我怀疑策略编辑器在在存储桶上而不是在存储桶内操作的操作方面变得更加智能。

另外,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 对桶的内容进行操作。

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

【讨论】:

s3:ListObjects 似乎是文档错误。 s3:ListBucket 是允许在存储桶中列出对象的操作的不幸名称。我提交了一份文档反馈。 谢谢!我遵循了您的代码,现在 S3 接受了我的存储桶策略。但是,我仍然无法让第三个用户访问我的存储桶。我尝试运行的命令是“aws s3 ls s3://examplebucket”,而我得到的错误是“调用 ListObjects 操作时发生错误(AccessDenied):访问被拒绝”。第三个用户有什么需要做的吗? 在我之前的评论之后,s3:ListObjects 显然确实是一个文档错误。该操作不再出现在链接页面上。【参考方案2】:

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

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

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

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

在您提供的第二个示例中,我怀疑您失败的原因是请求用户可能没有您的存储桶的 ListBucket 权限。此外,我相信 GetBucketLocation 不是您的场景所严格要求的,但是如果您希望他们从存储桶中获取项目,您需要授予 GetObject 权限。

【讨论】:

以上是关于AWS 存储桶策略错误:策略具有无效操作的主要内容,如果未能解决你的问题,请参考以下文章

s3 存储桶策略 chrome 错误

AWS CloudTrail Create API for Go SDK 引发错误消息“InsufficientS3BucketPolicyException:检测到存储桶的 S3 存储桶策略不正确:

AWS S3 存储桶 CORS 策略错误:请求的资源上不存在“Access-Control-Allow-Origin”标头

AWS S3:更改策略后无法列出存储桶

如何使用 AWS S3 存储桶策略强制执行文件类型上传

允许用户访问特定 S3 存储桶进行备份的 AWS IAM 策略