使用 curl 的 Amazon AWS S3 存储桶匿名上传

Amazon AWS S3 bucket anonymous upload using curl

我正在尝试设置一个 S3 存储桶以接受匿名上传,同时允许存储桶所有者拥有全部权限并阻止公共读取访问。按照此处的代码,我在下面设置了存储桶策略。我想使用 curl 上传到存储桶,但我得到的只是

Access Denied

这是存储桶策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
   "Version":"2012-10-17",
   "Statement": [
        {
           "Sid":"allow-anon-put",
           "Effect":"Allow",
           "Principal": {
               "AWS":"*"
            },
           "Action":"s3:PutObject",
           "Resource":"arn:aws:s3:::[mybucket]/uploads/*",
           "Condition": {
               "StringEquals": {
                   "s3:x-amz-acl":"bucket-owner-full-control"
                }
            }
        },
        {
           "Sid":"deny-other-actions",
           "Effect":"Deny",
           "NotPrincipal": {
               "AWS":"arn:aws:iam::[myid]:root"
            },
           "NotAction": [
               "s3:PutObject",
               "s3:PutObjectAcl"
            ],
           "Resource":"arn:aws:s3:::[mybucket]/*"
        }
    ]
}

还有 curl POST:

curl --request PUT --upload-file"thefile.gif" -k https://[mybucket].s3.amazonaws.com/uploads/


匿名上传是个坏主意,但至少这个政策约束要求上传者让你控制对象:

1
2
3
4
5
       "Condition": {
           "StringEquals": {
               "s3:x-amz-acl":"bucket-owner-full-control"
            }
        }

这并不直观,但拥有一个存储桶并不意味着您拥有这些对象。如果它们未使用您帐户中的凭据上传,则您不拥有它们。当然,您需要为它们付费,但是如果一个对象是由另一个帐户或匿名用户上传到您的存储桶中的,那么您最终可能获得的对该对象的唯一权限是您可以删除它——您最终可以无法下载或复制的对象,只需删除即可。

有了这个政策,上传必须遵守政策,设置对象 ACL 给你控制:

1
curl ... -H 'x-amz-acl: bucket-owner-full-control'