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

Posted

技术标签:

【中文标题】AWS S3 - 限制对引用者的访问时访问被拒绝【英文标题】:AWS S3 - Access denied when restricting access to referer 【发布时间】:2021-03-22 18:36:03 【问题描述】:

我有一个 Next.js 应用,使用新的 next/image 功能,在尝试使用以下策略访问 S3 对象时收到 403-Access denied:

"Version": "2012-10-17",
"Statement": [
    
        "Sid": "PublicRead",
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:GetObject",
            "s3:GetObjectVersion"
        ],
        "Resource": "arn:aws:s3:::bucket-name/*",
        "Condition": 
            "StringLike": 
                "aws:Referer": [
                    "https://my-website.com/*",
                    "http://localhost:3000/*"
                ]
            
        
    
]

根据 S3 文档的要求,referer 包含在请求标头中,如下所示:

如果我确实从上述策略中删除了 Condition,它将授予对图像的访问权限,但这不是我想要的。

顺便说一句,我在 SO 和其他地方看到过相关问题,但他们没有解决这个具体问题。

【问题讨论】:

看到localhost 作为Referer 很奇怪。这可能不是 S3 在收到请求时看到的值。顺便说一句,使用Referer 不是很安全——很容易伪造该值,因此不应使用它来限制对任何敏感数据的访问。 【参考方案1】:

最近我也开始遇到这个问题,从 Chrome 开始,然后是 Firefox(Edge 仍在工作)。为了寻找解决方案,我像您所说的那样删除了Condition,它确实有效。

在检查了referer 条件可能有什么问题后,发现发送引用的格式发生了变化:而不是格式“https://example.com/”,我看到了格式'https://example.com' 用于我的 HTTP 请求(因此没有斜杠)。本地主机的引用发送是 'http://null'。

在存储桶策略中更改它对我有用。

所以对你来说,你的情况应该是这样的

        "Condition": 
        "StringLike": 
            "aws:Referer": [
                "https://my-website.com*",
                "http://null"
            ]
        
    

【讨论】:

以上是关于AWS S3 - 限制对引用者的访问时访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

尽管用户角色,AWS Batch 作业在 S3 上被拒绝访问

Rails:回形针上传时 AWS S3 访问被拒绝错误

AWS S3+Cloudfront 访问被拒绝初学者问题

在不同账户的 Lambda 中从 AWS Athena 查询 S3 文件时访问被拒绝

Cloudfront 访问被拒绝

AWS Glue 作业在写入 S3 时被拒绝访问