【问题标题】:How to configure S3 bucket policies for my app如何为我的应用配置 S3 存储桶策略
【发布时间】:2020-09-18 09:54:13
【问题描述】:

我有一个名为 prod 的存储桶,其目录树如下所示:

prod
 logs
 uploads
  user
   doc
    1
     a.jpg
     b.jpg
    2
     a.jpg
     b.jpg
  thing
   photos
    1
     a.jpg
     b.jpg
    2
     a.jpg
     b.jpg

thing/photos 中的所有内容都应该是公开的。 GET 请求应该允许每个人使用,但 PUTPOST 请求应该只在用户通过我的应用上传文件时才允许。

另一方面,user/doc 目录,我想完全保密。通过我的应用程序上传文件的用户应该允许POST 请求,但唯一应该能够GET 这些资源的人是管理员。该数据在存储之前已加密,但我想确保公众或我的应用程序的其他用户无法访问该文件夹。

在阅读了A deep dive into AWS S3 access controls – taking full control over your assetsACLs - What Permissions Can I Grant? 之后,我仍然对如何完成我想要的事情感到困惑。重叠的访问控制让我感到困惑,而且我找不到以面向操作的方法解释这些的教程。考虑到由于 S3 存储桶策略设置不当导致的数据泄漏的数量,我似乎不是唯一一个误解这一点的人。

您的政策是如何制定的?你有比我找到的更好的教程的链接吗?谢谢!

【问题讨论】:

  • 您的第一个问题是在同一个 S3 存储桶中混合私有和公共内容。这增加了政策错误的可能性和后果。
  • 您会建议一个完全用于私人内容的单独存储桶吗?
  • 是的,我会避免在同一个存储桶中混合私有和公共内容。如果可以,将公共内容移动到专用的 S3 存储桶。然后,您可以轻松地在该存储桶上应用 S3 存储桶策略以允许公共访问。您不需要另一个私有存储桶上的 S3 存储桶策略。您的应用程序将通过 IAM 角色获得权限。
  • 因此,如果我有两个存储桶——一个关闭了“阻止所有公共访问”,一个打开了它——我是否需要担心对第一个(公共)存储桶的未经授权的写入? S3 文档和相关材料让我担心会发生这种情况
  • 阻止公共访问设置不会启用对存储桶的任何访问。他们只是确定是否可以将给定的存储桶配置为允许公共访问。要允许对存储桶中的对象进行公共读取访问,请禁用该存储桶的 BPA,然后向该存储桶添加一个策略,允许每个人对存储桶的对象发出 GetObject(AWS 站点上记录了许多示例存储桶策略,可以帮助解决这个问题)。

标签: amazon-web-services amazon-s3


【解决方案1】:

默认情况下,Amazon S3 存储桶是私有的。因此,只有在您专门配置了访问权限时,才能访问。

thing/photos 中的所有内容都应该公开

如果您希望公开整个存储桶或存储桶的一部分,请使用存储桶政策

复制@avlazarov 的回答:

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"Example",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/things/photos/*"]
      }
  ]
}

这意味着:

  • 允许任何人
  • GetObject,意思是读取一个对象
  • 只要在名为examplebucket的bucket中,在things/photos/路径中

请注意,他们将列出路径的内容,因此他们将需要知道他们正在检索的对象的确切名称。 p>

在添加存储桶策略之前,您需要停用Amazon S3 block public access 中阻止添加存储桶策略的设置。

一般规则:授予公共访问权限时,请使用存储桶策略。


user/doc 目录应该是完全私有的

默认情况下,Amazon S3 存储桶是私有的。因此,无需执行任何操作。

但是,您随后提到移动应用应该具有访问权限。此类权限应通过身份和访问管理 (IAM) 设置授予。

由于您提到“用户”,您的应用可能正在使用某种身份验证方法,可能是后端服务。因此,与其将 IAM 凭证直接放在应用程序中,流程应该是:

  • 用户登录应用
  • 应用将身份验证信息发送到对用户进行身份验证的后端服务(可以是 Cognito、使用 Google 登录,甚至只是您自己的数据库)
  • 如果用户通过验证,则后端服务将使用 AWS 安全令牌服务 (STS) 生成临时凭证。可以将策略附加到这些凭据,从而为该特定会话的用户和应用程序授予足够的权限。例如,它可以授予对路径(子目录)的访问权限,以便用户只能访问他们自己的子目录中的对象。

最好只授予应用程序(以及用户)使用服务所需的最少权限。这样可以避免因提供过多访问权限而导致的有意或无意的问题。

一般规则:仅向移动应用提供它们所需的最低权限。假设会发生意外或故意黑客攻击。


应该能够获取这些资源的唯一人是管理员

向您自己的员工授予访问权限时,请使用附加到 IAM 用户或 IAM 组的策略。

我会推荐:

  • 为管理员创建 IAM 组
  • IAM 政策附加到授予所需访问权限的组
  • 为您的每个员工管理员创建一个 IAM 用户
  • 将他们的 IAM 用户加入 IAM 组

这样,所有管理员(包括未来的管理员)都将获得适当的访问权限,并且您可以跟踪每个 IAM 用户独立执行的操作。 从不让多名员工使用相同的登录名。还建议将Multi-factor Authentication 设备与每个管理员帐户相关联,因为如果访问受到损害,权限可能会很危险。 MFA 可以像在手机上运行一个身份验证应用程序一样简单,该应用程序提供一个每 30 秒更改一次的数字。

事实上,一些公司只给管理员“普通”帐户(没有超级权限)。然后,如果他们需要做一些非凡的事情,他们会让管理员暂时切换到一个 IAM 角色,该角色提供“管理员”功能。这样可以最大限度地减少意外执行可能对系统产生影响的事情的可能性。

一般规则:使用 IAM 向组织内的员工授予访问权限。

如果您想了解有关 IAM 的更多信息,我强烈推荐 IAM videos from the annual AWS re:Invent conference。有关会话的完整列表,请参阅:AWS re:Invent 2019 Sessions & Podcast Feed

【讨论】:

    【解决方案2】:

    声明:我假设您的移动应用不直接与 S3 通信,而是您有一个管理 S3 访问的后端 API 服务器。

    当您将应用程序中的对象PUTthing/photos 时,您只需使用“公共读取”权限,或者

    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
        <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI> 
      </Grantee>
      <Permission>READ</Permission>
    </Grant>
    

    来自您的第二个链接。对于user/doc,只需为存储桶的所有者(您的 AWS 账户有FULL_ACCESS 授予)保留“私有”内容,然后通过应用程序逻辑控制对对象的访问,例如只有管理员可以通过代理 S3 看到内容“私有”对象,比如说presigned URLs

    最后,确保从您的应用访问存储桶的用户/角色具有附加策略,例如:

    {
       "Version":"2012-10-17",
       "Statement":[
          {
             "Effect":"Allow",
             "Action": ["s3:GetObject", "s3:PutObject"],
             "Resource": ["arn:aws:s3:::examplebucket/*", arn:aws:s3:::examplebucket/"]
          }
       ]
    }
    

    thing/photos 公开给任何人的另一种方法是通过存储桶策略,例如:

    {
      "Version":"2012-10-17",
      "Statement":[
        {
          "Sid":"Example",
          "Effect":"Allow",
          "Principal": "*",
          "Action":["s3:GetObject"],
          "Resource":["arn:aws:s3:::examplebucket/things/photos/*"]
          }
      ]
    }
    

    您大多会因为控制访问的不同类型的选项而感到困惑——存储桶策略和对象级 ACL。

    【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 2021-01-19
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多