使用IAM进行用户身份验证

时间:2012-11-23 23:01:05

标签: django amazon-s3 amazon-web-services boto amazon-iam

我已经阅读了大量的帖子,这些帖子涉及我认为应该是一个非常常见的用例 - 但却没有找到我想要的内容,或者为什么无法完成它的简单原因。

我在S3上有一些文件。我希望能够通过我构建的前端授予某些用户访问某些文件的权限。

到目前为止,我已经这样做了:

  • 我在Django中构建了前端,使用它的内置用户和组
  • 我有一个Buckets模型,我在其中镜像我的S3桶。
  • 我有一个m2m关系,从组到表示S3权限的存储桶。
  • 用户登录并对Django的用户进行身份验证。
  • 我从Django获取了允许用户查看的存储桶列表
  • 我使用boto从这些存储桶中获取文件链接列表并显示给用户。

这是有效的,但并不理想,也感觉不对。我必须保留桶的镜像,当AWS已经内置了所有内容时,我还必须维护自己的用户/密码和权限列表。

我真正想要的是简单地在IAM中创建用户并在IAM中使用组权限来控制对S3存储桶的访问。没有重复的数据或功能。我的应用程序将从用户请求UN / PW并使用它连接到IAM / S3以提取存储桶和文件列表,然后显示指向用户的链接。简单。

我怎么能,或为什么不能?

我是以错误的方式看待这个吗?

"对"是什么?解决这个问题的方法(我假设)是非常常见的用例?

2 个答案:

答案 0 :(得分:1)

你的想法是正确的,让我们来看看替代方案:

  1. 您的应用会存储所有用户的api密钥和密码,并将所有内容委托给AWS IAM权限系统。 虽然在架构上更简单的解决方案,细节可以杀死它。 您的应用应该非常安全,并以非常安全的方式托管秘密API密钥。 这实际上取决于用例:

    • 如果交互式用户完成了所有工作 - 那么您的系统可以使用用户密码存储加密密钥,并在登录过程中对其进行解密。这意味着,如果您的数据库遭到入侵 - 没有足够的信息来破坏密钥。
    • 如果系统需要执行后台非交互式内容,则需要开发复杂的过程以便安全地存储此信息。 RightscaleDome9等公司已经开发了这类流程。 除非您的团队中有安全专家,否则不建议使用此选项。
  2. 您的应用使用单个“强”api密钥连接到AWS - 但如果允许特定用户对该资源执行该操作,则查询AWS API。 可悲的是,我不熟悉类似的AWS api - 所以也许其他一些读者想对此发表评论。 这(如果可能的话)将是最简单和最安全的解决方案。

  3. 扩展现有解决方案以使用存储在AWS上的数据:用户,组,用户 - >分组,并使用用户/组策略作为权限检查的数据源。 通过这种方式,您可以与AWS进行一些逻辑重复(这很好),但不会出现数据重复,这是真正的痛苦。

答案 1 :(得分:1)

您应该考虑使用Amazon Cognito(2014年发布)为您的用户创建唯一身份,并对其进行身份验证,以便安全访问您的AWS资源,如Amazon S3或DynamoDB。

您可以利用AWS IAM身份,自定义开发者身份,亚马逊IAM,Facebook,Twitter,Google或任何OpenID Connect兼容提供商等公共身份提供商。

这是一个如何使用Amazon Cognito的高级架构 enter image description here

此处的常见问题解答 - https://aws.amazon.com/cognito/faqs/