限制 S3 对象访问权限只给特定的 Cognito 用户

13

我正在开发一个应用程序,用于管理存储在S3中的已购买文件的访问。我按产品将文件组织在S3中,例如:

my-bucket
  ├── product-a
  │     ├── file-1
  │     ├── file-2
  │     └── file-3
  ├── product-b
  │     ├── file-1
  │     ├── file-2
  │     └── file-3
  └── etc...

我还在使用Cognito来管理用户身份和认证。我想创建一个IAM角色,所有用户都将扮演这个角色,该角色将仅授予他们访问已购买产品文件的权限。应该如何正确实现?我已经阅读了Cognito的文档,但感觉自己还没有完全理解。

这个示例中,我看到我可以为每个用户提供对其自己的存储桶中文件的访问权限,但那样我就必须将文件复制到每个用户的文件夹中,这似乎既低效又容易出错。

{
  "Version": "2012-10-17",
   "Statement": [
   {
     "Effect": "Allow",
     "Action": ["s3:ListBucket"],
     "Resource": ["arn:aws:s3:::my-bucket"],
      "Condition": {"StringLike": {"s3:prefix": ["cognito/myapp/"]}}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket/myapp/${cognito-identity.amazonaws.com:sub}",
        "arn:aws:s3:::my-bucket/myapp/${cognito-identity.amazonaws.com:sub}/*"
      ]
    }
  ]
}

但是我希望创建一个策略,只有当用户购买了 product-a 并且在该用户的 Cognito 同步数据中包含某个标志时,才能授予用户访问该文件夹的权限。

这种情况是否可行?或者我没有使用正确的工具?我认为这应该是一个常见的用例。


你的用户基础使用什么身份提供者,Cognito用户池/Facebook/Google或其他?它有特定的声明吗? - Rachit Dhall
我正在使用用户池。所以,是的,我会得到带有声明的令牌。这会对我有帮助吗? - sethro
@sethro,你找到解决方案了吗?我正在尝试构建一个类似的系统。谢谢。 - Nick Ager
2
@NickAger,我没有。我最终采取的方法是,当用户请求访问服务器确定他们有权限访问的文件时,由服务器生成临时预签名URL。仍然不确定这是否可以通过Cognito完成,但我放弃了。 - sethro
1
@sethro或其他人有没有找到解决方案? - Lonergan6275
有什么解决方案吗? - Aman Gupta
2个回答

2
在我的使用场景中,这是可能的,因为以下原因:
  1. 我将文件上传到S3
  2. 我有一个监听S3事件的Lambda函数,它解释了创建的文件并在DynamoDB(我们应用程序的数据库引擎)中创建一个条目。但是,此条目包含一个访问该文件的URL,该URL不是S3 URL。相反,它是一个API网关URL,代理请求并具有自定义Lambda授权器。然后,这个Lambda授权器通过查看Cognito令牌来验证用户访问,并允许我为其他用户添加完全细粒度的访问权限,同时仍然允许核心用户/所有者直接使用S3 SDK客户端管理文件,并附加正确的Cognito身份角色以获取Bucket权限。
  3. 然后用户在请求中带有Authorization Cognito令牌头请求此图像,这由API网关处理并返回相关响应。

0
一种可能的解决方案是使用Aws Presigned URLs 在这里阅读更多。其思想是请求一个临时URL,以便在过期时间内访问特定的s3对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接