【问题标题】:PUT Object to AWS S3 via HTTP through VPC Endpoint with proper ACL?通过具有正确 ACL 的 VPC 端点通过 HTTP 将对象放入 AWS S3?
【发布时间】: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


    【解决方案1】:

    S3 ACL 和存储桶策略的工作方式是“最小权限”的概念。

    您的存储桶策略仅为指定的 VPC 指定 ALLOW。没有其他人被授予 ALLOW 访问权限。这与拒绝访问不同。

    这意味着您的存储桶或对象 ACL 正在授予访问权限。

    在 S3 控制台中,在 PUT 之后仔细检查文件所有者是谁。

    仔细检查存储桶的 ACL。您在存储桶级别授予了哪些权利?

    仔细检查您用于 PUT 操作的权限。除非您已授予公共写入访问权限或存储桶策略允许 PUT,否则 PUT 必须使用签名。此签名将确定 PUT 操作的权限以及 PUT 后文件的所有者。这由用于签名的 ACCESS KEY 确定。

    您的 x-amz-acl 应包含 bucket-owner-full-control。

    [在下面无数次cmets之后编辑]

    我看到的问题是您在示例中接近安全性错误。我不会使用存储桶策略。相反,我会创建一个 IAM 角色并将该角色分配给正在写入存储桶的 EC2 实例。这意味着 PUT 然后使用 IAM 角色访问密钥进行签名。这保留了对象的所有权。然后,您可以将 ACL 设置为 bucket-owner-full-control 和 public-read(或您想要的任何受支持的 ACL 权限)。

    【讨论】:

    • 没有签名,因为没有访问密钥,策略使用条件允许基于 HTTP 请求的源 VPC 的 PUT。所以它是“公共写入”但有一个条件,所以在这种情况下ACL“所有者”是没有意义的。所有者最终只是一个看似随机的十六进制值,也许是请求的 md5?我已经检查了您提到的所有内容,但没有一个表明该对象应该是公共读/写的,但它是!没有其他对象以这种方式运行。接下来我将尝试为相反的条件向存储桶策略添加显式拒绝。
    • 这意味着所有者是匿名的,当您设置 bucket-owner-full-control 时,每个人都可以访问。有你的安全漏洞和一个大的。
    • @Marty "没有签名,因为没有访问密钥,策略使用条件允许基于 HTTP 请求的源 VPC 进行 PUT。"这不是一个有效的配置,因为它允许访问而不需要身份验证。用户上传对象的帐户成为拥有该对象的帐户(而不是存储桶所有者)...因此,如果您使用 s3:PutObject 而不作为实际用户进行身份验证,则 匿名用户 拥有该对象. bucket-owner-full-control 也保留对象所有者的权限,在本例中为匿名用户。
    • 对不起,@JohnHanley,当我开始写我的文章时,我没有看到你之前的评论。
    • 啊哈,这很有道理。那么为什么它不只是在控制台中说“匿名”而不仅仅是一些随机字符串是没有意义的。如果是这样的话,很明显会发生什么!那么,最好的前进方式是什么?如何允许“匿名用户”根据我提出的条件放置和获取对象。创建对象时,是否可以为对象显式设置一些特殊的“所有者”?我看到这可能与标题有关。这一定是可能的,因为我在存储桶中有对象的行为与我期望的一样。
    猜你喜欢
    • 2019-08-12
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2018-11-04
    • 1970-01-01
    • 2020-03-03
    • 2020-05-01
    相关资源
    最近更新 更多