如何在我的python应用程序中保护我的AWS访问ID和密钥

时间:2012-03-29 13:54:40

标签: python amazon-web-services

我正在使用Python创建应用程序并在某些模块中使用Amazon Web Services。

我现在正在硬编码我的AWS访问ID和* .py文件中的密钥。或者将来可能会将它们移出到配置文件中。

但是有一个问题,我如何从其他人那里保护AWS信息?据我所知,python是一种易于解编译的语言。

有办法做到这一点吗?


我正在制作的应用是帮助用户从云端上传/下载内容。我正在使用Amazon S3作为云存储。我知道Dropbox也使用S3,所以我想知道他们如何保护密钥。


经过一天的研究,我找到了一些东西。 我现在正在使用boto(用于python的AWS库)。我可以使用'generate_url(X)'函数来获取应用程序访问S3中对象的URL。该网址将在X秒内过期。 所以我可以为我的应用程序构建一个Web服务,为他们提供网址。 AWS密钥不会设置到应用程序中,而是设置到Web服务中。

听起来不错,但到目前为止我只能用这个功能下载对象,上传不起作用。任何机构都知道如何使用它进行上传?


有没有人知道如何使用boto的key.generate_url()来获取用于将内容上传到S3的临时网址?

4 个答案:

答案 0 :(得分:9)

如果您要分发代码,则无法保护您的密钥。任何有权访问您的服务器或源代码的人都可以访问它们。

您可以采取两项措施来保护自己免遭恶意使用密钥。

  1. 使用amazon IAM服务创建一组密钥,这些密钥仅具有执行脚本所需任务的权限。 http://aws.amazon.com/iam/

  2. 如果您有移动应用或其他需要用户帐户的应用,您可以创建服务以为每个用户创建临时令牌。用户必须拥有有效的令牌和密钥才能执行任何操作。如果您想阻止用户使用您的密钥,您可以停止为他们生成新的令牌。 http://awsdocs.s3.amazonaws.com/STS/latest/sts-api.pdf


  3. 如果您正在创建允许人们上传内容的应用程序,请专门针对S3。保护您的帐户和其他用户信息的唯一方法是让他们在您注册帐户。

    1. 该应用程序的第一步是对您的服务器进行身份验证。
    2. 一旦您的服务器进行身份验证,您就向amazons令牌服务器发出请求并返回令牌
    3. 然后,您的应用程序使用exe和令牌中内置的键发出请求。
    4. 根据应用于此用户的权限,他只能上传到分配给他的存储区。
    5. 如果这看起来相当困难,那么您可能还没准备好设计一个可以帮助用户将数据上传到S3的应用程序。如果您只分发1个密钥,即使您可以隐藏用户可以编辑任何用户添加的任何数据的密钥,您也会遇到严重的安全问题。

      解决此问题的唯一方法是让每个用户创建自己的AWS账户,您的应用程序将帮助他们将文件上传到他们的S3账户。如果是这种情况,那么您不必担心保护密钥,因为用户在安装应用程序后将负责添加自己的密钥。

答案 1 :(得分:1)

我一直试图回答同样的问题...... generate_url(x)看起来很有希望。

This link有一个关于创建云端源访问标识的建议,我猜测它可以用于IAM身份验证...这意味着您可以为每个应用程序创建一个密钥,而不会泄露您的主要帐户详细信息。使用IAM,您可以根据密钥设置权限,以便他们可以执行的操作,因此他们可以进行有限的访问。

注意: 我不知道这是否真的有用,我还没有尝试过,但它可能是另一种探索途径。

  

2 - 创建Cloudfront“Origin Access Identity”

     

此身份可以重复用于许多不同的发行版和密钥对。它只用过   允许cloudfront访问您的私有S3对象而不允许   大家。截至目前,此步骤只能使用API​​执行。   Boto代码在这里:

# Create a new Origin Access Identity
oai = cf.create_origin_access_identity(comment='New identity for secure videos')

print("Origin Access Identity ID: %s" % oai.id)
print("Origin Access Identity S3CanonicalUserId: %s" % oai.s3_user_id)

答案 2 :(得分:1)

您说得对,您无法使用预先签名的网址上传。

您可以使用名为GetFederationToken的不同,更复杂的功能。这将返回一些临时凭证,您可以应用任何您喜欢的策略(权限)。

例如,您可以编写一个在S3中创建新文件夹的Web服务POST /upload,然后创建具有PutObject权限的临时凭证到此文件夹,并返回该文件夹呼叫者的路径和凭据。据推测,这种方法也会进行一些授权检查。

您无法在应用程序代码中嵌入云凭据或任何其他凭据。这并不是说没有人偶然做到这一点,even security professionals

要将凭据安全地分发到基础架构,您需要工具支持。如果您使用像CloudFormation这样的AWS工具,您可以(更多)安全地为其提供凭据。 CloudFormation还可以即时创建新凭据。如果您使用像Heroku这样的PaaS,您可以将凭据加载到其中,而Heroku可能会认真对待它们。 AWS的另一个选择是IAM角色。您可以创建具有执行所需操作权限的IAM角色,然后将角色“传递”到EC2实例。它将能够执行角色允许的操作。

最终选项是专用的秘密管理服务,例如Conjur。 (免责声明:我是该公司的创始人)。您将凭据和其他机密加载到专用虚拟设备中,并定义管理修改和分发凭据的访问权限。这些权限可以授予人员或“机器人”,如EC2框。可以通过REST或客户端API检索凭据,并且每次与凭证的交互都会记录到永久记录中。

答案 3 :(得分:0)

请勿将其放入您计划分发的应用程序中。它将是可见的,并且它们可以启动直接向您收费或最差的实例。如果您在生产中使用它,它们可以删除实例。

我会查看您的程序设计并认真质疑为什么我需要在应用程序中包含该信息。如果您发布有关设计的更多详细信息,我相信我们可以帮助您找到一种不需要捆绑此信息的方法。