copyObject Доступ запрещен в S3 Bucket, несмотря на политику, разрешающую реферер моего сайта - PullRequest
0 голосов
/ 23 марта 2019

Я использую AWS SDK для PHP для загрузки и отображения файлов в / из моей корзины S3.

Файлы должны быть доступны только через мой сайт, никакой другой реферер не разрешен - хотлинки и т. Д.

Мне также нужно иметь возможность копировать объекты внутри корзины.

Я создаю и подключаюсь как обычно:

    $s3Client = new Aws\S3\S3Client([
        'version'       => 'latest',
        'region'        => 'eu-west-2'
    ]);

    $s3 = $s3Client::factory(array(
        'version'       => 'latest',
        'region'        => 'eu-west-2',
        'credentials'   => array(
        'provider'      => $provider,
        'key'           => $key,
        'secret'        => $secret
        )
    ));

И выполнить команду «Копировать объект»:

    $s3->copyObject([
        'Bucket'     => "{$targetBucket}",
        'Key'        => "{$targetKeyname}",
        'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
    ]);

Я пробовал политику, использующую «Разрешить, если строка похожа на реферер», но затем AWS сообщает мне, что я разрешаю публичный доступ?!?!? Все работает просто отлично, ДАЖЕ действие copyObject, но файлы по-прежнему доступны напрямую и отовсюду!

Я пытаюсь использовать «Запретить, если строка не похожа на реферер», которая работает в основном так, как ожидалось - я могу загружать и отображать файлы, а файлы не отображаются при прямой ссылке (что я и хочу) - однако, действие copyObject больше не работает, и я получаю сообщение об отказе в доступе.

Я пробовал все остальное, что мог придумать, и часами гуглял и искал ответы, но безрезультатно.

Вот каждая отдельная политика ...

РАЗРЕШИТЬ ТОЛЬКО ДОСТУП К ФАЙЛУ (GetObject), если строка LIKE referrer:

{
"Version": "2008-10-17",
"Id": "",
"Statement": [
    {
        "Sid": "Deny access if referer is not my site",
        "Effect": "Deny",
        "Principal": {
            "AWS": "*"
        },
        "Action": "s3:GetObject",
        "Resource": [
            "arn:aws:s3:::MY-BUCKET/*"
        ],
        "Condition": {
            "StringLike": {
                "aws:Referer": [
                    "http://MY-SITE/*",
                    "https://MY-SITE/*"
                    ]
                }
            }
        }
    ]
}

РЕЗУЛЬТАТ: загрузка и копирование объекта работают, но файлы по-прежнему доступны везде


ОТКЛОНИТЬ ВСЕ ДЕЙСТВИЯ (*), если строка NOT LIKE, ссылка:

{
"Version": "2008-10-17",
"Id": "",
"Statement": [
    {
        "Sid": "Deny access if referer is not my site",
        "Effect": "Deny",
        "Principal": {
            "AWS": "*"
        },
        "Action": "s3:GetObject",
        "Resource": [
            "arn:aws:s3:::MY-BUCKET/*"
        ],
        "Condition": {
            "StringNotLike": {
                "aws:Referer": [
                    "http://MY-SITE/*",
                    "https://MY-SITE/*"
                    ]
                }
            }
        }
    ]
}

РЕЗУЛЬТАТ: действие copyObject больше не работает, и я получаю сообщение об ошибке отказа в доступе

Ответы [ 2 ]

1 голос
/ 24 марта 2019

AWS, вероятно, предупреждает вас о том, что он общедоступен, потому что он для всех практических целей все еще общедоступен.

Предупреждение

Этот ключ следует использоватьосторожно: aws:referer позволяет владельцам сегментов Amazon S3 предотвращать доставку их контента неавторизованными сторонними сайтами в стандартные веб-браузеры.[...] Поскольку aws:referer значение предоставляется вызывающей стороной в заголовке HTTP, неавторизованные стороны могут использовать модифицированные или настраиваемые браузеры для предоставления любого значения aws: referer, которое они выберут.В результате aws: referer не должен использоваться для предотвращения прямых запросов AWS неавторизованными сторонами.Он предлагается только для того, чтобы позволить клиентам защитить свой цифровой контент, хранящийся в Amazon S3, от ссылки на неавторизованные сторонние сайты.

https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html

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

И это ваша проблема с copyObject() - запрос не выполняется браузером , поэтому для проверки нет заголовка Referer.

Вы можете использовать условный тест StringLikeIfExists для Deny только неправильных рефереров (игнорируя отсутствиерефереру, как это происходит с копией объекта) или - лучше - просто предоставьте s3:GetObject с StringLike вашему рефереру, понимая, что публичное предупреждение верно - это разрешает доступ без аутентификации, то есть то, что проверяет реферер,Ваш контент по-прежнему общедоступен, но не из стандартного неизмененного веб-браузера, если есть горячая ссылка с другого сайта.

Для большей безопасности вы захотите отобразить HTML-код с предварительно подписанными URL-адресами (с коротким сроком действия) дляваши ресурсы S3 или иным образом выполните полную и правильную авторизацию с помощью Amazon Cognito.

0 голосов
/ 23 марта 2019

Объекты в Amazon S3 являются частными по умолчанию .Доступ отсутствует, если только он не предоставлен каким-либо образом (например, для пользователя IAM, группы IAM или политики сегмента S3).

Все вышеприведенные политики - это Запретить политики, которые могут переопределять Разрешить политика.Следовательно, они не являются причиной того, что что-то является доступным .

Вы должны начать с выяснения того, что предоставляет доступ, а затем удалить этот доступ .Как только объекты снова станут частными, вы должны создать Bucket Policy с операторами Allow, которые определяют, в каких ситуациях доступ разрешен.

...