aws cognito - 允许群聊参与者访问 s3 存储桶
aws cognito - allow group-chat participants access to s3 bucket
我正在实施一个 iOS 支持群聊的应用程序,用户可以在其中添加照片和其他文件。
决定将 AWS S3 作为存储后端,使用 Cognito Federated Identities 进行身份验证 upload/downloads - 数据泵送 to/from S3,而不是通过我们的服务器。
到目前为止
我的实现允许 user/identity 上传和下载到他们在 S3 存储桶上自己的文件夹(示例策略 arn:aws:s3:::mybucket/users/${cognito-identity.amazonaws.com:sub}/*
变量是 identityID/user_id)。
但是
我一直无法找到一种安全的方式,只允许群聊中的参与者从 S3 上的群聊文件夹 upload/download。
有什么想法吗?
关于可能流程的一些想法:
- 首先,用户将照片上传到自己的文件夹,[我知道怎么做]
- 然后,系统将照片复制到群聊的文件夹中[我知道怎么做]
- 将群组聊天文件夹与参与者的身份相关联[不确定如何 - 可能有数千个群组和参与者]
- 编辑 1:正如@MyStackRunnethOver 建议的那样,可以使用一个 IAM role/credential 来管理所有 upload/download 用户请求(属于该组) [严重的安全问题 如果凭据被泄露 ]。
- 编辑 1:可以使用预签名 URL:文件上传到用户自己的文件夹,预签名 url 存储在群聊条目中 [最大 url-生命7天不过]
- 客户端缓存有助于参与者 join/leave 一组频繁
- 需要服务器端计划作业来更新过期的预签名 URL
任何commends/ideas赞赏
您的问题归结为:
"Given that users are part of groups, how can I give users access to group-specific subdirectories based on group membership?"
据我所知,您有两个选择:
为每个用户提供 "key" 访问他们所属的所有目录的权限。这可能意味着为每个组向该用户添加权限,或者为他们提供对每个组的新 IAM 角色的访问权限。这就是"come up with a way to have fine-grained permissions for S3"策略。
不要分发任何目录特定的密钥。相反,当用户请求某个目录时,检查他们是否在该目录所属的组中。这就是"build a fine-grained data storage system around S3"策略。
我推荐后一种方法,因为不是每个用户或每个组都有一个 IAM 角色或凭据,而是给 所有 你的用户一个凭据:创建所需的凭据您的 S3 包装器的请求。如果您跟踪您的用户所在的组,您的包装器需要做的就是检查 user -> groups
映射以查看是否应满足请求。前端可以使用相同的映射来美化 UI:仅向用户显示从他们所属的组上传/下载的选项。在这种情况下,我会将映射设想为 Dynamo table,每当用户注册、加入群组、离开群组或删除他们的帐户时都会更新。您可以通过他们的 Cognito 凭据来识别您的用户,其中包括用户特定的字段。
我正在实施一个 iOS 支持群聊的应用程序,用户可以在其中添加照片和其他文件。
决定将 AWS S3 作为存储后端,使用 Cognito Federated Identities 进行身份验证 upload/downloads - 数据泵送 to/from S3,而不是通过我们的服务器。
到目前为止
我的实现允许 user/identity 上传和下载到他们在 S3 存储桶上自己的文件夹(示例策略 arn:aws:s3:::mybucket/users/${cognito-identity.amazonaws.com:sub}/*
变量是 identityID/user_id)。
但是
我一直无法找到一种安全的方式,只允许群聊中的参与者从 S3 上的群聊文件夹 upload/download。
有什么想法吗?
关于可能流程的一些想法:
- 首先,用户将照片上传到自己的文件夹,[我知道怎么做]
- 然后,系统将照片复制到群聊的文件夹中[我知道怎么做]
- 将群组聊天文件夹与参与者的身份相关联[不确定如何 - 可能有数千个群组和参与者]
- 编辑 1:正如@MyStackRunnethOver 建议的那样,可以使用一个 IAM role/credential 来管理所有 upload/download 用户请求(属于该组) [严重的安全问题 如果凭据被泄露 ]。
- 编辑 1:可以使用预签名 URL:文件上传到用户自己的文件夹,预签名 url 存储在群聊条目中 [最大 url-生命7天不过]
- 客户端缓存有助于参与者 join/leave 一组频繁
- 需要服务器端计划作业来更新过期的预签名 URL
任何commends/ideas赞赏
您的问题归结为:
"Given that users are part of groups, how can I give users access to group-specific subdirectories based on group membership?"
据我所知,您有两个选择:
为每个用户提供 "key" 访问他们所属的所有目录的权限。这可能意味着为每个组向该用户添加权限,或者为他们提供对每个组的新 IAM 角色的访问权限。这就是"come up with a way to have fine-grained permissions for S3"策略。
不要分发任何目录特定的密钥。相反,当用户请求某个目录时,检查他们是否在该目录所属的组中。这就是"build a fine-grained data storage system around S3"策略。
我推荐后一种方法,因为不是每个用户或每个组都有一个 IAM 角色或凭据,而是给 所有 你的用户一个凭据:创建所需的凭据您的 S3 包装器的请求。如果您跟踪您的用户所在的组,您的包装器需要做的就是检查 user -> groups
映射以查看是否应满足请求。前端可以使用相同的映射来美化 UI:仅向用户显示从他们所属的组上传/下载的选项。在这种情况下,我会将映射设想为 Dynamo table,每当用户注册、加入群组、离开群组或删除他们的帐户时都会更新。您可以通过他们的 Cognito 凭据来识别您的用户,其中包括用户特定的字段。