2016-09-27 79 views
5

我试图让Cloudflare充当CDN,以S3的方式托管文件,但没有人可以直接访问这些文件。例如:S3与Cloudflare不允许直接访问

S3斗: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,我得到许可被拒绝。如果我公开一个文件(aka grantee Everyone),那么我可以通过S3和CDN访问该文件。

我试过改变AllowedOrigin*.mydomain.com,但没有运气。

+0

希望这篇文章可以帮助您 https://www.maxcdn.com/one/tutorial/s3-access/ – rocketspacer

回答

7

我找到了解决方案。 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" 
       ] 
      } 
     } 
    } 
0

这是更好地使用自己的域名作为入门后卫到S3,而不是IP列表。

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

S3-CORS-Config example

更多CORS配置可以发现here


还挺错误,但是这个答案只禁止其他网站从引用您的资产,而不是从原来的端点S3为您生成...

0

接受的解决方案并不完全正常。它只允许访问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": "*" 
     } 
    } 
] 

}

+0

嗯,我忘了提,桶是不公开的。所以没有人可以访问它。你的方法也适用。它只是假设存储区是公共的,那么如果'NotIpAddress',你的策略阻止对它的访问。相同的想法;) – rlcabral

相关问题