首页 > 解决方案 > AWS Cognito 组管理限制

问题描述

我正在编写一个系统监控工具,它将使用 Lambda 定期收集用户指定端点上的指标,将结果存储在 Dynamo 中,然后允许用户通过一个反应应用程序获取指标,该应用程序将调用另一个 Lambda 实例以从 Dynamo 检索数据。查询最终将针对分配给每个用户指定的监视器的 UID 进行,该 UID 将对日期时间和监视器 ID 的 GSI 进行查询。

我一直在寻找 Cognito 作为我的用户商店。我的目标是在监视器 UID 级别上定义权限,以允许用户只能访问他们的监视器。我正在考虑为每个监视器创建一个组,然后将其分配给创建用户。然后,该组将位于 Cognito 在登录时提供的 JWT 令牌中,该令牌将用于授权 Lambda 调用。

我的问题是:

注意:我提出这个模型的主要原因是它是无状态的、细粒度的,不需要为每个查询进行权限查找,并且不需要单个记录具有授权意识。

标签: node.jsamazon-web-servicesaws-lambdaamazon-dynamodbamazon-cognito

解决方案


我不确定这是否完全适合您的用例,但细粒度访问的一个非常干净的解决方案是利用基于 Cognito 子 ID 的访问策略。例如,这是使用 S3 前缀执行此操作的 AWS 文档,以便模拟具有用户目录的文件系统。例如

{
    "Sid": "ListYourObjects",
    "Effect": "Allow",
    "Action": "s3:ListBucket",
    "Resource": ["arn:aws:s3:::bucket-name"],
    "Condition": {
        "StringLike": {
            "s3:prefix": ["cognito/application-name/${cognito-identity.amazonaws.com:sub}"]
        }
    }
},
{
    "Sid": "ReadWriteDeleteYourObjects",
    "Effect": "Allow",
    "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
    ],
    "Resource": [
        "arn:aws:s3:::bucket-name/cognito/application-name/${cognito-identity.amazonaws.com:sub}",
        "arn:aws:s3:::bucket-name/cognito/application-name/${cognito-identity.amazonaws.com:sub}/*"
    ]
}

如果您知道监视器只能由一个用户访问,并且您可以根据 Cognito 子 ID 授予每个监视器的权限,那么这可能是您最干净的方法。


推荐阅读