Как безопасно подписывать запросы с помощью учетных данных aws?

Я не совсем уверен, стоит ли мне задавать этот вопрос, поэтому не стесняйтесь вносить изменения.

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

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

Если это правильно, может кто-нибудь объяснить и дать мне простой пример того, как сделать это в Python? Спасибо. 🙂

Вот что у меня есть, и я хотел бы, чтобы клиенты загружали код:

from boto3 import  client
import boto3
import StringIO
from contextlib import closing

polly = boto3.client(
'polly',
region_name='us-east-1',
aws_access_key_id='I_want_to_protect_this',
aws_secret_access_key='I_also_want_to_protect_this'
)

response = polly.synthesize_speech(
Text="Good Morning. My Name is Rajesh. I am Testing Polly AWS Service For Voice Application.",
OutputFormat="mp3",
VoiceId="Raveena")

print(response)

if "AudioStream" in response:
with closing(response["AudioStream"]) as stream:
data = stream.read()
fo = open("pollytest.mp3", "w+")
fo.write( data )
fo.close()

0

Решение

Правильный подход к предоставлению людям доступа к сервисам и ресурсам AWS, хранящимся в AWS, заключается в подходе клиент / сервер.

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

сервер это приложение, запущенное где-то (обычно в Amazon EC2 или AWS Lambda), которое получает запросы от клиента, применяет бизнес-логику (например, проверяет личность пользователя и определяет, какие действия ему разрешено выполнять) и вызывает сервисы AWS.

Тогда есть два подхода к звонкам в AWS:

  • сервер может выполнять все вызовы в AWS (используя учетные данные, доступные только для сервера) и передавать результаты клиенту. Это изолирует клиента от AWS и позволяет вставлять пользовательскую бизнес-логику на сервер. (Например, когда вы используете Netflix, ваш телевизор не вызывает AWS напрямую.) Или …
  • сервер может проверить личность клиента (например, пользователь входит в клиентское приложение, которое отправляет данные для входа на сервер), обращаясь к базе данных авторизованных пользователей приложения, генерировать временные полномочия AWS, передать их обратно клиенту, и тогда клиент сможет напрямую позвонить в AWS. (Например, многие мобильные приложения делают это, чтобы общаться с Amazon S3.)

временные полномочия AWS может быть сгенерирован сервером, вызвав Сервис токенов безопасности AWS и указание разрешений и продолжительности поиска. Затем STS вернет набор ограниченных по времени учетных данных, которые имеют необходимые разрешения. Клиентское приложение может использовать эти учетные данные для вызова сервисов AWS (например, Amazon Polly согласно вашему примеру кода).

Таким образом, в клиентском коде не хранятся учетные данные, и сервер контролирует, разрешен ли клиенту доступ к AWS, какие вызовы API можно использовать и как долго следует предоставлять доступ.

1

Другие решения

Других решений пока нет …