Json 亚马逊S3桶政策,我做错了什么?

Json 亚马逊S3桶政策,我做错了什么?,json,amazon-web-services,amazon-s3,Json,Amazon Web Services,Amazon S3,我使用创建一个简单的规则为我的桶;规则应允许以下预期效果: 根访问 限制对给定IAM用户的访问 允许对所有人进行只读访问 为此,我编写了以下规则,但有些规则没有按预期工作,特别是,我完全失去了对bucket元素的访问权限,在所有情况下都被“拒绝访问”,包括: 编辑:使用@jarmod answer,我可以设置预期的功能,但是它会触发一个警告,关于bucket是公共的,我看不出有什么区别。在没有策略的情况下,bucket仍然可以以只读方式公开访问。有什么区别 也许您可以按如下方式执行此操作:

我使用创建一个简单的规则为我的桶;规则应允许以下预期效果:

  • 根访问
  • 限制对给定IAM用户的访问
  • 允许对所有人进行只读访问
为此,我编写了以下规则,但有些规则没有按预期工作,特别是,我完全失去了对bucket元素的访问权限,在所有情况下都被“拒绝访问”,包括:

编辑:使用@jarmod answer,我可以设置预期的功能,但是它会触发一个警告,关于bucket是公共的,我看不出有什么区别。在没有策略的情况下,bucket仍然可以以只读方式公开访问。有什么区别


也许您可以按如下方式执行此操作:

  • 对于所有用户,允许操作s3:GetObject
  • 对于除root用户和特定IAM用户之外的所有用户,拒绝除s3:GetObject之外的所有操作
  • 您可以使用类似以下内容的策略:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": [
                    "arn:aws:s3:::mybucket/*"
                ]
            },
            {
                "Effect": "Deny",
                "Principal": "*",
                "NotAction": "s3:GetObject",
                "Resource": [
                    "arn:aws:s3:::mybucket/*"
                ],
                "Condition": {
                    "StringNotLike": {
                        "aws:userId": [
                            "iam-userid-here",
                            "root-userid-here"
                        ]
                    }
                }
            }
        ]
    }
    
    要在此处获取
    iam用户ID
    ,请运行
    aws iam list users
    ,然后检索iam用户的用户ID

    同样,要在此处获取
    根用户ID
    ,只需从先前
    aws iam列表用户的Arn中检索账号即可。根帐户用户ID是AWS帐户号


    此处由
    IAM userid指示的IAM用户可以拥有允许S3访问的IAM策略。

    显式拒绝>显式允许>隐式拒绝。您的第一条和第二条语句应该被删除,并且您缺少一条允许“对所有人进行只读访问”的语句。@jarmod所以root是隐式允许的?我正在阅读,在这个示例中,他们为其他所有人设置了
    deny*
    ,并指定允许根访问。您不能有deny*和allow x,因为deny*是显式的,并且超过了所有允许。Root拥有对所有内容的隐式访问权限,但您不应该对任何内容使用Root凭据(请参阅AWS针对Root用户的最佳实践)。如果我阅读的是正确的示例,则您所指的指南中的拒绝示例具有条件策略语句,拒绝除特定角色和Root用户之外的所有访问权限。如果您特别希望覆盖S3 bucket的IAM级别权限,则可以使用此选项(例如,您可以拒绝实际拥有该bucket权限的IAM用户的访问)。据我所知,这不是你想做的,所以这项政策是不相关的。@jarmod是的,先生!根据我在列表中的第二个点,我试图限制对给定IAM用户的访问。这部分是有效的,允许所有人只读,我的意思是,也允许未登录的用户,如公共来宾。在bucket中,我上传了我想要共享的文件,提供了URL,而我的root用户和IAM用户可以访问该bucket,公众访问者被拒绝访问该文件。我不确定你的评论是什么意思。您是说您希望提供对对象的公共读取访问,但不允许IAM用户(除一个特定用户外)读取它们?若然,原因为何?给予公众阅读权限当然意味着每个人。我误读了您共享的代码,使用的工具我无法设置
    NotAction
    ,并且一开始无法工作。我想创建一个共享文件夹来发送文件,IAM用户是一个上传文件的应用程序。我只是想知道为什么它将bucket标记为public,而它也可以在没有策略的情况下访问。我假设您指的是AWS S3控制台如何强调bucket是public这一事实。如果没有某种形式的策略允许,bucket内容将无法公开访问。如果您说您可以访问,并且浏览器成功下载或显示了您的文件,那么S3对象是公开的。它是公共的,因为要么有一个bucket策略将其公开,要么有对象级ACL将其公开。