带有 Cloudflare 的 S3 不允许直接访问
S3 with Cloudflare disallow direct access
我正在尝试让 Cloudflare 充当 S3 上托管文件的 CDN,以一种没有人可以直接访问文件的方式。例如:
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 访问任何文件,我的权限被拒绝。如果我创建一个文件 public(又名受让人所有人),我就可以通过 S3 和 CDN 访问该文件。
我曾尝试将 AllowedOrigin
更改为 *.mydomain.com
,但没有成功。
我找到了解决方案。 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"
]
}
}
}
最好使用您的域名作为 s3 的门禁,而不是 IP 列表。
转到您站点的 S3 控制台
Select 属性面板
在 权限下
选择添加 CORS 配置
为您的域名添加 CORSRules
可以找到更多CORS配置here
我的错误,这个答案只禁止其他网站通过合法的网络浏览器下载您的资产,不能阻止人们通过不同的用户代理。
接受的解决方案并不完全有效。它只允许访问 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": "*"
}
}
]
}
我正在尝试让 Cloudflare 充当 S3 上托管文件的 CDN,以一种没有人可以直接访问文件的方式。例如:
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 访问任何文件,我的权限被拒绝。如果我创建一个文件 public(又名受让人所有人),我就可以通过 S3 和 CDN 访问该文件。
我曾尝试将 AllowedOrigin
更改为 *.mydomain.com
,但没有成功。
我找到了解决方案。 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"
]
}
}
}
最好使用您的域名作为 s3 的门禁,而不是 IP 列表。
转到您站点的 S3 控制台
Select 属性面板
在 权限下
选择添加 CORS 配置
为您的域名添加 CORSRules
可以找到更多CORS配置here
我的错误,这个答案只禁止其他网站通过合法的网络浏览器下载您的资产,不能阻止人们通过不同的用户代理。
接受的解决方案并不完全有效。它只允许访问 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": "*"
}
}
]
}