S3 с Cloudflare запретить прямой доступ
Я пытаюсь иметь Cloudflare, чтобы действовать как CDN для файлов, размещенных на S3, таким образом, что никто не может получить доступ к файлам напрямую. Например:
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).
прямо сейчас у меня есть CNAME, настроенный на Cloudflare, который указывает на мое ведро, и следующие 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 я получаю разрешение отказано. Если я сделаю файл общедоступным (он же grantee Everyone), я смогу получить доступ к этому файлу через S3 и CDN.
Я попытался изменить AllowedOrigin
С *.mydomain.com
, но не повезло.
3 ответов
Я нашел решение. The статья в Центре поддержки CloudFlare не упоминает об этом.
вы должны отредактировать ведро политики, не CORS. И вместо того, чтобы позволить вашему домену, как говорится в этой статье, иметь доступ к ведру, вы должны разрешить IP-адреса CloudFlare. Для справки, вот список 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"
]
}
}
}
принятое решение не работает. Это просто позволяет получить доступ к CloudFlare. Чтобы это решение работало, вы должны явно отрицать все в другом месте политики. Эта политика ведра обновляется для последних IP-адресов Cloudflare (включая IPv6), а также запрещает доступ не с IP-адреса Cloudflare из коробки.
{
"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": "*"
}
}
]
}
лучше использовать ваше доменное имя в качестве защиты входа в s3, а не список IPs.
перейдите на свой сайт Консоль S3
Выберите Панель Свойств
Под разрешение
Выберите добавить конфигурацию CORS
Добавьте свой CORSRules для ваших доменных имен
больше конфигурации CORS можно найти здесь
своего рода ошибка, но этот ответ только запрещает другие сайты из ссылки на ваши активы, а не из исходной конечной точки, которую S3 генерирует для вас...