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

如何让用户上传文件到 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

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

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

知道什么地方出了问题吗?

答案1

制作时亚马逊 IAM政策亚马逊 S3,你需要知道之间的区别服务上的操作(例如列出所有我的存储桶),桶上的操作(例如列表桶) 和对象操作(例如获取对象)。

具体来说,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/*"
      ]
    }
  ]
}

相关内容