2

我们有一个发电机表,用于我们应用程序的安全敏感部分,具有非常严格的读取访问限制(在此处尽可能严格)。理想情况下,我们希望将对该表的访问限制为仅具有匹配 cognito-userId 前导键的行(遵循这种方法:https ://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_rows.html )。不幸的是,我们的要求是 lambda 函数需要代表用户读取值,以便随后处理并将值发送给用户(例如通过邮件)。

我们当前的设置如下所示:我们使用该主键 IAM 条件创建了 IAM 规则,并将其附加到一个用户组,该用户组包括将访问该表的所有用户。到目前为止一切顺利,lambda 函数从上下文对象中获取规则并承担该角色(通过 sts:assumeRole,就像这样,尽管它们都在同一个帐户中:https ://aws.amazon.com/premiumsupport/ Knowledge-center/cognito-user-pool-group/ , https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-assume-iam-role/ ) lambda 和假定的角色都有必要的政策,所以这也可以按预期工作。使用静态值进行测试,如下所示:

ForAllValues:StringEquals: 
  dynamodb:LeadingKeys: 
    - "SOMEKEY"

还要确认正在传递所有必需的凭据,正在承担角色,直到这里一切正常。

${cognito-identity.amazonaws.com:sub}不幸的是,当实际用作前导键标识符时,无论有无 aws-region 前缀,它都会停止工作。因此我的问题是,以前有人遇到过这种情况吗?什么时候用这个变量代替 IAM 规则?它是在传递给 lambda 函数之前被解析(在这种情况下,我们希望填充该值)还是在 lambda 访问 dynamo 时被替换(在这种情况下,它没有被解析,因为 lambda 而不是 cognito-user担任角色)?有没有办法减轻这种情况?任何帮助将不胜感激

4

1 回答 1

2

${cognito-identity.amazonaws.com:sub} 从身份池中引用 Cognito 的身份 ID。因此,当您的应用程序使用身份池获取 AWS 临时凭证时,这些凭证将包含用户身份 ID。如果您的应用程序随后尝试从数据库中获取一行,则用户只能获取他们的行,即以其身份 ID 作为前导键的行。

因此,您可以将 Cognito ID 令牌传递给您的 Lambda,然后将 ID 令牌传递给身份池以获取凭证,而不是在 lambda 函数中假设 IAM 角色,而是使用 sts 假设角色。然后 SDK 可以假定这些凭据,并且向 Dynamo 发出的请求将使用 ${cognito-identity.amazonaws.com:sub}。

关于这种方法,有一点要提一下,从身份池获得的凭据有效期为一小时,因此我相信有必要实施一个缓存层来重用现有凭据,以避免在每次调用时从身份池请求新凭据。

希望有帮助。

于 2020-06-23T16:37:13.000 回答