Политика корзины S3 для установки папки, доступной для чтения по ссылочному URL-адресу, и другой папки, доступной только для пользователя AWS.

У нас есть структура с приложением Laravel, работающим по URL-адресу www.example.com и подключенным к корзине с 3 папками внутри.

folder_a
folder_b
folder_c

В идеале мы хотели бы, чтобы приложение могло:

  • Загрузить объекты в три папки
  • Получить объекты из папки_a (но только по запросам, поступающим с www.example.com/example.com, а не везде в Интернете (избегая хотлинкинга и прямого доступа по URL)

Кроме того, folder_b и folder_c должны быть полностью запрещены в Интернете (не перечислять папки и не получать объекты, даже зная URL-адрес). В то же время пользователь IAM должен иметь доступ ко всему, загружать/скачивать/редактировать/удалять все.

Мы безуспешно пробовали множество политик корзин. Мы успешно создали пользователя IAM, и наше приложение Laravel уже отправляет объекты в S3.

NOTE: This is not about Laravel configuration, it's about S3 bucket policies. The app is already sending objects to S3 correctly, and all objects are public now

person Diego Rey    schedule 05.09.2019    source источник
comment
Требует ли какая-либо часть вашего приложения Laravel, чтобы какая-либо часть корзины S3 была общедоступной?   -  person congbaoguier    schedule 05.09.2019
comment
Жаль, что я не видел этот комментарий раньше. Приложение Laravel получает изображения из папки folder_a, которые должны отображаться на временной шкале. Активы для приложения находятся за пределами S3. Думайте о приложении как о странице канала: люди загружают свои изображения, приложение сохраняет изображения на S3, а затем приложение извлекает эти изображения из S3, чтобы показать их другим пользователям.   -  person Diego Rey    schedule 06.09.2019


Ответы (1)


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

Вот политика ведра:

{
    "Version": "2012-10-17",
    "Statement": [
        // this one make sure only ListBucket api calls from laravel user are allowed
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::1234567890:user/<laravel_iam_user>"
            },
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<yourbucket>"
            ]
        },
        // this one make sure only upload api calls from laravel user are allowed
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::1234567890:user/<laravel_iam_user>"
            },
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::<yourbucket>/folder_a/*",
                "arn:aws:s3:::<yourbucket>/folder_b/*",
                "arn:aws:s3:::<yourbucket>/folder_c/*"
            ]
        },
        // this one make sure only download api calls from www.example.com/example.com are allowed
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<yourbucket>/folder_a/*"
            ],
            "Condition": {
               "StringLike": {"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
            }
        }
    ]
}

Изменить: поскольку OP на самом деле хочет получить общий доступ к части ведра, не следует проверять все 4 настройки блокировки общего доступа.

person congbaoguier    schedule 05.09.2019
comment
Боюсь, это не верное решение. При наличии этой политики и даже при выборе последней опции в Блокировать публичный доступ (Блокировать публичный и кросс-аккаунтный доступ к корзинам и объектам с помощью любых общедоступных политик корзин) объекты в folder_b и folder_c по-прежнему можно загрузить из Интернета. Если я применю 4 проверки к блокировке общего доступа, ничего не станет общедоступным, даже объекты в folder_a. Кроме того, в политике есть ошибка: ресурс для первого блока (s3:ListBucket) должен быть только ведром. Если я добавлю косую черту и звездочку, AWS не позволит мне сохранить. - person Diego Rey; 06.09.2019
comment
Я отредактировал ответ. Поэтому я хотел применить все 4 проверки. Зачем вам нужен публичный доступ к объектам в папке_a? Вы упомянули, что приложение извлекает эти изображения из S3, чтобы показывать их другим пользователям. В этом случае только ваше приложение фактически загружает объект. Таким образом, Условие на самом деле может быть удалено, поскольку только ‹laravel_iam_user›, также известное как ваше приложение, может загружать объект в папку_a. - person congbaoguier; 06.09.2019
comment
Но приложение использует эти изображения, чтобы показать их пользователю, поэтому они должны быть доступны для отображения в браузере. Я не знаю, достаточно ли я ясно выразился, но объекты в folder_a должны быть видны публично, но только для запросов с www.example.com (однако они должны отображаться в браузере с помощью простого тега <img src="..."> ( Мы не читаем объект в приложении и не показываем себя абы как) - person Diego Rey; 06.09.2019
comment
Наконец-то ты ясно дал понять. Снова отредактировал ответ, в основном просто изменил принципала на всех (*) и вернул условие имени хоста. Для блокировки общего доступа вы можете проверить максимум два первых списка управления доступом. Но если ваш код помещает объект с общедоступным ACL, вы также не можете их проверить. - person congbaoguier; 06.09.2019
comment
Работал как шарм! Большое спасибо! :) - person Diego Rey; 07.09.2019