我们有一个发电机表,用于应用程序的安全敏感部分,具有相当严格的读取访问限制(旨在尽可能严格)。理想情况下,我们希望将对表的访问限制为具有匹配的 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-identity.amazonaws.com:sub} 正在引用身份池中的 Cognito 身份 ID。因此,当您的应用程序使用身份池获取AWS临时凭证时,这些凭证将包含用户的身份ID。如果您的应用程序尝试从数据库中获取行,则用户只能获取他们的行,即以其身份 ID 作为主键的行。
因此,您可以使用 sts 承担角色,将 Cognito ID token 传递到 Lambda,然后将 ID token 传递到身份池以获取凭证,而不是在 lambda 函数中承担 IAM 角色。然后,SDK 可以采用这些凭据,并向 Dynamo 发出的请求将使用 ${cognito-identity.amazonaws.com:sub}。
关于这种方法需要提到的一点是,从身份池获取的凭据有效期为一小时,因此我认为有必要实现缓存层来重用现有凭据,以避免每次调用时都从身份池请求新凭据。
希望有帮助。
关于amazon-web-services - Lambda 能否承担具有认知 userId 条件的 IAM 角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62538806/