Я использую cloudflare с изображениями на s3. На cloudflare я настроил CNAME, который правильно определяет имя моего сегмента. Я хочу, чтобы мои изображения были доступны (GetObject), только если они доступны через CloudFlare. Но мне также нужно, чтобы загрузка изображений (PutObject) была возможна из любой точки мира.
Мне нужно сделать для этого политику корзины. Это то, что у меня есть сейчас, но при попытке загрузки выдает ошибку «Отказано в доступе». Если я удаляю третье выражение DenyNonPutRequestsNotFromCloudflare
, то оно работает нормально, но это позволяет моим изображениям быть доступными, используя прямой URL-адрес s3 без cloudflare (что мне не нужно):
{
"Version": "2012-10-17",
"Id": "Policy1566100376741",
"Statement": [
{
"Sid": "AllowPuttingImages",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXXXXX:user/username"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::BUCKETNAME/*"
},
{
"Sid": "DenyNonImageExtensionType",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"NotResource": [
"arn:aws:s3:::BUCKETNAME/*.jpg",
"arn:aws:s3:::BUCKETNAME/*.png",
"arn:aws:s3:::BUCKETNAME/*.jpeg"
]
},
{
"Sid": "DenyNonPutRequestsNotFromCloudflare",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"NotAction": "s3:PutObject",
"Resource": "arn:aws:s3:::BUCKETNAME/*",
"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"
]
}
}
}
]
}