Rails 3, paperclip + S3 - Howto Store для экземпляра и защиты доступа

У меня есть приложение Rails 3 со скрепкой, с намерением хранить данные на S3.

В приложении пользователи принадлежат экземпляру.

Я хотел бы, чтобы данные хранились во всех моделях на один экземпляр. И хотел бы запретить пользователю из экземпляра A получать доступ или загружать данные из экземпляра B.

Какой лучший способ справиться с этим? спасибо

Ответ 1

На самом деле я только что применил авторизированный URL-адрес S3 в моем приложении Ruby on Rails 3 с скрепкой. Позвольте мне рассказать, как я это сделал.

Так что я сделал, и то, что вы, вероятно, хотите, довольно легко реализовать. Позвольте мне привести вам пример:

Модель FileObject

has_attached_file :attachment,
  :path           => "files/:id/:basename.:extension",
  :storage        => :s3,
  :s3_permissions => :private,
  :s3_credentials => File.join(Rails.root, 'config', 's3.yml')

Контроллер FileObjectsController

  def download
    @file_object = FileObject.find(params[:id])
    redirect_to(@file_object.attachment.expiring_url(10))
  end

Я считаю, что это довольно просто. Вы добавляете приложение Paperclip к модели FileObject, а затем выполняете действие (скачать) в FileObjectsController. Таким образом, вы можете сделать некоторую авторизацию на уровне приложения внутри вашего контроллера с помощью before_filter или чего-то еще.

Метод expying_url() (предоставленный Скрепкой) в @file_object.attachment в основном запрашивает Amazon S3 для ключа, который делает доступный с этим конкретным ключом. Первый аргумент метода expying_url() принимает целое число, которое представляет количество секунд, в котором вы хотите, чтобы предоставленный URL-адрес истекал.

В моем приложении в настоящее время установлено значение 10 (@file_object.attachment.expiring_url (10)), поэтому, когда пользователь запрашивает файл, пользователь ВСЕГДА должен выполните мое приложение, например, myapp.com/file_objects/3/download, чтобы получить новый действительный URL-адрес от Amazon, который пользователь мгновенно будет использовать для загрузки файла, так как мы используем redirect_to в действии скачать. Таким образом, в основном через 10 секунд после того, как пользователь нажимает на действие скачать, ссылка уже истекла, и пользователь (или все еще) счастливо загружает этот файл, хотя он остается защищенным от любых несанкционированных пользователей.

Я даже пытался установить expiring_url (1), чтобы URL-адрес моментально истекал после того, как пользователь запускает запрос Amazon S3 для URL-адреса. Это работало для меня локально, но никогда не использовало его в производстве, вы тоже можете попробовать это. Однако я установил его на 10 секунд, чтобы дать серверу короткий промежуток времени для ответа. Отлично работает до сих пор, и я сомневаюсь, что кто-то убьет кого-то URL в течение 10 секунд после его создания, не говоря уже о том, что такое URL.

Дополнительная мера безопасности, которую я взяла, - это просто создать секретный ключ для каждого создаваемого файла, чтобы мой URL всегда выглядел следующим образом:

has_attached_file :attachment,
  :path => "files/:id/:secret_key/:basename.:extension"

Таким образом, каждый URL имеет уникальную secret_key в своем пути, что усложняет захват за время доступа к URL. Имейте в виду, что, пока URL-адрес вашего файла остается неизменным, доступность обеспечивается дополнительными параметрами, которые предоставляет Amazon S3, срок действия которых истекает:

http://s3.amazonaws.com/mybucket/files/f5039a57acc187b36c2d/my_file.pdf?AWSAccessKeyId=AKIAIPPJ2IPWN5U3O1OA&Expires=1288526454&Signature=5i4%2B99rUwhpP2SbNsJKhT/nSzsQ%3D

Обратите внимание на эту часть, которая является ключом Amazon, который генерирует и истекает, что делает файл временно доступным:

my_file.pdf?AWSAccessKeyId=AKIAIPPJ2IPWN5U3O1OA&Expires=1288526454&Signature=5i4%2B99rUwhpP2SbNsJKhT/nSzsQ%3D

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

Надеюсь, это поможет!

Ответ 2

Вы можете попробовать сказанное на этой странице:

http://thewebfellas.com/blog/2009/8/29/protecting-your-paperclip-downloads

Спектрифуги находятся в разделе "Больше потоковой передачи, время для перенаправления".

Резюме: S3 имеет четыре политики защищенного доступа, используя политику аутентифицированного чтения. S3 предоставляет способ создания аутентифицированного URL-адреса для частного контента, который работает только в течение определенного периода времени.

Я на самом деле этого не делал, поэтому, пожалуйста, дайте мне знать, если это сработает для вас.: -)

(отредактирован из моего ответа здесь: AWS S3/Ruby on Rails/heroku: дыра безопасности в моем приложении)

Ответ 3

Самый простой способ сделать это - это, вероятно, сохранить файл со случайным, неопознанным именем. Затем вы можете показывать URL-адреса пользователям в экземпляре A, но пользователи экземпляра B не смогут их угадать.

Это не пуленепробиваемая безопасность, но это достаточно хорошо. Например, Facebook использует этот подход для фотографий пользователей.