使用适当的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?

下一篇: AWS S3 sharing access to static website