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


19

我为用户提供以下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:::*"
      ]
    }
  ]
}

目的是让用户将文件上传到存储桶,但不能覆盖或删除。用于备份。我从ListBucket和开始PutObject,但是添加了,*因为它不起作用。甚至*不让用户上传文件,仅获得Access Denied

当我尝试模拟器,它返回Denied - Implicitly denied (no matching statements found).ListBucket,因为我已经含蓄地允许这似乎很奇怪。

我已经尝试将Cyber​​duck和3Hub作为S3客户端。

知道有什么问题吗?

Answers:


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/*"
      ]
    }
  ]
}

1
太神奇了,它运行得非常完美。谢谢!所以sid不是必需的吗?
Znarkus 2014年

1
根据Sid的说法,它是为策略声明提供的可选标识符,在策略必须是唯一的。鉴于它似乎做工精细W / O(见下文),我倾向于在这里删除了简洁和versionizing政策时,但例如自动生成当政策不打扰-但是,按照后续有些AWS服务(例如,Amazon SQS或Amazon SNS)可能需要此元素[...]
斯特芬·欧宝

3
OP表示他们希望“让用户将文件上传到存储桶,但不覆盖或删除”,但是此策略授予PutObject,它允许覆盖对象,不是吗?我认为没有办法将其分开。
熊基亚莫夫'17

2
@XiongChiamiov-S3的“ PutObject”操作确实暗示着覆盖,这只是S3默认情况下的工作方式。如果需要防止意外删除的保护,则可能需要研究使用版本控制 来保存,检索和还原存储在Amazon S3存储桶中的每个对象的每个版本。-这使您可以轻松地从意外的用户操作和应用程序故障中恢复
Steffen Opel's

4
是的,版本控制使您能够恢复已被覆盖的对象(但是您必须先发现它们已经被覆盖,然后再执行此操作)。无论如何,-1,因为它不能为问题提供准确的答案。
熊加米奥夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.