如何使用aws凭据安全地签署请求?

时间:2017-04-25 19:56:35

标签: php python security amazon-web-services boto

我不完全确定这是否是我应该问的问题所以请随时提交修改。

我正在开发一个桌面应用程序,我计划分发并使用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()

1 个答案:

答案 0 :(得分:1)

为人们提供访问AWS上存储的AWS服务和资源的正确方法是采用客户端/服务器方法。

您的案例中的客户端是桌面应用程序,但它同样可以是移动应用程序或Web应用程序。客户端基本上是不受信任的,不应获得任何访问AWS的凭据。

服务器是在某个地方运行的应用程序(通常在Amazon EC2或AWS Lambda上),它接收来自客户端的请求,应用业务逻辑(例如验证用户的身份并确定哪些操作他们被允许参加)并调用AWS服务。

然后有两种方法可以调用AWS:

  • 服务器可以对AWS进行所有调用(使用仅可用于服务器的凭据)并将结果传回客户端。这将客户端与AWS隔离,并允许您在服务器中插入自定义业务逻辑。 (例如,当您使用Netflix时,您的电视不会直接呼叫AWS。)或者......
  • 服务器可以通过查询授权应用程序用户的数据库来验证客户端的身份(例如,用户登录到客户端应用程序,后者将登录详细信息发送到服务器),生成临时AWS凭证,将它们传递回客户端,然后客户端可以直接调用AWS。 (例如,许多移动应用程序都会与Amazon S3交谈。)

服务器可以通过调用AWS Security Token Service并指定所需的权限和持续时间来生成临时AWS凭证。然后,STS将返回一组具有所需权限的限时凭证。客户端应用程序可以使用这些凭据来调用AWS服务(例如,根据您的代码示例,使用Amazon Polly)。

这样,客户端代码中不会存储任何凭据,服务器会控制是否允许客户端访问AWS,可以使用哪些API调用以及应该授予访问权限。