如何为我的应用程序配置 S3 存储桶策略

cal*_*eld 3 amazon-s3 amazon-web-services

我有一个名为 的存储桶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
Run Code Online (Sandbox Code Playgroud)

里面的一切都thing/photos应该是公开的。GET请求应该允许所有人,但PUTPOST当用户通过我的应用程序上传文件的要求应该只被允许。

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

阅读深入了解 AWS S3 访问控制 – 完全控制您的资产ACL - 我可以授予哪些权限?我仍然对如何完成我想要的事情感到困惑。重叠的访问控制让我感到困惑,我找不到以面向操作的方法解释任何这些的教程。鉴于 S3 存储桶策略设置不当导致的数据泄漏数量,似乎我不是唯一误解这一点的人。

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

Joh*_*ein 10

默认情况下,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/*"]
      }
  ]
}
Run Code Online (Sandbox Code Playgroud)

这意味着:

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

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

在添加存储桶策略之前,您需要停用阻止添加存储桶策略的Amazon S3 阻止公共访问中的设置。

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


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

默认情况下,Amazon S3 存储桶是私有的。因此,什么都不用做。

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

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

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

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

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


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

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

我会推荐:

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

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

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

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

如果您想了解有关 IAM 的更多信息,我强烈推荐来自年度 AWS re:Invent 会议的 IAM 视频。有关会议的完整列表,请参阅:AWS re:Invent 2019 会议和播客源