Доступ к файлам Django Stati c на Amazon S3 с политикой реферера «того же происхождения» - PullRequest
0 голосов
/ 27 мая 2020

Начиная с Django 3.0, SECURE_REFERRER_POLICY был добавлен и также включен в команду python manage.py check --deploy. Чтобы мой проект Django мог читать медиафайлы из Amazon S3, я ранее установил для меня значение strict-origin-when-cross-origin, а также политику S3, позволяющую пользователю programmati c делать все, и другую политику, которая проверяла если заголовок реферера был установлен для моего домена (аналогично тому, что описано в этом вопросе Amazon S3 Bucket Policy Referer ).

Но это была очень элементарная защита от горячих ссылок, и мне посоветовали форумы Django, чтобы переключиться на same-origin.

Однако теперь мой сайт больше не может получать какие-либо файлы ресурсов (ошибка 403), и поиск ответа по документам django-storages и S3 пока что оказался трудным и бесплодным. : (

Вот что у меня сейчас есть:

На стороне Django у меня django-storages настроено с:

  • AWS_DEFAULT_ACL = 'authenticated-read'
  • SECURE_REFERRER_POLICY = 'same-origin'
  • STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

На AWS у меня действует следующая политика (политика доступа по рефереру была удалена) :

{
    "Statement": [
        {
            "Sid": "Allow programatic admin to handle bucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxxxxxxxxxx:user/bucket-manager"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::bucket-name/*"
        }
    ]
}

Следующие CORS:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>

И программа пользователя c имеет следующую политику:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ]
        }
    ]
}

У меня было ощущение, что Мне не хватало, чтобы добавить пользователя bucket-manager в ACL ведра, но пользовательский интерфейс запрашивает канонический идентификатор, и я, честно говоря, не могу его найти.

...