2015-04-25 3 views
3

Идея состояла в том, чтобы генерировать случайный ключ для каждого загружаемого файла, передать этот ключ S3, чтобы зашифровать его и сохранить ключ в базе данных. Когда пользователь хочет получить доступ к файлу, ключ считывается из базы данных и снова переходит на S3.AWS S3 SSE GetObject требует секретного ключа

Первая часть работает. Мои объекты загружены и зашифрованы успешно, но у меня есть проблемы с их извлечением.

Извлечение файлов с заголовков запроса набор:

При настройке заголовков запроса, такие как x-amz-server-side-encryption-customer-algorithm и т.д. при выполнении запроса GET к ресурсу, работает, и я могу получить к нему доступ. Но поскольку я хочу использовать эти ресурсы как src для <img>-Tag, я не могу выполнять запросы GET, для которых требуются заголовки.

Таким образом, я думал о:

Pre подписания URLs:

Чтобы создать предварительно подписанный URL, я построил HMAC SHA1 требуемой строки и использовать его в качестве подписи. Вычисленная сигнатура принимается S3, но я получаю следующую ошибку при запросе предварительно подписанного URL-адреса:

Запросы, указывающие на стороне сервера Шифрование с предоставленными Клиентом ключами, должны предоставить соответствующий секретный ключ.

URL-адрес имеет вид:

https://s3-eu-west-1.amazonaws.com/bucket-id/resource-id?x-amz-server-side-encryption-customer-algorithm=AES256&AWSAccessKeyId=MyAccessKey&Expires=1429939889&Signature=GeneratedSignature 

Причина показана ошибка, кажется, довольно ясно. Ни при каких условиях в процессе подписания не использовался ключ шифрования. Таким образом, запрос не может работать. В результате я добавил ключ шифрования как Base64 и Md5 в качестве параметров URL. URL-адрес теперь имеет следующий формат:

https://s3-eu-west-1.amazonaws.com/bucket-id/resource-id?x-amz-server-side-encryption-customer-algorithm=AES256&AWSAccessKeyId=MyAccessKey&Expires=1429939889&Signature=GeneratedSignature&x-amz-server-side-encryption-customer-key=Base64_Key&x-amz-server-side-encryption-customer-key-MD5=Md5_Key 

Хотя ключ сейчас присутствует (imho), я получаю такое же сообщение об ошибке.

Вопрос Кто-нибудь знает, как я могу получить доступ к зашифрованным файлам с GET запроса, который не предусматривает каких-либо заголовки, такие как x-amz-server-side-encryption-customer-algorithm?

ответ

0

Мне кажется достаточно интуитивным, что то, что вы пытаетесь, должно сработать.

Видимо, хотя, когда они говорят «заголовки» ...

вы должны предоставить все заголовки шифрования в клиентском приложении.

http://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html#sse-c-how-to-programmatically-intro

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

Я протестировал это, и вот что я пришел к выводу: делать это не поддерживается.

GET запрос с x-amz-server-side-encryption-customer-algorithm=AES256 включены в строку запроса (и подписи), наряду с X-Amz-Server-Side-Encryption-Customer-Key и X-Amz-Server-Side-Encryption-Customer-Key-MD5заголовки делает работу, как ожидалось ... как я полагаю, вы обнаружили ... но положить ключ и key-md5 в строке запроса, с включением или без включения в подпись, кажется тупиковой.

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

Основываясь на том, что я нашел в тестировании, я не вижу способа напрямую использовать зашифрованные объекты с ключами, предоставленными клиентом, в гиперссылках.

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

+0

Спасибо за отличное объяснение. Однако моя проблема не решена. Я хочу использовать потребительское шифрование, чтобы убедиться, что разрешен просмотр только владельцам файлов. Таким образом, наличие ссылки, содержащей ключ, не является реальной проблемой, поскольку мой бэкэнд гарантирует только отправку ссылки правильному пользователю. При использовании ключевых механизмов Amazon я не знаю, как контролировать, кто может просматривать файлы, а кто нет. В это время мне кажется, что при использовании ключа Amazon я должен создать пользователя в Amazon для каждого моего пользователя и, соответственно, обновить объекты acl. –

+0

* «мой бэкэнд гарантирует только отправку ссылки правильному пользователю» * ... если это правда, это звучит так, как будто вы игнорируете очевидное: если пользователю не разрешено видеть файл, не давайте для них подписанный URL-адрес. Объекты в S3 не являются общедоступными, если вы не создадите их таким образом, либо через ACL-объекты, либо с помощью политики ведра. Неподписанная ссылка на правильно настроенный объект и ведро даже не показывает, существует ли такой объект даже. Это просто «403 Запрещено». Дай мне знать, смогу ли я это прояснить. –

Смежные вопросы