如何让用户将文件上传到 S3 存储桶,但不能覆盖或删除?

Zna*_*kus 22 amazon-s3 amazon-iam

我有一个用户的以下 IAM 策略

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1395161912000",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Sid": "list",
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

目标是让用户将文件上传到存储桶,但不会覆盖或删除。是用来备份的。我从ListBucketand开始PutObject,但*由于它不起作用而添加。甚至*不允许用户上传文件,只是获取Access Denied.

当我尝试模拟器时,它返回Denied - Implicitly denied (no matching statements found).for ListBucket,这看起来很奇怪,因为我已经隐含地允许了。

我试过 Cyber​​duck 和 3Hub 作为 S3 客户端。

知道出了什么问题吗?

Ste*_*pel 25

在为Amazon S3制定Amazon IAM策略时,您需要了解服务上的操作(例如ListAllMyBuckets)、存储桶上的操作(例如ListBucket)和对象上的操作(例如GetObject)之间的区别。

特别是,Resource您的策略规范需要根据以下模式处理适当的目标实体(例如参见Amazon S3的各种示例策略):

  • 服务操作 - arn:aws:s3:::*
  • 桶上的操作 - arn:aws:s3:::<bucket>
  • 对象操作 - arn:aws:s3:::<bucket>/<object>

解决方案

您遇到了Access Denied,因为您已经为 指定了一个存储桶级资源PutObject,这需要一个对象级资源规范,例如arn:aws:s3:::<bucket>/*- 因此,以下策略应涵盖您的示例用例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname/*"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • OP 表示他们希望“让用户将文件上传到存储桶,但不能覆盖或删除”,但此策略授予允许覆盖对象的 `PutObject`,不是吗?我认为没有办法将其分开。 (6认同)
  • 是的,版本控制使您能够恢复已被覆盖的对象(但您必须发现它们已被覆盖,然后再执行此操作)。无论如何,-1 因为它没有提供问题的准确答案。 (5认同)
  • @XiongChiamiov - S3 的“PutObject”操作确实意味着覆盖,这就是 S3 默认的工作方式。如果您需要防止意外删除,您可能需要查看 [使用版本控制](http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html) _to 保留、检索和恢复每个版本存储在您的 Amazon S3 存储桶中的每个对象。_ - 这使您可以_轻松地从意外的用户操作和应用程序故障中恢复_。 (2认同)