【发布时间】:2018-06-21 07:55:06
【问题描述】:
我正在使用 HTTPS 客户端将对象从配置了 S3 VPC 终端节点的 VPC 中的 EC2 实例放入 Amazon S3。目标 Bucket 的 Bucket Policy 只允许特定 VPC 访问,因此无法通过 IAM 进行身份验证;我必须使用 HTTPS GET 和 PUT 来读取和写入对象。
如上所述,这可以正常工作,但是当我将对象放入存储桶时,我遇到了应用于对象的 ACL 的问题。我已经尝试过使用如下 HTTP 标头设置 Canned ACL,但都没有导致正确的行为:
x-amz-acl: private
如果我设置此标头,对象是私有的,但它只能由根电子邮件帐户读取,所以这不好。其他人需要能够通过 HTTPS 访问此对象。
x-amz-acl: bucket-owner-full-control
我完全认为这个 Canned ACL 可以解决问题,然而,它导致了意想不到的行为,即对象变为 World Readable!我也不确定对象的所有者是如何决定的,因为它是通过 HTTPS 创建的,在控制台中,所有者被列为看似随机的值。这是文档描述:
对象所有者和存储桶所有者都获得 FULL_CONTROL 目的。如果您在创建存储桶时指定此标准 ACL,Amazon S3 忽略它。
这完全让我莫名其妙,因为根据 Bucket Policy,只有经过批准的 VPC 的网络资源才能列出 Object,更不用说读取它了!也许它与 ACL 和存储桶策略的结合有关,我只是没有看到任何东西。
不管怎样,也许我做错了。如何通过 HTTPS 将对象放入 S3 并设置该对象的权限以匹配存储桶策略,或者以其他方式使存储桶策略对 ACL 具有权威性?
这是一个很好的衡量标准:
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectTagging",
"s3:GetObjectTorrent",
"s3:GetObjectVersion",
"s3:GetObjectVersionTagging",
"s3:GetObjectVersionTorrent",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:ListBucketVersions",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:PutObjectTagging"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
],
"Condition": {
"StringEquals": {
"aws:SourceVpc": "vpc-12345678"
}
}
}
]
}
【问题讨论】:
标签: rest amazon-web-services http amazon-s3 https