带Cloudflare的S3禁止直接访问

时间:2016-09-27 18:30:44

标签: amazon-s3 cors cloudflare

我正在努力让Cloudflare充当S3上托管文件的CDN,这样任何人都无法直接访问这些文件。例如:

S3 bucket:cdn.mydomain.com.s3.amazonaws.com

CDN(Cloudflare):cdn.mydomain.com

我想要的是能够访问cdn.mydomain.com/file.jpg(Cloudflare)而不是cdn.mydomain.com.s3.amazonaws.com/file.jpg(S3)。

现在我在Cloudflare上配置了一个指向我的存储桶的CNAME,以及以下的CORS:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

如果我尝试通过S3或CDN访问任何文件,我会被拒绝许可。如果我公开一个文件(也就是被控制的每个人),我可以通过S3和CDN访问该文件。

我尝试用AllowedOrigin更改*.mydomain.com,但没有运气。

3 个答案:

答案 0 :(得分:12)

我找到了解决方案。 article at CloudFlare's support center没有提到这一点。

您必须编辑存储桶策略,而不是CORS。而不是允许您的域,如该文章所说,有权访问存储桶,您必须允许CloudFlare IP。作为参考,以下是IP列表:https://www.cloudflare.com/ips

以下是使用CloudFlare的存储桶策略示例:

    {
        "Sid": "SOME_STRING_ID_HERE",
        "Effect": "Allow", // or deny
        "Principal": {"AWS": "*"}, // or whatever principal you want
        "Action": "s3:GetObject", // or whatever action you want
        "Resource": "arn:aws:s3:::cdn.mydomain.com/*", // or whatever resource you want
        "Condition": {
            "IpAddress": {
                "aws:SourceIp": [
                    "103.21.244.0/22",
                    "103.22.200.0/22",
                    "103.31.4.0/22",
                    "104.16.0.0/12",
                    "108.162.192.0/18",
                    "131.0.72.0/22",
                    "141.101.64.0/18",
                    "162.158.0.0/15",
                    "172.64.0.0/13",
                    "173.245.48.0/20",
                    "188.114.96.0/20",
                    "190.93.240.0/20",
                    "197.234.240.0/22",
                    "198.41.128.0/17",
                    "199.27.128.0/21"
                ]
            }
        }
    }

答案 1 :(得分:2)

公认的解决方案并不完全有效。它只允许访问CloudFlare。要使该解决方案起作用,您必须明确拒绝策略中其他位置的所有内容。此存储桶策略针对Cloudflare的最新IP地址(包括IPv6)进行了更新,并且还拒绝所有来自Cloudflare IP地址的访问权限。

{
    "Id": "Policy1517260196123",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "A string ID here",
            "Action": "s3:*",
            "Effect": "Deny",
            "Resource": "arn:aws:s3:::yourbucket.example.com/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "103.21.244.0/22",
                        "103.22.200.0/22",
                        "103.31.4.0/22",
                        "104.16.0.0/12",
                        "108.162.192.0/18",
                        "131.0.72.0/22",
                        "141.101.64.0/18",
                        "162.158.0.0/15",
                        "172.64.0.0/13",
                        "173.245.48.0/20",
                        "188.114.96.0/20",
                        "190.93.240.0/20",
                        "197.234.240.0/22",
                        "198.41.128.0/17",
                        "2400:cb00::/32",
                        "2405:8100::/32",
                        "2405:b500::/32",
                        "2606:4700::/32",
                        "2803:f800::/32",
                        "2c0f:f248::/32",
                        "2a06:98c0::/29"
                    ]
                }
            },
            "Principal": {
                "AWS": "*"
            }
        }
    ]
}

答案 2 :(得分:0)

最好使用您的域名作为s3的入口防护,而不是IP列表。

转到您网站的 S3控制台
选择属性面板
权限下 选择添加CORS配置
为您的域名添加 CORSRules

S3-CORS-Config example

可以找到更多CORS配置here

有点错误,但这个回答只是禁止其他网站引用您的资产,而不是来自S3为您生成的原始终结点...