Amazon-S3

如何讓使用者將文件上傳到 S3 儲存桶,但不覆蓋或刪除?

  • September 29, 2017

我對使用者有以下 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:::*"
     ]
   }
 ]
}

目標是讓使用者將文件上傳到儲存桶,但不能覆蓋或刪除。是用來備份的。我從ListBucketand開始PutObject,但*由於它不起作用而添加。甚至*不讓使用者上傳文件,只是獲取Access Denied.

當我嘗試模擬器時,它返回Denied - Implicitly denied (no matching statements found).for ListBucket,這似乎很奇怪,因為我已經隱含地允許這樣做。

我已經嘗試過 Cyber​​duck 和 3Hub 作為 S3 客戶端。

知道有什麼問題嗎?

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

引用自:https://serverfault.com/questions/583084