【问题标题】:Give Lambda fine grained access to DynamoDB based on Cognito Credentials基于 Cognito 凭证为 Lambda 提供对 DynamoDB 的细粒度访问
【发布时间】:2019-12-06 06:44:38
【问题描述】:

我目前有许多查询 DynamoDB 的 Lambda。 Lambda 通过配置为使用 AWS_IAM 授权的 API Gateway REST API 公开/调用。

我的 Cognito 用户池目前正在根据各种信息分配不同的 IAM 角色,最重要的是,IAM 角色限制了对 DynamoDB 上与用户的 Cognito 身份 ID 匹配的特定行的访问。这些角色按预期工作,当直接查询 DynamoDB 时,这些角色只允许用户读取自己的行。

但是,在将数据返回给用户之前,我需要进行一些操作,因此我目前让 lambda 执行查询,而不是直接访问 dynamo。 lambda 显然配置了它自己的 Lambda 执行角色,该角色目前提供对整个数据库的读取访问权限。

但是,我要做的是通过 Api 网关将用户 Cognito 凭据传递给 Lambda,然后让 lambda 在进行 dynamo 查询之前承担登录用户的 IAM 角色,从而只允许 Lambda 读取来自 DynamoDB 中用户自己的行。

我花了几天时间尝试从 AWS_IAM 授权到 Cognito 用户池授权以及我在网上找到的任何其他想法,但我从未真正设法让 Lambda 担任该角色。

目前我为 Api Gateway 方法启用了“使用调用者凭据调用”,并且我的代码正在从事件中读取 Cognito 身份 ID,如下所示:

const cognitoIdentityId = event.requestContext.identity.cognitoIdentityId`

不过,我将其传递给 Dynamo 查询

1) 我不确定这是否足够安全/是否允许某人操纵请求以访问其他人的数据。

2) 我不是专家,但“感觉”我应该为此使用细粒度的 IAM 角色,而不是仅仅依靠我的 Dynamo 查询是否正确

如果有人可以建议我是否以正确的方式处理这个问题,或者是否有可能,或者是否有更好的方法会很棒。

谢谢!

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-cognito


    【解决方案1】:

    您可以获取您的 cognito 身份的临时凭证,以获取临时访问密钥、秘密密钥和会话密钥。这些将在一个小时后过期,就像访问和 id 令牌一样。但是您可以使用这些凭据让 lambda 代入您登录用户的角色。您可以找到获取这些凭据的文档here

    【讨论】:

    • 感谢您的回复。这听起来像是我想要实现的目标,但我不清楚如何通过 Api Gateway 将令牌传递到 Lambda。目前我正在使用 AWS_IAM 身份验证,我只能访问 Cognito 身份 ID。我也不确定 1)如果这是以这种方式传递令牌的好习惯,以及 2)这是否是实现我想要的最佳方式。
    • 您可以将 idtoken 传递给 Api 网关。然后使用 GetCredentialsForIdentity API 通过传递身份池 id 和 id 令牌来获取用户的临时凭证。 docs.aws.amazon.com/cognitoidentity/latest/APIReference/…
    • 好的,很好。感谢您的澄清。是否有使用 Amplify 和 Api Gateway 执行此操作的“内置”方式?还是我应该手动将令牌作为“IDToken”标头添加到每个请求中? (我假设我不能使用 Authorization 标头,因为这是 Api Gateway 层的 AWS_IAM 身份验证所必需的?)
    • 您可以手动添加 idtoken。它非常安全,因为无论如何它都会在一个小时内到期。您可以将身份池 ID 作为环境变量保存在 lambda 中。
    • 太棒了。我会试试看!感谢您的所有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2016-05-10
    • 2021-01-03
    • 2021-10-01
    • 2016-12-08
    • 2017-09-16
    • 2021-12-23
    相关资源
    最近更新 更多