为 S3 存储桶设置防盗链

不想每次搬家都带着一大堆附件,于是就把附件放在了 S3 上。

然后,肯定要设置一下防盗链这件事儿呀。

找了一些资料,但是还是弄不明白。

显式允许

顾名思义,“如果符合一些条件,那么就允许”。

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

一般来说,这样做就行了。

显式拒绝

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

由于 AWS 的判断逻辑,这个其实会比「显示允许」更加严格。

显式允许+显式拒绝

{
    "Version":"2012-10-17",
    "Id":"PreventHotLinking",
    "Statement":[
        {
            "Sid":"Allow get requests referred by www.mysite.com and mysite.com",
            "Effect":"Allow",
            "Principal":"*",
            "Action":"s3:GetObject",
            "Resource":"arn:aws:s3:::examplebucket/*",
            "Condition":{
                "StringLike":{
                    "aws:Referer":[
                        "http://www.example.com/*",
                        "http://example.com/*"
                    ]
                }
            }
        },
        {
            "Sid":"Explicit deny to ensure requests are allowed only from specific referer.",
            "Effect":"Deny",
            "Principal":"*",
            "Action":"s3:*",
            "Resource":"arn:aws:s3:::examplebucket/*",
            "Condition":{
                "StringNotLike":{
                    "aws:Referer":[
                        "http://www.example.com/*",
                        "http://example.com/*"
                    ]
                }
            }
        }
    ]
}

好吧,这个是最严格的了。

后记

在带有「显式拒绝」的逻辑下,我不会配置其他 IAM 账号的访问策略。

比如,我现在有一个 IAM 账号 MyS3,搞到了 AK 和 SK。然后我想用命令行来上传下载一些东西。在「显式允许」的逻辑下,默认 OK。在「显式拒绝」的逻辑下,Fail。在「显式允许+显式拒绝」的逻辑下,Fail。

Emmm,很是痛苦啊~求教!

然后,除此之外,我们还可以加上其他限制,比如说只允许某些 IP 啊、只允许 HTTPS 啊什么的。

留下评论