使用适当的ACL通过VPC Endpoint通过HTTP将PUT对象传递给AWS S3?
我正在使用HTTPS客户端将对象从配置了S3 VPC Endpoint的VPC中的EC2实例上分配给Amazon S3。 目标Bucket有一个只允许从特定VPC访问的桶策略,因此不能通过IAM进行身份验证; 我必须使用HTTPS GET和PUT来读取和写入对象。
这个工作正常,但是我在将它放到Bucket时被应用到Object的ACL遇到了问题。 我已经使用如下的HTTP头设置了一个Canned ACL,但都没有得到正确的行为:
x-amz-acl: private
如果我设置了这个头部,这个对象是私有的,但它只能被根邮件帐户读取,所以这不好。 其他人需要能够通过HTTPS访问此对象。
x-amz-acl: bucket-owner-full-control
我完全认为这个Canned ACL可以做到这一点,但是,它导致了意想不到的行为,即Object变成了World Readable! 我也不确定对象的所有者是如何决定的,因为它是通过HTTPS创建的,在控制台中,所有者被列为看似随机的值。 这是文档说明:
对象所有者和存储桶所有者都通过对象获得FULL_CONTROL。 如果您在创建存储桶时指定了此罐装ACL,则Amazon S3将忽略它。
这完全令我困惑,因为根据桶策略,只有经批准的VPC的网络资源甚至应该能够列出对象,更不用说读取它! 也许它与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"
}
}
}
]
}
S3 ACL和桶策略的工作方式是“最低权限”的概念。
您的存储桶策略仅为指定的VPC指定ALLOW。 没有其他人被授予允许访问权限。 这与拒绝访问不同。
这意味着您的Bucket或对象ACL正在授予访问权限。
在S3控制台中,仔细检查文件所有者在PUT之后的位置。
仔细检查桶的ACL。 您在存储桶级授予了哪些权利?
仔细检查您用于PUT操作的权利。 除非您已授予公共写权限或者桶策略允许PUT,否则PUT必须使用签名。 此签名将确定PUT操作的权限以及谁在PUT之后拥有该文件的权限。 这由用于签名的ACCESS KEY确定。
你的x-amz-acl应该包含bucket-owner-full-control。
[经过多次评论后编辑]
我看到的问题是,在您的示例中,您正在接近安全问题。 我不会使用存储桶策略。 相反,我会创建一个IAM角色并将该角色分配给写入存储桶的EC2实例。 这意味着PUT随后使用IAM角色访问密钥进行签名。 这保留了对象的所有权。 然后,您可以使ACL成为桶拥有者完全控制和公开读取(或者您需要的任何受支持的ACL权限)。
链接地址: http://www.djcxy.com/p/70227.html上一篇: PUT Object to AWS S3 via HTTP through VPC Endpoint with proper ACL?