Использование S3 для загрузки, но не разрешает публичный доступ - PullRequest
0 голосов
/ 14 января 2019

Моя идея заключалась в том, чтобы создать корзину S3, позволяющую пользователям загружать двоичные объекты. Следующим шагом будет подтверждение загрузки, после чего API начнет обработку файла.

Чтобы сделать его более безопасным, клиент сначала запросит место загрузки. Затем API выделяет и предварительно создает каталог одноразового использования на S3 для этой загрузки и устанавливает политику доступа к этому каталогу, чтобы разрешить в него файл, который будет выгружен (но в идеале не должен быть прочитан или даже перезаписан).

После подтверждения клиентом API начинает обработку и очистку.

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

s3: // ведро / год / месяц / день / UUID / UUID / имя файла

Куда добавляется дата, чтобы позднее можно было выполнить очистку потерянных файлов (и, если требуется увеличение объема, можно добавить часы / минуты.

Первый UUID не имеет смысла, кроме предоставления уникального местоположения загрузки. Второй идентифицирует пользователя.

Весь путь создается API. Затем API предоставляет пользователю доступ для записи в этот конечный каталог. (Пользователь не должен иметь права создавать этот каталог).

Вопрос, с которым я застрял, заключается в том, что из-за поиска в Google кажется, что общедоступные записи S3-блоков считаются плохой практикой, даже ужасно.

Какая у меня альтернатива? а) предоставить клиенту какой-нибудь токен доступа? б) создать учетную запись IAM для каждого загрузчика (я не хочу, чтобы меня связывали с Amazon) в) Есть ли другие варианты?

P.S А можно ли контролировать фактическое имя файла, которое клиент может использовать для создания файла из политики?

1 Ответ

0 голосов
/ 15 января 2019

Насколько я понимаю, ваши цели:

  • Безопасно позволяет пользователям загружать определенные файлы в корзину S3
  • Ограничить доступ , запретив пользователям читать или писать другие файлы
  • В идеале, загружать файлы напрямую на S3 , не проходя через ваш сервер

Это можно сделать, сгенерировав предварительно назначенные URL-адреса PUT на стороне сервера и вернув эти URL-адреса клиенту. Клиент может использовать эти URL-адреса для загрузки непосредственно на S3. Клиент ограничен только именем файла, которое вы указываете при подписании URL. Это будет ограничено только PUT. Вы храните свои ключи доступа AWS в безопасности на сервере и никогда не отправляете их клиенту.

Если вы используете API PutObject, вам нужно всего лишь подписать один URL на файл. Если вы используете API загрузки из нескольких частей, он немного сложнее, и вам нужно будет начать и завершить загрузку на стороне сервера и отправить предварительно назначенные URL-адреса UploadPart клиенту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...