除非 url 被签名,否则限制对 S3 对象的访问

Posted

技术标签:

【中文标题】除非 url 被签名,否则限制对 S3 对象的访问【英文标题】:Restricting access to S3 objects unless url is signed 【发布时间】:2022-01-21 20:50:38 【问题描述】:

我在 S3 上为我的私人文件创建了一个独特的存储桶。此存储桶配置为阻止所有公共访问。我的应用程序配置为将文件上传到没有公共读取访问权限的此 s3 存储桶,我可以确认对象上的权限反映了这是有效的(即,上传的对象没有授予公众权限)。

尽管采取了所有这些措施来限制公众对这些文件的访问,但这些文件仍然对公众可见。我认为我的 IAM 设置可能会覆盖 ACL 设置以及存储桶设置。我不确定要更改哪个 IAM 设置,或者更改是否会对我的应用程序的其他部分产生负面影响,因此我想尽可能使用存储桶策略限制对这个“私有存储桶”的访问。

这是我开始使用的存储桶策略:


    "Version": "2012-10-17",
    "Id": "My Special Bucket Policy",
    "Statement": [
        
            "Sid": "DenyAccesstoAllFiles",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my_private_bucket/*"
        
    ]

不幸的是,即使使用签名的 url,这也会阻止访问此“私有存储桶”中的对象。

请注意,我已经能够成功生成签名 URL。就像我配置它们一样,它们会在 60 秒后过期。

感谢您的帮助!

编辑:我所有的文件都是这样上传的:

【问题讨论】:

进展如何?仍然不清楚你能做什么? 【参考方案1】:

所有存储桶和对象默认为私有。所以通常你不需要任何关于它们的政策。在您的情况下,任何访问都被拒绝,因为Deny always wins over any Allow:

请记住,任何这些策略中的明确拒绝都会覆盖允许。

因此,由于您的Deny,无法启用对您的对象的任何公共访问,并且没有预签名的网址会改变这一点。

通常您所做的是摆脱您的策略,并依赖存储桶和对象是私有的默认行为。在这种情况下,预签名的 url 将起作用。

【讨论】:

我已经用截图修改了我的帖子。你能看看吗。您是否认为我需要阻止对象/对象 ACL 的读取访问,即使是对象所有者(我的应用程序),这样只有签名的 url 才能工作?这会在 IAM 政策中完成吗? @JasonHoward 是的。您删除了阻止所有内容的拒绝策略。除非您通过 IAM 策略或 S3 预签名 URL 明确允许(默认情况下所有对象和存储桶都是私有的),否则任何人都无法读取您的对象。 好的,我试试这个。谢谢! @JasonHoward 默认情况下S3 Block Public Access 也是启用的,所以这是一个额外的保护层。 @JasonHoward 很高兴它成功了。如果提供的任何答案有帮助,我们将不胜感激。【参考方案2】:

需要注意的两点:

    在 AWS 中以默认设置创建的存储桶始终是私有的,并且它们的对象无法通过它们的链接访问。我认为您混淆了一些链接,让您相信您的对象仍然可见:) 您不需要明确的策略来拒绝所有访问 您的 S3 对象。

我建议您删除已附加到存储桶的策略,然后再次测试指向您的对象的公共链接是否有效(如果您的存储桶是通过默认设置创建的,则它们不应该有效)。一旦清楚这部分,您的预签名 URL 就应该可以工作了!

【讨论】:

谢谢 Anss。你是对的。我缺少的是让我确定它们是否公开的难题。

以上是关于除非 url 被签名,否则限制对 S3 对象的访问的主要内容,如果未能解决你的问题,请参考以下文章

使用预签名 URL 上传到 Amazon S3 时限制对象大小

仅将 S3 对象 URL 限制为网站上的登录用户

Amazon s3 预签名 URL 受 IP 地址限制

带有签名 URL 的 AWS CloudFront:403 访问被拒绝

AWS S3 - 限制对引用者的访问时访问被拒绝

限制对 Amazon S3 URL 的全球访问