首页 > 解决方案 > 用于处理 AWS S3 中文件访问权限管理的 AWS 架构

问题描述

简而言之:授予和控制最终用户对存储在 S3 存储桶中的文件的访问权限的最佳方式是什么”,当有很多动态定义的“组”(超过 100 000 个)并且每个用户可以是几个“组”(超过 1000 个)的一部分时。

我在一个团队中,我们正在开发基于 AWS lambda 的产品,可通过 Web 应用程序访问。该产品采用微服务架构开发。为了解释我们的用例,假设我们有 3 个微服务:

在架构方面,我们在处理以下用例时有一些困难:

我们希望属于一家或多家公司的人可以访问该文档(文件)。这些人可能在公司内部担任某些角色(执行、人力资源、销售)。根据这些角色,人们可能只能访问公司文档的一部分。当然,不属于公司的人将无法访问该公司的文件。

为了处理此类用例,我们希望使用 AWS S3,并且如果可能的话,不要重新开发我们自己的可以代理 AWS S3 的微服务。

问题是:我们如何使用 AWS S3 为我们的用例管理权限?

我们研究了多种解决方案。

  1. 使用限制 S3 文件访问的 IAM 策略(WEB 应用程序直接访问 S3,无代理)。如果我们的 S3 存储桶是按公司名称/UUID(S3 根目录下的文件夹)组织的,我们可以考虑在每次创建公司时创建一个 IAM 策略并对其进行配置,以便公司中的每个用户都可以访问该公司文件夹,并且只有那个文件夹。

  2. 无法为每个公司创建一个存储桶,因为 AWS 将每个 AWS 账户的 S3 存储桶数量限制为 100 个(或 1000 个)。而我们的产品可能有1000多家公司

  3. 将用户放入组(组 == 1 家公司)是不可能的,因为每个用户池的组数是 500。

  4. 使用代理 AWS S3 调用的 lamda@edge 来验证 S3 中的文件 URI 是否已授权给请求的用户(用户属于公司并具有读取其文档的正确角色)。此 Lambda@edge 将调用内部服务以了解此用户是否有权从该公司获取文件(基于调用的 URL)

  5. 使用 AWS S3 预签名 URL。我们可以创建自己的文档服务,公开 CREATE、GET、DELETE api,在完成授权检查(用户属于公司)后联系 AWS S3 服务并生成预签名 URL 以上传或获取文件。然后用户(WebApp)将直接调用 S3。

事实上,如果我试图总结我们的问题,我们在使用 AWS lambda 开发的 AWS 产品中处理混合 RBAC 和授权控制以及将 AWS S3 暴露给最终用户时会遇到一些困难。

如果您对此类用例有经验或建议,我们将非常欢迎您提出建议。

标签: amazon-web-servicesamazon-s3rbacaws-serverlessserverless-architecture

解决方案


我正在回答我的问题,向您展示我们的最终决定。

我们选择了基于预签名 URL 的解决方案,这将让我们:

  • 独立于 AWS S3(可以从 S3 更改为另一种文件存储服务而无需太多成本)
  • 没有将 S3 API 暴露给我们的客户端(Web 应用程序),而只是 Web 应用程序可以进行本地上传或下载文件的 URL
  • 权限管理在服务本身(doc-service)内部完成,授权完成后将生成预签名 URL
  • 做权限管理的信息来自Cognito(认证)和公司服务(授权)

Bellow,一个基于 AWS lambda 的架构图:

架构图


推荐阅读