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

时间:2012-05-14 23:58:15

标签: amazon-s3 acl

我正在开发一个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/*"
      ]
    }
  ]
}

但是我想让它更具限制性,这样如果我们的AWS凭据遭到破坏,攻击者就无法破坏任何数据。

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

5 个答案:

答案 0 :(得分:47)

这在你可能想象的Amazon S3中是不可能的;但是,您可以通过Using Versioning解决此限制,其中是一种在同一个存储桶中保留对象的多个变体的方法并且已经开发了这样的用例:

  

您可以启用版本控制以防止删除对象或   被错误覆盖,或归档对象以便您可以检索   以前的版本。

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

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

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

  • How does Versioning protect me from accidental deletion of my objects? - 当用户对某个对象执行DELETE操作时,后续的默认请求将不再检索该对象。但是,该对象的所有版本将继续保留在您的Amazon S3存储桶中,并且可以检索或还原。 只有Amazon S3存储桶的所有者才能永久删除版本。 [强调我的]

如果您对存储桶拥有者的AWS凭据(当然可能与访问用户不同)非常重要,您可以更进一步,请参阅How can I ensure maximum protection of my preserved versions?

  

版本控制的MFA删除功能使用multi-factor authentication,可用于提供额外的图层   安全。 [...]如果您启用MFA删除版本控制   在您的Amazon S3存储桶上,需要两种形式的身份验证   永久删除对象的版本:您的AWS账户   凭证和有效的六位数代码和序列号   身体拥有的身份验证设备。 [...]

答案 1 :(得分:7)

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

  1. 制定一项政策,"没有同名的新对象"。大部分时间都不会发生。执行它:
  2. AWS Lambda function中收听S3:PutObject事件。
  3. 触发事件时,请检查是否存在多个版本。
  4. 如果存在多个版本,请删除除最新版本之外的所有版本。
  5. 通知上传者发生的事情(在对象的x-amz-meta-*中放置原始上传器非常有用。更多信息here)。

答案 2 :(得分:2)

您现在可以使用S3 Object Lock执行此操作。这是每个存储桶的设置,可让您放置两种WORM锁之一。

  • “保留期限”-不能更改
  • “合法保留”-存储桶所有者可以随时更改

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

答案 3 :(得分:1)

编辑:如果您来自此question,则适用。

对象锁仅在版本化存储桶中起作用。如果您可以为存储桶启用版本控制,但可以容忍短暂的不一致,则认为在删除文件的同时仍在运行文件(S3仅是最终一致的),而假定文件仍然存在(可能会导致PUT) -DELETE如果在紧密循环中使用会间歇性地失败,或者相反,连续的PUT错误地间歇性地成功,那么以下解决方案可能是合适的。

给出对象路径,读取对象的Content-Length标头(来自元数据,HeadObject请求)。仅当请求成功时,并且在长度大于zero的情况下,才写入对象。

答案 4 :(得分:-5)

是, 不可能创建这样的策略,在该策略中,您只对新对象赋予put权限(在s3上不存在)。

我是Bucket Explorer的开发者,您可以尝试Bucket Explorer,它以两种方式执行版本。 1.如果在Bucket 2上启用了Amazon S3 Versioning,那么当Bucket上禁用Amazon S3 Versioning时,这是Bcuket Explorer自己的版本控制。

如果您想要为您的朋友或客户提供特定访问权限,也可以尝试使用Bucket Explorer Team Edition。