Я реализую прямую загрузку файлов с клиентского компьютера на Amazon S3 через REST API, используя только JavaScript, без какого-либо серверного кода. Все работает нормально, но меня беспокоит одно ...
Когда я отправляю запрос в Amazon S3 REST API, мне нужно подписать запрос и поставить подпись в Authentication
заголовок. Чтобы создать подпись, я должен использовать свой секретный ключ. Но все происходит на стороне клиента, поэтому секретный ключ может быть легко раскрыт из источника страницы (даже если я замаскирую / зашифрую свои источники).
Как я могу справиться с этим? И это вообще проблема? Может быть, я могу ограничить использование определенного закрытого ключа только вызовами API REST из определенного источника CORS и только методами PUT и POST или, возможно, связать ключ только с S3 и конкретным сегментом? Может быть есть другие способы аутентификации?
«Безсерверное» решение является идеальным, но я могу рассмотреть возможность использования некоторой обработки на стороне сервера, за исключением загрузки файла на мой сервер и последующей отправки на S3.
Ответы:
Я думаю, что вы хотите, чтобы загрузки на основе браузера с использованием POST.
По сути, вам нужен код на стороне сервера, но все, что он делает, это генерирует подписанные политики. Как только код на стороне клиента имеет подписанную политику, он может загружать данные с помощью POST напрямую в S3 без передачи данных через ваш сервер.
Вот официальные ссылки на документы:
Диаграмма: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html
Пример кода: http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTExamples.html
Подписанная политика будет отображаться в вашем html в такой форме:
Обратите внимание, что действие FORM отправляет файл непосредственно на S3, а не через ваш сервер.
Каждый раз, когда один из ваших пользователей захочет загрузить файл, вы создадите
POLICY
иSIGNATURE
на своем сервере. Вы возвращаете страницу в браузер пользователя. Затем пользователь может загрузить файл непосредственно на S3, не проходя через ваш сервер.Когда вы подписываете политику, срок действия политики обычно истекает через несколько минут. Это заставляет ваших пользователей общаться с вашим сервером перед загрузкой. Это позволяет вам контролировать и ограничивать загрузку, если вы хотите.
Единственные данные, поступающие на ваш сервер или с него, - это подписанные URL-адреса. Ваши секретные ключи остаются секретными на сервере.
источник
${filename}
к имени ключа, так что для приведенного выше примера,user/eric/${filename}
а не простоuser/eric
. Еслиuser/eric
это уже существующая папка, загрузка завершится неудачно (вы даже будете перенаправлены на success_action_redirect), а загруженный контент не будет там. Просто потратил часы на отладку, думая, что это проблема разрешения.Вы можете сделать это с помощью AWS S3 Cognito, воспользовавшись этой ссылкой здесь:
http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html#Amazon_S3
Также попробуйте этот код
Просто измените Регион, IdentityPoolId и Ваше имя корзины
источник
Вы говорите, что хотите «безсерверное» решение. Но это означает, что у вас нет возможности помещать любой «ваш» код в цикл. (ПРИМЕЧАНИЕ. После того, как вы передадите свой код клиенту, теперь это «его» код.) Блокировка CORS не поможет: люди могут легко написать не-веб-инструмент (или веб-прокси), который добавляет правильный заголовок CORS для злоупотребления вашей системой.
Большая проблема в том, что вы не можете различить разных пользователей. Вы не можете позволить одному пользователю просматривать / просматривать свои файлы, но запрещать другим делать это. Если вы обнаружите злоупотребление, вы ничего не сможете с этим поделать, кроме как сменить ключ. (Что злоумышленник, вероятно, может просто получить снова.)
Лучше всего создать «пользователя IAM» с ключом для вашего клиента JavaScript. Только дайте ему доступ на запись только к одному ведру. (но в идеале не включайте операцию ListBucket, которая сделает ее более привлекательной для злоумышленников.)
Если у вас есть сервер (даже простой микроэкземпляр по 20 долларов в месяц), вы можете подписать ключи на своем сервере, одновременно отслеживая / предотвращая злоупотребления в режиме реального времени. Без сервера лучшее, что вы можете сделать, - это периодически отслеживать постфактумные злоупотребления. Вот что я бы сделал:
1) периодически поворачивайте ключи для этого пользователя IAM: каждую ночь генерируйте новый ключ для этого пользователя IAM и заменяйте самый старый ключ. Поскольку есть 2 ключа, каждый ключ будет действителен в течение 2 дней.
2) включить ведение журнала S3 и загружать журналы каждый час. Установите оповещения о «слишком много загрузок» и «слишком много загрузок». Вам нужно будет проверить как общий размер файла, так и количество загруженных файлов. И вы захотите отслеживать как общие итоги, так и итоги по каждому IP-адресу (с более низким порогом).
Эти проверки могут быть выполнены «без сервера», потому что вы можете запустить их на своем рабочем столе. (т. е. S3 выполняет всю работу, эти процессы только для того, чтобы предупредить вас о злоупотреблении вашей корзиной S3, чтобы вы не получили гигантский счет AWS в конце месяца.)
источник
Добавив дополнительную информацию к принятому ответу, вы можете обратиться к моему блогу, чтобы увидеть работающую версию кода с использованием AWS Signature version 4.
Подведу итоги здесь:
Как только пользователь выберет файл для загрузки, выполните следующие действия: 1. Выполните вызов веб-сервера, чтобы запустить службу для генерации необходимых параметров.
В этом сервисе позвоните в сервис AWS IAM, чтобы получить временный кредит
Получив кредит, создайте политику сегмента (строка в кодировке 64). Затем подпишите политику корзины временным секретным ключом доступа, чтобы сгенерировать окончательную подпись.
отправить необходимые параметры обратно в интерфейс
Как только это будет получено, создайте объект формы HTML, установите необходимые параметры и отправьте его.
Для получения подробной информации, пожалуйста, обратитесь https://wordpress1763.wordpress.com/2016/10/03/browser-based-upload-aws-signature-version-4/
источник
Это то, где вы неправильно поняли. Причина, по которой используются цифровые подписи, заключается в том, что вы можете проверить правильность чего-либо, не раскрывая свой секретный ключ. В этом случае цифровая подпись используется для предотвращения изменения пользователем политики, установленной для публикации формы.
Цифровые подписи, такие как здесь, используются для обеспечения безопасности во всем Интернете. Если бы кто-то (АНБ?) Действительно смог их сломать, у них были бы цели намного больше, чем у вашего S3-ведра :)
источник
Я дал простой код для загрузки файлов из браузера Javascript в AWS S3 и перечисления всех файлов в корзине S3.
шаги:
Чтобы узнать, как создать Create IdentityPoolId http://docs.aws.amazon.com/cognito/latest/developerguide/identity-pools.html
Перейдите на страницу консоли S3 и откройте конфигурацию cors из свойств корзины и запишите в нее следующий XML-код.
Создайте HTML-файл, содержащий следующий код, измените учетные данные, откройте файл в браузере и наслаждайтесь.
источник
Если у вас нет кода на стороне сервера, ваша безопасность зависит от безопасности доступа к вашему коду JavaScript на стороне клиента (т.е. каждый, кто имеет этот код, может что-то загрузить).
Поэтому я бы порекомендовал просто создать специальную корзину S3, которая доступна для записи (но не для чтения), так что вам не нужны подписанные компоненты на стороне клиента.
Имя корзины (например, GUID) будет вашей единственной защитой от вредоносных загрузок (но потенциальный злоумышленник не может использовать вашу корзину для передачи данных, поскольку она предназначена только для записи в него)
источник
Вот как вы генерируете документ политики с использованием узла и без сервера
Используемый объект конфигурации хранится в хранилище параметров SSM и выглядит следующим образом
источник
Если вы хотите использовать стороннюю службу, auth0.com поддерживает эту интеграцию. Служба auth0 обменивает стороннюю аутентификацию службы SSO на временный сеансовый токен AWS с ограниченными разрешениями.
См .: https://github.com/auth0-samples/auth0-s3-sample/
и документацию auth0.
источник