amazon-web-services - 用于处理 AWS S3 中文件访问权限管理的 AWS 架构
问题描述
简而言之:授予和控制最终用户对存储在 S3 存储桶中的文件的访问权限的最佳方式是什么”,当有很多动态定义的“组”(超过 100 000 个)并且每个用户可以是几个“组”(超过 1000 个)的一部分时。
我在一个团队中,我们正在开发基于 AWS lambda 的产品,可通过 Web 应用程序访问。该产品采用微服务架构开发。为了解释我们的用例,假设我们有 3 个微服务:
- 用户服务,其实就是AWS Cognito(全平台处理用户和授权)
- 公司服务。由我们开发,基于 AWS Lambda 和 dynamoDB。管理公司信息(名称、人员和其他元数据,我不会在这里解释)
- 文件服务。我们需要开发的这项服务需要处理属于公司的文件。
在架构方面,我们在处理以下用例时有一些困难:
我们希望属于一家或多家公司的人可以访问该文档(文件)。这些人可能在公司内部担任某些角色(执行、人力资源、销售)。根据这些角色,人们可能只能访问公司文档的一部分。当然,不属于公司的人将无法访问该公司的文件。
为了处理此类用例,我们希望使用 AWS S3,并且如果可能的话,不要重新开发我们自己的可以代理 AWS S3 的微服务。
问题是:我们如何使用 AWS S3 为我们的用例管理权限?
我们研究了多种解决方案。
使用限制 S3 文件访问的 IAM 策略(WEB 应用程序直接访问 S3,无代理)。如果我们的 S3 存储桶是按公司名称/UUID(S3 根目录下的文件夹)组织的,我们可以考虑在每次创建公司时创建一个 IAM 策略并对其进行配置,以便公司中的每个用户都可以访问该公司文件夹,并且只有那个文件夹。
无法为每个公司创建一个存储桶,因为 AWS 将每个 AWS 账户的 S3 存储桶数量限制为 100 个(或 1000 个)。而我们的产品可能有1000多家公司
将用户放入组(组 == 1 家公司)是不可能的,因为每个用户池的组数是 500。
使用代理 AWS S3 调用的 lamda@edge 来验证 S3 中的文件 URI 是否已授权给请求的用户(用户属于公司并具有读取其文档的正确角色)。此 Lambda@edge 将调用内部服务以了解此用户是否有权从该公司获取文件(基于调用的 URL)
使用 AWS S3 预签名 URL。我们可以创建自己的文档服务,公开 CREATE、GET、DELETE api,在完成授权检查(用户属于公司)后联系 AWS S3 服务并生成预签名 URL 以上传或获取文件。然后用户(WebApp)将直接调用 S3。
事实上,如果我试图总结我们的问题,我们在使用 AWS lambda 开发的 AWS 产品中处理混合 RBAC 和授权控制以及将 AWS S3 暴露给最终用户时会遇到一些困难。
如果您对此类用例有经验或建议,我们将非常欢迎您提出建议。
解决方案
推荐阅读
- java - 如何在数组 Java 中使用 lambda
- azure - “无法连接 Net/http:TLS 握手超时”——为什么 Kubectl 无法连接到 Azure Kubernetes 服务器?(AKS)
- android - 在 Google Play >封闭测试版<应用程序中使用 Facebook 登录
- r - 在整洁的语料库 R 中快速搜索字符串
- momentjs - 如何使用 Momentjs 从特定日期查找前一个工作日(周日、周一等)
- npm - 500 内部服务器错误:npm@latest
- sql - 使用两组标准连接两个数据库
- php - Laravel Slack 通知,开始一个线程
- c# - C# Exchange - 将消息转发为
- c# - C# LinqToTwitter - 大多数推文返回空媒体实体