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

我为用户拥有以下的 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:::*"
      ]
    }
  ]
}
目标是让用户将文件上传到存储桶,但不允许覆盖或删除。这是为了备份。我最初使用了ListBucketPutObject,但由于没有起作用,所以添加了*。甚至*也不能让用户上传文件,只会显示Access Denied。 当我尝试模拟器时,对于ListBucket返回的是Denied - Implicitly denied (no matching statements found).,这似乎很奇怪,因为我已经隐式地允许了它。 我已经尝试过Cyberduck和3Hub作为S3客户端。 有什么想法是出了什么问题吗?
1个回答

在为Amazon IAMAmazon S3制定策略时,你需要注意以下几点:首先是服务操作(例如列出所有存储桶),其次是存储桶操作(例如列出存储桶),还有对象操作(例如获取对象)。 特别是您的策略中的资源规范需要根据以下模式指定适当的目标实体(请参见例如各种Amazon S3示例策略): - 服务操作 - arn:aws:s3:::* - 存储桶操作 - arn:aws:s3::: - 对象操作 - arn:aws:s3:::/ 解决方案 您遇到了“拒绝访问”的问题,因为您在PutObject操作中指定了存储桶级别的资源,而它需要一个对象级别的资源规范,像arn:aws:s3:::/* - 因此,以下策略应该涵盖您的样例用例:
{
  "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不是必需的吗? - Markus Hedlund
1根据Sid的说明,它是“为策略语句提供的可选标识符”,在策略中“必须是唯一的”。鉴于在没有它的情况下似乎工作正常(但请参见下文),为了简洁起见并在版本化策略时,我倾向于在这里删除它,但在自动生成策略时不会烦恼 - 然而,根据后续的注意事项:“某些AWS服务(例如Amazon SQS或Amazon SNS)可能需要此元素[...]”。 - Steffen Opel
9OP说他们想要“允许用户上传文件到存储桶,但不允许覆盖或删除”,但是这个策略授予了PutObject权限,该权限允许覆盖对象,是吗?我认为没有办法将其分开。 - Xiong Chiamiov
2@XiongChiamiov - S3的“PutObject”操作确实意味着覆盖,这是S3默认的工作方式。如果您需要防止意外删除,您可能需要查看使用版本控制 以保留、检索和还原存储在Amazon S3存储桶中的每个对象的每个版本 - 这使您能够_轻松从意外的用户操作和应用程序故障中恢复_。 - Steffen Opel
6是的,版本控制使您能够恢复被覆盖的对象(但您必须发现它们已经被覆盖,然后进行恢复操作)。总之,我给它打-1分,因为它没有提供准确的答案。 - Xiong Chiamiov
另请参阅:https://docs.amazonaws.cn/en_us/AmazonS3/latest/dev/object-lock-managing.html - romaninsh

  • 相关问题