Amazon S3 ACL,用于只读和一次写入访问

Jak*_*les 48 acl amazon-s3

我正在开发一个Web应用程序,我目前将以下ACL分配给它用于访问其数据的AWS账户:

{
  "Statement": [
    {
      "Sid": "xxxxxxxxx", // don't know if this is supposed to be confidential
      "Action": [
        "s3:*"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::cdn.crayze.com/*"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

但是,我想使其更具限制性,以便在我们的AWS凭据遭到破坏时,攻击者无法销毁任何数据.

从文档中看,我似乎只想允许以下操作:s3:GetObject而且s3:PutObject,我特别希望帐户只能创建不存在的对象 - 即应拒绝对现有对象的PUT请求.这可能吗?

Ste*_*pel 48

这在亚马逊S3中是不可能的,就像你可能想象的那样; 但是,您可以通过使用版本控制来解决此限制,这是一种在同一个存储桶中保留对象的多个变体的方法,并且已经开发了这样的用例:

您可以启用版本控制以防止错误地删除或覆盖对象,或者归档对象以便您可以检索它们的先前版本.

还有一些相关的常见问题解答,例如:

  • 什么是版本控制?- 版本控制允许您保留,检索和还原存储在Amazon S3存储桶中的每个对象的每个版本.为存储桶启用版本控制后,只要对它们执行PUT,POST,COPY或DELETE操作,Amazon S3就会保留现有对象.默认情况下,GET请求将检索最近编写的版本.可以通过在请求中指定版本来检索旧版本的已覆盖或已删除对象.

  • 我为什么要使用版本控制?- Amazon S3为客户提供高度耐用的存储基础架构.通过在客户意外覆盖或删除对象时提供恢复方法,版本控制可提供额外的保护.这使您可以轻松地从意外的用户操作和应用程序故障中恢复.您还可以使用版本控制进行数据保留和存档.[强调我的]

  • 版本控制如何保护我免于意外删除我的对象?- 当用户对对象执行DELETE操作时,后续的默认请求将不再检索该对象.但是,该对象的所有版本将继续保留在您的Amazon S3存储桶中,并且可以检索或还原.只有Amazon S3存储桶的所有者才能永久删除版本.[强调我的]

如果您对存储桶拥有者的AWS凭据(当然可能与访问用户不同)非常重要,您可以更进一步,请参阅如何确保对我保留的版本的最大保护?:

版本控制的MFA删除功能使用多因素身份验证,可用于提供额外的安全层.[...]如果您在Amazon S3存储桶上启用了带有MFA删除的版本控制,则需要两种形式的身份验证才能永久删除对象的版本:您的AWS账户凭据以及来自身份验证的有效六位数代码和序列号你实际拥有的装置.[...]

  • 遗憾的是,这是唯一可用于非常常见且明显的备份要求的解决方案("仅限新编写".)如果使用S3版本控制,则会排除使用S3的生命周期管理策略.因此,现在您不得不选择具有可靠的备份安全性,或者有一种方便的方法来删除旧备份.我不认为这两者都太过分了. (8认同)
  • 我经常在需要的地方使用版本控制和生命周期系统 - 使用一个并不排除另一个.从s3界面中版本控制的描述:```您可以使用生命周期规则来管理对象的所有版本及其相关成本.生命周期规则使您能够将对象自动存档到Glacier存储类和/或在指定的时间段后删除它们.`` (5认同)
  • 听起来不错。攻击者是否有可能禁用版本控制?或者没关系,因为他们无论如何都无法删除已经版本化的对象? (2认同)

Mot*_*tys 7

如果这是意外覆盖,您试图避免,并且您的业务需求允许短时间不一致的窗口,您可以在Lambda函数中执行回滚:

  1. 使其成为"没有同名新对象"的政策.大部分时间都不会发生.执行它:
  2. AWS Lambda函数中侦听S3:PutObject事件.
  3. 触发事件时,请检查是否存在多个版本.
  4. 如果存在多个版本,请删除除最新版本之外的所有版本.
  5. 通知上传器发生的事情(x-amz-meta-*在对象中包含原始上传器是有用的.更多信息在这里).

  • 如果您试图防止覆盖,则#4是否应该“删除除最旧的文件外的所有文件”? (4认同)

Dan*_*tts 5

您现在可以使用 S3 Object Lock 锁定对象的版本。这是每个存储桶的设置,并允许您放置两种 WORM 锁中的一种。

  • “保留期” - 无法更改
  • “合法保留” - 桶所有者可以随时更改

https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html

正如下面@Kijana Woodard 所提到的,这不会阻止创建新版本的对象。

  • 您仍然可以创建新版本。“对对象设置保留期或合法保留仅保护请求中指定的版本,并不会阻止创建对象的新版本。” (9认同)