Реализация Rails для защиты документов S3 - PullRequest
11 голосов
/ 19 июня 2011

Я бы хотел защитить свои документы s3 позади с помощью приложения rails, чтобы при переходе на:

www.myapp.com / attachment / 5, которая должна аутентифицировать пользователя перед отображением / загрузкой документа.

Я читал похожие вопросы по stackoverflow, но я не уверен, что видел какие-то хорошие выводы.

Из того, что я прочитал, есть несколько вещей, которые вы можете сделать, чтобы "защитить" свои документы S3.

1) Запутать URL. Я сделал это. Я думаю, что это хорошая вещь, чтобы никто не мог угадать URL. Например, было бы легко «пройтись» по URL-адресам, если ваши URL-адреса S3 очевидны: https://s3.amazonaws.com/myapp.com/attachments/1/document.doc. Наличие URL-адреса, такого как: https://s3.amazonaws.com/myapp.com/7ca/6ab/c9d/db2/727/f14/document.doc кажется намного лучше. Это прекрасно, но не решает проблему передачи URL-адресов по электронной почте или через веб-сайты.

2) Используйте URL с истекающим сроком, как показано здесь: Rails 3, paperclip + S3 - Как сохранить экземпляр и защитить доступ Для меня, однако, это не очень хорошее решение, потому что URL выставлен (даже в течение короткого периода времени), и другой пользователь может, возможно, вовремя повторно использовать URL. Вы должны настроить время для загрузки, не выделяя слишком много времени на копирование. Это кажется неправильным решением.

3) Прокси загрузки документа через приложение. Сначала я попытался просто использовать send_file: http://www.therailsway.com/2009/2/22/file-downloads-done-right, но проблема в том, что эти файлы могут быть только статическими / локальными файлами на вашем сервере и не обслуживаться через другой сайт (S3 / AWS). Однако я могу использовать send_data, загрузить документ в мое приложение и сразу же передать документ пользователю. Проблема с этим решением очевидна - вдвое больше пропускной способности и вдвое больше времени (чтобы загрузить документ в мое приложение, а затем обратно к пользователю).

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

Предложения будут с благодарностью.

UPDATE

Я пошел с 4-м решением:

4) Использование политик Amazon для управления доступом к файлам на основе реферера: http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?UsingBucketPolicies.html

ОБНОВЛЕНИЕ СНОВА:

Ну # 4 можно легко обойти через инструмент разработчика браузера. Так что я все еще в поисках твердого решения.

Ответы [ 2 ]

0 голосов
/ 28 июня 2013

Я уже довольно давно пытаюсь сделать нечто подобное. Если вы не хотите использовать пропускную способность дважды, то единственный способ сделать это - позволить S3 это сделать. Теперь я полностью с вами о разоблаченном URL. Удалось ли вам найти какую-либо альтернативу?

Я нашел кое-что полезное в этом отношении - http://docs.aws.amazon.com/AmazonS3/latest/dev/AuthUsingTempFederationTokenRuby.html

Как только пользователь входит в систему, должен быть создан сеанс aws с его IP как частью политики aws, который затем можно использовать для генерации подписанных URL-адресов. Таким образом, в случае, если кто-то еще захватит URL, подпись не будет совпадать, так как источником запроса будет другой IP. Дайте мне знать, если это имеет смысл и достаточно ли безопасно.

0 голосов
/ 19 июня 2011

Я бы проголосовал за номер 3, это единственный действительно безопасный подход.Потому что как только вы передадите пользователя на S3 URL, который действителен до истечения срока его действия.Лукавый пользователь может использовать эту дыру, единственный вопрос в том, повлияет ли это на ваше приложение?Возможно, вы могли бы установить время истечения, которое будет меньше, что минимизирует риск?Взгляните на выдержку из этого поста: Доступ к закрытым объектам из браузера

Все частные объекты доступны через аутентифицированный GET-запрос к серверам S3.Вы можете сгенерировать аутентифицированный URL для объекта, подобного этому:

S3Object.url_for('beluga_baby.jpg', 'marcel_molina')

По умолчанию аутентифицированные URL-адреса истекают через 5 минут после их создания.

Можно указать параметры срока действиялибо с абсолютным временем с начала эпохи с опциями: expires, либо с количеством секунд относительно текущего момента с опциями: expires_in:

...