如何从Amazon S3 Bucket中撤销公共权限

6
我创建了一个Amazon S3 Bucket,用于存储我的网站上的图像。我有超过100万张图片,都具有公共读取权限。每次我登录时,Amazon都会给我这个警告:

"此Bucket具有公共访问权限 您已为此Bucket提供了公共访问权限。我们强烈建议您不要向S3 Bucket授予任何形式的公共访问权限。"

我正在使用以下Bucket策略,只允许在我的网站上显示图片:

{
    "Version": "2012-10-17",
    "Id": "http referer policy example",
    "Statement": [
        {
            "Sid": "Allow get requests originated from www.example.com and example.com.br",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::examplebucket.com/*",
            "Condition": {
                "StringLike": {
                    "aws:Referer": [
                        "http://www.example.com/*",
                        "http://www.example.com.br/*",
                        "https://www.example.com/*",
                        "https://www.example.com.br/*"
                    ]
                }
            }
        }
    ]
}

我该如何取消存储桶及其文件的公共访问权限,并仅将其授予我的网站?

谢谢!

2个回答

11

这是一个可怕的警告,旨在防止人们无意中泄露数据。最近新闻中有很多关于公司意外设置权限以允许公共读取的案例。

对于您的情况,您确实希望这些内容可以公开阅读,因此可以忽略此警告。您的安全策略看起来很好,仍然符合公共主机的文档要求。

理论上,如果您真的不希望任何人能够直接下载这些图像,可以将它们放在另一个服务器后面,该服务器向用户流式传输它们。但这并没有更加安全。

如果您不想让这些内容公开可用,只需从您的存储桶中删除此策略即可。在这种情况下,您的网站将无法提供这些图像。


1
谢谢您的解释!我删除了策略,但图片仍然可以正常工作,因为我使用公共读取上传了它们。但考虑到我有超过一百万张图片,改变所有权限是不可能的... 谢谢! - Andre
1
@Andre 这就是为什么测试不仅要测试您期望的内容是否允许,还要测试您不期望的内容是否被拒绝的重要性。由于对象上有 public-read,上面的策略实际上并没有起到任何作用。如果您仍想通过引用者来拒绝访问,可以创建一个 Deny 策略,测试 aws:referer 条件键的 StringNotLikeIfExists,但是请注意,如果您没有提供必要的匹配条件来防止此策略拒绝它们,则可能会拒绝来自控制台和其他内部机制的访问。 - Michael - sqlbot

5
您的策略看起来不错。您提供了比仅通过referer头公开更高级别的安全性,并且不允许列出对象。
使用S3提供常见文件,如CSS、JS和图像非常简单。但是,考虑到所有意外的安全问题,我通常建议以下两种方法之一:
1.为存储桶启用静态网站托管。这使未来管理员非常清楚地知道此存储桶是用于公共文件的。您也不会看到这些存储桶的大警告消息。启用重定向请求。 2.更好的方法是关闭所有公共访问并使用CloudFront。启用源访问身份验证。您将获得CloudFront的所有好处、更加严格的安全性等等。 使用源访问身份验证限制对Amazon S3内容的访问

好的建议。请注意另一个答案中的评论,对象也是“public-read”,因此目前显示的存储桶策略有点无效。此外,要在CloudFront中清晰地使用引用者过滤有点混乱,需要使用Lambda@Edge Viewer请求触发器来检查和拒绝或将Referer转发到存储桶,这仅适用于静态网站端点,而不是REST(因此没有OAI),后一种解决方案对缓存命中率有负面影响,如果您的资产被多个引用页面引用。 - Michael - sqlbot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接