1

我正在实现一个支持群聊的 iOS 应用程序,用户可以在其中添加照片和其他文件。

决定使用 AWS S3 作为存储后端,使用 Cognito Federated Identities 对上传/下载进行身份验证 - 向/从 S3 抽取数据,而不是通过我们的服务器。

至今

我的实现允许用户/身份上传和下载到他们自己在 S3 存储桶上的文件夹(示例策略arn:aws:s3:::mybucket/users/${cognito-identity.amazonaws.com:sub}/*变量是 identityID/user_id)。

然而

我一直无法找到一种安全方式,只允许群聊中的参与者从 S3 上的群聊文件夹上传/下载。

有任何想法吗?

关于可能流程的一些想法:

  1. 首先,用户将照片上传到自己的文件夹,[我知道怎么做]
  2. 然后,系统将照片复制到群聊的文件夹中[我知道怎么做]
  3. 将群聊文件夹与参与者的身份相关联[不确定如何- 可能有数千个群组和参与者]
    • 编辑 1:正如@MyStackRunnethOver 所建议的那样,可以使用一个 IAM 角色/凭据来管理用户(属于所述组)的所有上传/下载请求[如果凭据受损,则存在重大安全问题]。
  4. 编辑 1:可以使用预签名 URL:文件上传到用户自己的文件夹,预签名 URL 存储在群聊条目中 [尽管最大url-life 7 天]
    • 客户端缓存有助于参与者频繁加入/离开组
    • 需要服务器端计划作业来更新过期的预签名 URL

任何赞扬/想法表示赞赏

4

1 回答 1

1

你的问题归结为:

“鉴于用户是组的一部分,如何根据组成员身份授予用户访问组特定子目录的权限?”

在我看来,您有两个选择:

  1. 为每个用户提供他们所属的所有目录的“密钥”。这可能意味着为每个组的该用户添加权限,或者为他们提供对每个组的新 IAM 角色的访问权限。这就是“想出一种为 S3 提供细粒度权限的方法”策略。

  2. 不要分发任何特定于目录的密钥。相反,当用户请求某个目录时,请检查他们是否在该目录所属的组中。这就是“围绕S3构建细粒度数据存储系统”的策略。

我推荐后一种方法,因为不是每个用户或每个组都有一个 IAM 角色或一个凭证,而是为所有用户提供一个凭证:发出 S3 包装器请求所需的凭证。如果您跟踪您的用户所在的组,您的包装器需要做的就是检查user -> groups映射以查看是否应满足请求。前端可以使用相同的映射来美化 UI:用户只能看到从他们所属的组上传/下载的选项。在这种情况下,我会将映射设想为一个 Dynamo 表,每当用户注册、加入组、离开组或删除他们的帐户时,该表都会更新。您可以通过用户的 Cognito 凭据来识别您的用户,其中包括用户特定的字段。

于 2020-03-04T18:51:18.940 回答