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 для ваших доменных имен

S3-CORS-Config example

больше конфигурации CORS можно найти здесь


своего рода ошибка, но этот ответ только запрещает другие сайты из ссылки на ваши активы, а не из исходной конечной точки, которую S3 генерирует для вас...