Отправка «безопасной» финансовой отчетности на S3 - PullRequest
1 голос
/ 20 января 2012

Мне нужно предоставить физическое лицо, и я использую S3.Пока что я делаю файл public-read и создаю уникальный Key, используя uuid.uuid4().

Будет ли это приемлемым или как еще я могу сделать это более безопасным?Отправка ключей аутентификации для каждого отдельного лица не возможна.

Ответы [ 3 ]

7 голосов
/ 20 января 2012

Рассматривали ли вы создание истекающих URL для файлов на S3.

from boto.s3.connection import S3Connection

conn = S3Connection(AWS_ACCESS_KEY_ID,
                    AWS_SECRET_ACCESS_KEY, is_secure=False)

# The generated temp_url remains valid for 60 seconds in this case
temp_url = conn.generate_url(60, 'GET', bucket=bucket_name, 
                             key=file_name, force_http=True)
3 голосов
/ 20 января 2012

Если у вас уже есть система аутентификации и входа в систему, вы можете значительно повысить безопасность, раздавая PDF-ссылки, ссылающиеся на ваш сайт , а затем перенаправляя на URL-адрес S3, созданный с помощью Запрос Аутентификация запроса строки (он же "временные URL").

Предположим, у вас есть следующее:

  • financial-statements S3, содержащий ваши PDF-файлы. Ведро и все PDF-файлы помечены authenticated-read.
  • financial-statement-reader Пользователь S3 со своим собственным ключом доступа ABCDEFGaccesskeyid
  • URL https://example.org/u/12345/statements/2011-04. Это страница на веб-сайте, которым вы управляете, и к которой нельзя получить доступ, если клиент не прошел аутентификацию в системе аутентификации вашего веб-сайта.

Вот как это будет работать:

  1. Создание PDF-отчета о финансовой отчетности и загрузка его на s3: https://financial-statements.s3.amazonaws.com/12345_2011-04.pdf В настоящее время только пользователи с аутентификацией S3 могут скачать pdf, а не ваш клиент.
  2. Сообщите клиенту URL-адрес https://example.org/u/12345/statements/2011-04 в качестве URL-адреса "Финансовый отчет за апрель 2011 года".
  3. Клиент ПОЛУЧАЕТ этот URL и аутентифицируется на вашем веб-сайте, если необходимо.
  4. Вы вводите URL-адрес аутентификации запроса строки запроса для 12345_2011-04.pdf, используя ключ доступа ABCDEFGaccesskeyid и срок действия в будущем 30 секунд. Вы получите ссылку, которая выглядит следующим образом: https://financial-statements.s3.amazonaws.com/12345_2011-04.pdf?AWSAccessKeyId=ABCDEFGaccesskeyid&expires=1175139620& Signature=rucSbH0yNEcP9oM2XNlouVI3BH4%3D
  5. Вы отвечаете на GET-запрос клиента с помощью HTTP 307 (временное перенаправление), Cache-control: private,max-age=30 и Location: https://financial-statements.s3.amazonaws.com/12345_2011-04.pdf?AWSAccessKeyId=ABCDEFGaccesskeyid&expires=1175139620& Signature=rucSbH0yNEcP9oM2XNlouVI3BH4%3D
  6. Клиент загружает свои PDF напрямую с S3. Если кто-то злоумышленник украл этот URL, он может загрузить выписки клиента только в течение 30 секунд, после чего этот URL становится бесполезным.
1 голос
/ 20 января 2012

Несмотря на то, что UUID версии 4 должны включать случайные данные, я не хотел бы полагаться на тот факт, что ГСЧ, используемый Python uuid.uuid4(), является надежно случайным.В документации по Python ничего не говорится о качестве случайности, поэтому я боюсь, что вы можете получить предположительные UUID.

Я не специалист по криптографии, поэтому не буду предлагать конкретныйальтернативный вариант, но я бы предложил использовать что-то, предназначенное для создания случайных криптовалютных данных, и преобразовать их в нечто, что можно использовать в качестве ключа S3 (я не уверен, каковы могут быть требования к данным ключа S3, ноя думаю, что они должны быть чем-то вроде имени файла).

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

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