AWS S3 拒绝除 1 个用户之外的所有访问 - 存储桶策略

Posted

技术标签:

【中文标题】AWS S3 拒绝除 1 个用户之外的所有访问 - 存储桶策略【英文标题】:AWS S3 deny all access except for 1 user - bucket policy 【发布时间】:2017-02-12 19:21:24 【问题描述】:

我在 AWS S3 中设置了一个存储桶。我使用 ALLOW 策略(使用存储桶策略编辑器)为我的 IAM 用户授予了对存储桶的访问权限。我能够与用户一起将文件保存到存储桶中。我之前一直在使用存储桶进行媒体服务,因此默认操作似乎是授予公众查看文件(图像)的权限,这对于大多数网站来说都很好。

在我的新项目中,我希望能够使用 IAM 用户访问 S3 存储桶,但希望拒绝所有其他访问。没有公共读取访问权限,除了应该具有完全访问权限的 IAM 用户之外没有任何访问权限保存/删除任何内容。

我应该怎么做,我正在阅读关于 here 的信息。它说使用NotPrincipal 属性创建Deny 策略,这样它仍然允许该用户,但拒绝其他所有人。为了更好地衡量,我还为我想要的用户添加了一个 Allow 策略:


    "Version": "2012-10-17",
    "Id": "Policy**********",
    "Statement": [
        
            "Sid": "Stmt**********",
            "Effect": "Deny",
            "NotPrincipal": 
                "AWS": "arn:aws:iam::*********:user/my_user"
            ,
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my_bucket/*"
        ,
        
            "Sid": "Stmt*************",
            "Effect": "Allow",
            "Principal": 
                "AWS": "arn:aws:iam::**********:user/my_user"
            ,
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my_bucket/*"
        
    ]

但这会拒绝所有人访问,即使是my_user。我可以再次确认,当我刚刚使用上述策略的 Allow 部分时我拥有访问权限,但随后公众也拥有读取访问权限,我正试图将其关闭。

如何设置我的存储桶策略以仅授予唯一的 IAM 用户完全访问权限并拒绝任何其他用户的所有访问权限?

谢谢。

【问题讨论】:

具体来说,“my_user”是如何访问存储桶的? 【参考方案1】:

很简单:

默认情况下,存储桶没有公共访问权限 不要添加存储桶策略,因为您不想授予访问公共访问权限 相反,向 IAM 用户添加策略授予他们访问权限

要意识到的主要事情是 IAM 用户无法通过未经身份验证的 URL(例如 s3.amazonaws.com/bucket/file.jpg)访问内容,因为 S3 不知道他们是谁。当 IAM 用户访问内容时,他们将需要使用 authenticated access 以便 S3 知道他们是谁,例如:

使用用户名 + 密码通过 AWS 管理控制台访问 使用访问密钥 + 密钥通过 AWS Command-Line Interface (CLI) 访问

有关 IAM 用户的政策类似于:


  "Effect": "Allow",
  "Action": "s3:*",
  "Resource": [
    "arn:aws:s3:::my_bucket",
    "arn:aws:s3:::my_bucket/*"
  ]

【讨论】:

那太好了,谢谢。我会试试的。我注意到在Resource 中添加这两行很重要。我尝试了上面的设置,并通过网络界面失去了对存储桶的控制......所以这不是正确的方式。 我创建了一个新的存储桶,没有提供存储桶策略,并像您一样添加了 IAM 策略,并且该用户可以正常工作。但是,当我获取照片的 url 并将其放入浏览器时,我也可以通过这种方式访问​​它。这就是我试图关闭的。因此,默认情况下,整个存储桶似乎都具有公共访问权限。你觉得这对吗? 如果对象仍可通过匿名 URL 公开访问,则检查对象本身并确保其未定义“所有人”权限。这是因为可以在对象、存储桶或用户级别授予权限。也可以在其他浏览器或隐身窗口中尝试,以防某些内容被缓存。哦,不要使用“Actions->Open”命令,因为这会生成一个预签名 URL,授予临时访问权限。相反,请单击“属性”窗格中显示的蓝色链接,该链接是匿名的。 非常感谢。正在发生的事情就是你所建议的。每个单独的文件都具有“Everybody”权限,而存储桶则没有。当我关闭这些文件时,这些文件就会变为私有文件。所以看来这就是问题所在。你知道如何设置这种行为吗?似乎默认授予此权限。 可以在上传对象时授予 PUBLIC-READ 访问权限(这意味着每个人都可以查看/下载对象),因此请检查文件如何进入 S3 以及有哪些选项正在设置中。【参考方案2】:

如果我理解正确,请仅允许 1 位 IAM 用户访问 buket。我们可以使用存储桶策略。我在 netApp 文档中得到了这个。


  "Statement": [
    
      "Effect": "Allow",
      "Principal": 
        "AWS": "arn:aws:iam::95390887230002558202:federated-user/Bob"
      ,
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::examplebucket",
        "arn:aws:s3:::examplebucket/*"
      ]
    ,
    
      "Effect": "Deny",
      "NotPrincipal": 
        "AWS": "arn:aws:iam::95390887230002558202:federated-user/Bob"
      ,
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::examplebucket",
        "arn:aws:s3:::examplebucket/*"
      ]
    
  ]

【讨论】:

以上是关于AWS S3 拒绝除 1 个用户之外的所有访问 - 存储桶策略的主要内容,如果未能解决你的问题,请参考以下文章

拒绝除一个之外的所有存储桶的 AWS IAM 策略

S3 拒绝管理员访问

在 AWS 上拒绝除 cloudwatch 之外的所有出站流量

尽管用户角色,AWS Batch 作业在 S3 上被拒绝访问

AWS S3 Sync - 结算报表GetObject(拒绝访问)

拒绝访问除索引文件之外的所有文件 - Apache2